diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 90c031fcc..ed681b59e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2008-05-20 Corinna Vinschen + + * path.cc (path_conv::check): Free wide_path and normalized_path if + necessary. + * path.h (path_conv::path_conv): Set wide_path, normalized_path and + normalized_path_size to 0 in all constructors. + 2008-05-19 Corinna Vinschen * syscalls.cc (rename): Allocate temporary path buffers using diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 1c1217d9d..bdaead55d 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -812,10 +812,14 @@ path_conv::check (const char *src, unsigned opt, path_flags = 0; known_suffix = NULL; fileattr = INVALID_FILE_ATTRIBUTES; + if (wide_path) + cfree (wide_path); wide_path = NULL; case_clash = false; memset (&dev, 0, sizeof (dev)); fs.clear (); + if (!normalized_path_size && normalized_path) + cfree (normalized_path); normalized_path = NULL; int component = 0; // Number of translated components diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index ab6dda79a..e09507c80 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -206,35 +206,42 @@ class path_conv void check (const char *src, unsigned opt = PC_SYM_FOLLOW, const suffix_info *suffixes = NULL) __attribute__ ((regparm(3))); - path_conv (const device& in_dev): fileattr (INVALID_FILE_ATTRIBUTES), - wide_path (NULL), path_flags (0), known_suffix (NULL), error (0), - dev (in_dev) - { - strcpy (path, in_dev.native); - } + path_conv (const device& in_dev) + : fileattr (INVALID_FILE_ATTRIBUTES), wide_path (NULL), path_flags (0), + known_suffix (NULL), error (0), dev (in_dev), normalized_path (NULL), + normalized_path_size (0) + { + strcpy (path, in_dev.native); + } path_conv (int, const char *src, unsigned opt = PC_SYM_FOLLOW, const suffix_info *suffixes = NULL) + : wide_path (NULL), normalized_path (NULL), normalized_path_size (0) { check (src, opt, suffixes); } path_conv (const UNICODE_STRING *src, unsigned opt = PC_SYM_FOLLOW, const suffix_info *suffixes = NULL) + : wide_path (NULL), normalized_path (NULL), normalized_path_size (0) { check (src, opt | PC_NULLEMPTY, suffixes); } path_conv (const char *src, unsigned opt = PC_SYM_FOLLOW, const suffix_info *suffixes = NULL) + : wide_path (NULL), normalized_path (NULL), normalized_path_size (0) { check (src, opt | PC_NULLEMPTY, suffixes); } - path_conv (): fileattr (INVALID_FILE_ATTRIBUTES), wide_path (NULL), - path_flags (0), known_suffix (NULL), error (0), - normalized_path (NULL) - {path[0] = '\0';} + path_conv () + : fileattr (INVALID_FILE_ATTRIBUTES), wide_path (NULL), path_flags (0), + known_suffix (NULL), error (0), normalized_path (NULL), + normalized_path_size (0) + { + path[0] = '\0'; + } ~path_conv (); inline char *get_win32 () { return path; }