From a5d803b7efde22b8d26a8d8e3044c13281a3ea9a Mon Sep 17 00:00:00 2001 From: Mark Adler Date: Sun, 18 Mar 2012 14:52:31 -0700 Subject: [PATCH] Attempt to convert the wchar_t path in gzopen_w() for errors. The conversion to multi-byte will be locale-specific, but it's better than nothing and is only to provide more information in the error message returned by gz_error(). The conversion has no effect on what's opened. --- gzlib.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/gzlib.c b/gzlib.c index e4908e0..ca55c6e 100644 --- a/gzlib.c +++ b/gzlib.c @@ -94,6 +94,7 @@ local gzFile gz_open(path, fd, mode) const char *mode; { gz_statep state; + size_t len; int oflag; #ifdef O_CLOEXEC int cloexec = 0; @@ -185,13 +186,29 @@ local gzFile gz_open(path, fd, mode) } /* save the path name for error messages */ -# define WPATH "" - state->path = malloc(strlen(fd == -2 ? WPATH : path) + 1); +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen(path); + state->path = malloc(len + 1); if (state->path == NULL) { free(state); return NULL; } - strcpy(state->path, fd == -2 ? WPATH : path); +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif + strcpy(state->path, path); /* compute the flags for open() */ oflag =