diff options
author | Christopher Faylor <me@cgf.cx> | 2012-01-02 21:45:51 +0400 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2012-01-02 21:45:51 +0400 |
commit | b9f131c820ef35c46d4a32e01d3ec8250a952457 (patch) | |
tree | d18ee318223d4ac1d7bf7c0b6115b4dff2a1ae35 /winsup/cygwin/path.cc | |
parent | 7e89497328a892aa408190894039d9d472c03392 (diff) |
* path.cc (get_current_dir_name): Avoid memory leak. Don't return PWD contents
if directory doesn't actually exist.
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r-- | winsup/cygwin/path.cc | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 7dc85442e..bbc93afbc 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -2858,19 +2858,18 @@ getwd (char *buf) extern "C" char * get_current_dir_name (void) { - char *pwd = getenv ("PWD"); + const char *pwd = getenv ("PWD"); char *cwd = getcwd (NULL, 0); + struct __stat64 pwdbuf, cwdbuf; - if (pwd) + if (pwd && strcmp (pwd, cwd) != 0 + && stat64 (pwd, &pwdbuf) == 0 + && stat64 (cwd, &cwdbuf) == 0 + && pwdbuf.st_dev == cwdbuf.st_dev + && pwdbuf.st_ino == cwdbuf.st_ino) { - struct __stat64 pwdbuf, cwdbuf; - stat64 (pwd, &pwdbuf); - stat64 (cwd, &cwdbuf); - if ((pwdbuf.st_dev == cwdbuf.st_dev) && (pwdbuf.st_ino == cwdbuf.st_ino)) - { - cwd = (char *) malloc (strlen (pwd) + 1); - strcpy (cwd, pwd); - } + cwd = (char *) realloc (cwd, strlen (pwd) + 1); + strcpy (cwd, pwd); } return cwd; |