about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--libio/bug-wmemstream1.c1
-rw-r--r--libio/tst-wmemstream1.c2
-rw-r--r--libio/tst-wmemstream2.c2
-rw-r--r--libio/wmemstream.c1
-rw-r--r--posix/glob.c18
6 files changed, 27 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 22f5067f2d..d78dffcfa0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-30  Ulrich Drepper  <drepper@redhat.com>
+
+	* posix/glob.c (glob_in_dir): Add some comments and asserts to
+	explain why there are no leaks.
+
 2006-09-29  Ulrich Drepper  <drepper@redhat.com>
 
 	* libio/wmemstream.c: Include <wchar.h>.
diff --git a/libio/bug-wmemstream1.c b/libio/bug-wmemstream1.c
index 2190593c93..22d67f71e9 100644
--- a/libio/bug-wmemstream1.c
+++ b/libio/bug-wmemstream1.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <string.h>
+#include <wchar.h>
 
 
 static int
diff --git a/libio/tst-wmemstream1.c b/libio/tst-wmemstream1.c
index 0c59c1adcb..f8b308bc6c 100644
--- a/libio/tst-wmemstream1.c
+++ b/libio/tst-wmemstream1.c
@@ -1,3 +1,5 @@
+#include <wchar.h>
+
 #define CHAR_T wchar_t
 #define W(o) L##o
 #define OPEN_MEMSTREAM open_wmemstream
diff --git a/libio/tst-wmemstream2.c b/libio/tst-wmemstream2.c
index f51a1db20c..e2442ebfac 100644
--- a/libio/tst-wmemstream2.c
+++ b/libio/tst-wmemstream2.c
@@ -1,3 +1,5 @@
+#include <wchar.h>
+
 #define CHAR_T wchar_t
 #define W(o) L##o
 #define OPEN_MEMSTREAM open_wmemstream
diff --git a/libio/wmemstream.c b/libio/wmemstream.c
index 85ea64991a..577931888d 100644
--- a/libio/wmemstream.c
+++ b/libio/wmemstream.c
@@ -20,6 +20,7 @@
 #include "strfile.h"
 #include <stdio.h>
 #include <stdlib.h>
+#include <wchar.h>
 
 
 struct _IO_FILE_wmemstream
diff --git a/posix/glob.c b/posix/glob.c
index 630d54063a..0079a15a92 100644
--- a/posix/glob.c
+++ b/posix/glob.c
@@ -1287,8 +1287,15 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
 	      for (size_t i = 0; i < cur; ++i)
 		free (names->name[i]);
 	      names = names->next;
+	      /* NB: we will not leak memory here if we exit without
+		 freeing the current block assigned to OLD.  At least
+		 the very first block is always allocated on the stack
+		 and this is the block assigned to OLD here.  */
 	      if (names == NULL)
-		break;
+		{
+		  assert (old == &init_names);
+		  break;
+		}
 	      cur = names->count;
 	      if (old == names_alloca)
 		names_alloca = names;
@@ -1306,8 +1313,15 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
 		new_gl_pathv[pglob->gl_offs + pglob->gl_pathc++]
 		  = names->name[i];
 	      names = names->next;
+	      /* NB: we will not leak memory here if we exit without
+		 freeing the current block assigned to OLD.  At least
+		 the very first block is always allocated on the stack
+		 and this is the block assigned to OLD here.  */
 	      if (names == NULL)
-		break;
+		{
+		  assert (old == &init_names);
+		  break;
+		}
 	      cur = names->count;
 	      if (old == names_alloca)
 		names_alloca = names;