[PATCH] Fix resource leak in getcwd()
Sebastian Huber
sebastian.huber@embedded-brains.de
Thu Oct 16 10:36:00 GMT 2014
The fix is similar to the code in the current FreeBSD sources which
fixed this bug in 1997.
newlib/ChangeLog
2014-10-16 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libc/unix/getcwd.c (getcwd): Close directory also in case of
an error.
---
newlib/libc/unix/getcwd.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/newlib/libc/unix/getcwd.c b/newlib/libc/unix/getcwd.c
index 92f1b20..7292445 100644
--- a/newlib/libc/unix/getcwd.c
+++ b/newlib/libc/unix/getcwd.c
@@ -57,7 +57,7 @@ getcwd (pt, size)
size_t size;
{
register struct dirent *dp;
- register DIR *dir;
+ register DIR *dir = NULL;
register dev_t dev;
register ino_t ino;
register int first;
@@ -163,6 +163,8 @@ getcwd (pt, size)
*bup = '\0';
/* Open and stat parent directory. */
+ if (dir)
+ (void) closedir (dir);
if (!(dir = opendir (up)) || fstat (__dirfd (dir), &s))
goto err;
@@ -236,7 +238,6 @@ getcwd (pt, size)
*--bpt = '/';
bpt -= strlen (dp->d_name);
bcopy (dp->d_name, bpt, strlen (dp->d_name));
- (void) closedir (dir);
/* Truncate any file name. */
*bup = '\0';
@@ -256,6 +257,8 @@ notfound:
err:
if (ptsize)
free (pt);
+ if (dir)
+ (void) closedir (dir);
free (up);
return (char *) NULL;
}
--
1.8.4.5
More information about the Newlib
mailing list