Changeset c43d7bd in rtems


Ignore:
Timestamp:
Nov 30, 2001, 12:03:15 PM (20 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
9e1ae79
Parents:
7fe83de
Message:

2001-11-30 Jennifer Averett <jennifer@…>

This was tracked as PR88.

  • libc/scandir.c: Fixed to perform cleanup on error conditions.
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/libcsupport/src/scandir.c

    r7fe83de rc43d7bd  
    8484        int (*dcomp) __P((const void *, const void *));
    8585{
    86         register struct dirent *d, *p, **names;
     86        register struct dirent *d = NULL;
     87        register struct dirent *p = NULL;
     88        register struct dirent **names = NULL;
    8789        register size_t nitems;
    8890        struct stat stb;
    8991        long arraysz;
    90         DIR *dirp;
     92        DIR *dirp = NULL;
     93        int i;
    9194
    9295        if ((dirp = opendir(dirname)) == NULL)
    9396                return(-1);
    9497        if (fstat(dirp->dd_fd, &stb) < 0)
    95                 return(-1);
     98                goto cleanup_and_bail;
    9699
    97100        /*
     
    102105        names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *));
    103106        if (names == NULL)
    104                 return(-1);
     107                goto  cleanup_and_bail;
    105108
    106109        nitems = 0;
     
    113116                p = (struct dirent *)malloc(DIRSIZ(d));
    114117                if (p == NULL)
    115                         return(-1);
     118                      goto  cleanup_and_bail;
    116119                p->d_ino = d->d_ino;
    117120                p->d_reclen = d->d_reclen;
     
    124127                if (++nitems >= arraysz) {
    125128                        if (fstat(dirp->dd_fd, &stb) < 0)
    126                                 return(-1);     /* just might have grown */
     129                                goto  cleanup_and_bail; /* just might have grown */
    127130                        arraysz = stb.st_size / 12;
    128131                        names = (struct dirent **)realloc((char *)names,
    129132                                arraysz * sizeof(struct dirent *));
    130133                        if (names == NULL)
    131                                 return(-1);
     134                      goto  cleanup_and_bail;
    132135                }
    133136                names[nitems-1] = p;
     
    139142        *namelist = names;
    140143        return(nitems);
     144
     145cleanup_and_bail:
     146
     147        if ( dirp )
     148                closedir( dirp );
     149       
     150        if ( names ) {
     151                for (i=0; i < nitems; i++ )
     152                        free( names[i] );
     153                free( names );
     154        }
     155
     156        return(-1);
    141157}
    142158
  • c/src/lib/ChangeLog

    r7fe83de rc43d7bd  
     12001-11-30      Jennifer Averett <jennifer@OARcorp.com>
     2
     3        This was tracked as PR88.
     4        * libc/scandir.c: Fixed to perform cleanup on error conditions.
     5
    162001-11-07      Jennifer Averett <jennifer@OARcorp.com>
    27
  • c/src/lib/libc/scandir.c

    r7fe83de rc43d7bd  
    8484        int (*dcomp) __P((const void *, const void *));
    8585{
    86         register struct dirent *d, *p, **names;
     86        register struct dirent *d = NULL;
     87        register struct dirent *p = NULL;
     88        register struct dirent **names = NULL;
    8789        register size_t nitems;
    8890        struct stat stb;
    8991        long arraysz;
    90         DIR *dirp;
     92        DIR *dirp = NULL;
     93        int i;
    9194
    9295        if ((dirp = opendir(dirname)) == NULL)
    9396                return(-1);
    9497        if (fstat(dirp->dd_fd, &stb) < 0)
    95                 return(-1);
     98                goto cleanup_and_bail;
    9699
    97100        /*
     
    102105        names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *));
    103106        if (names == NULL)
    104                 return(-1);
     107                goto  cleanup_and_bail;
    105108
    106109        nitems = 0;
     
    113116                p = (struct dirent *)malloc(DIRSIZ(d));
    114117                if (p == NULL)
    115                         return(-1);
     118                      goto  cleanup_and_bail;
    116119                p->d_ino = d->d_ino;
    117120                p->d_reclen = d->d_reclen;
     
    124127                if (++nitems >= arraysz) {
    125128                        if (fstat(dirp->dd_fd, &stb) < 0)
    126                                 return(-1);     /* just might have grown */
     129                                goto  cleanup_and_bail; /* just might have grown */
    127130                        arraysz = stb.st_size / 12;
    128131                        names = (struct dirent **)realloc((char *)names,
    129132                                arraysz * sizeof(struct dirent *));
    130133                        if (names == NULL)
    131                                 return(-1);
     134                      goto  cleanup_and_bail;
    132135                }
    133136                names[nitems-1] = p;
     
    139142        *namelist = names;
    140143        return(nitems);
     144
     145cleanup_and_bail:
     146
     147        if ( dirp )
     148                closedir( dirp );
     149       
     150        if ( names ) {
     151                for (i=0; i < nitems; i++ )
     152                        free( names[i] );
     153                free( names );
     154        }
     155
     156        return(-1);
    141157}
    142158
  • cpukit/libcsupport/src/scandir.c

    r7fe83de rc43d7bd  
    8484        int (*dcomp) __P((const void *, const void *));
    8585{
    86         register struct dirent *d, *p, **names;
     86        register struct dirent *d = NULL;
     87        register struct dirent *p = NULL;
     88        register struct dirent **names = NULL;
    8789        register size_t nitems;
    8890        struct stat stb;
    8991        long arraysz;
    90         DIR *dirp;
     92        DIR *dirp = NULL;
     93        int i;
    9194
    9295        if ((dirp = opendir(dirname)) == NULL)
    9396                return(-1);
    9497        if (fstat(dirp->dd_fd, &stb) < 0)
    95                 return(-1);
     98                goto cleanup_and_bail;
    9699
    97100        /*
     
    102105        names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *));
    103106        if (names == NULL)
    104                 return(-1);
     107                goto  cleanup_and_bail;
    105108
    106109        nitems = 0;
     
    113116                p = (struct dirent *)malloc(DIRSIZ(d));
    114117                if (p == NULL)
    115                         return(-1);
     118                      goto  cleanup_and_bail;
    116119                p->d_ino = d->d_ino;
    117120                p->d_reclen = d->d_reclen;
     
    124127                if (++nitems >= arraysz) {
    125128                        if (fstat(dirp->dd_fd, &stb) < 0)
    126                                 return(-1);     /* just might have grown */
     129                                goto  cleanup_and_bail; /* just might have grown */
    127130                        arraysz = stb.st_size / 12;
    128131                        names = (struct dirent **)realloc((char *)names,
    129132                                arraysz * sizeof(struct dirent *));
    130133                        if (names == NULL)
    131                                 return(-1);
     134                      goto  cleanup_and_bail;
    132135                }
    133136                names[nitems-1] = p;
     
    139142        *namelist = names;
    140143        return(nitems);
     144
     145cleanup_and_bail:
     146
     147        if ( dirp )
     148                closedir( dirp );
     149       
     150        if ( names ) {
     151                for (i=0; i < nitems; i++ )
     152                        free( names[i] );
     153                free( names );
     154        }
     155
     156        return(-1);
    141157}
    142158
Note: See TracChangeset for help on using the changeset viewer.