]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 29 Dec 2001 21:07:46 +0000 (21:07 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 29 Dec 2001 21:07:46 +0000 (21:07 +0000)
* io/fts.c: Update from BSD to fix memory leaks.

2001-12-25  Dmitry V. Levin  <ldv@alt-linux.org>

ChangeLog
io/fts.c

index cd0d6628f1ef4c456bead3998b9dff60865a5eb2..d61b5caf2d2f685932b7f8d219569aaeff273040 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2001-12-25  Dmitry V. Levin  <ldv@alt-linux.org>
+
+       * io/fts.c: Update from BSD to fix memory leaks.
+
 2001-12-25  Dmitry V. Levin  <ldv@alt-linux.org>
 
        * crypt/md5-crypt.c: Realloc error handling memory leak fix.
index da337456ce758d1ab028a0d2a78630d5fb035faa..35374a094a708f0edb8b54168979a94bc819846d 100644 (file)
--- a/io/fts.c
+++ b/io/fts.c
@@ -934,12 +934,17 @@ fts_sort(sp, head, nitems)
         * 40 so don't realloc one entry at a time.
         */
        if (nitems > sp->fts_nitems) {
+               struct _ftsent **a;
+
                sp->fts_nitems = nitems + 40;
-               if ((sp->fts_array = realloc(sp->fts_array,
-                   (size_t)(sp->fts_nitems * sizeof(FTSENT *)))) == NULL) {
+               if ((a = realloc(sp->fts_array,
+                   (size_t)(sp->fts_nitems * sizeof(FTSENT *)))) == NULL) {
+                       free(sp->fts_array);
+                       sp->fts_array = NULL;
                        sp->fts_nitems = 0;
                        return (head);
                }
+               sp->fts_array = a;
        }
        for (ap = sp->fts_array, p = head; p; p = p->fts_link)
                *ap++ = p;
@@ -1016,6 +1021,8 @@ fts_palloc(sp, more)
        FTS *sp;
        size_t more;
 {
+       char *p;
+
        sp->fts_pathlen += more + 256;
        /*
         * Check for possible wraparound.  In an FTS, fts_pathlen is
@@ -1023,14 +1030,22 @@ fts_palloc(sp, more)
         * We limit fts_pathlen to USHRT_MAX to be safe in both cases.
         */
        if (sp->fts_pathlen < 0 || sp->fts_pathlen >= USHRT_MAX) {
-               if (sp->fts_path)
+               if (sp->fts_path) {
                        free(sp->fts_path);
+                       sp->fts_path = NULL;
+               }
                sp->fts_path = NULL;
                __set_errno (ENAMETOOLONG);
                return (1);
        }
-       sp->fts_path = realloc(sp->fts_path, sp->fts_pathlen);
-       return (sp->fts_path == NULL);
+       p = realloc(sp->fts_path, sp->fts_pathlen);
+       if (p == NULL) {
+               free(sp->fts_path);
+               sp->fts_path = NULL;
+               return 1;
+       }
+       sp->fts_path = p;
+       return 0;
 }
 
 /*