Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2012-01-02 21:45:51 +0400
committerChristopher Faylor <me@cgf.cx>2012-01-02 21:45:51 +0400
commitb9f131c820ef35c46d4a32e01d3ec8250a952457 (patch)
treed18ee318223d4ac1d7bf7c0b6115b4dff2a1ae35 /winsup/cygwin/path.cc
parent7e89497328a892aa408190894039d9d472c03392 (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.cc19
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;