Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sbin/ldconfig - don't core-dump if hints file is too short



details:   https://anonhg.NetBSD.org/src/rev/931863b189dc
branches:  trunk
changeset: 474716:931863b189dc
user:      christos <christos%NetBSD.org@localhost>
date:      Fri Jul 16 22:23:29 1999 +0000

description:
- don't core-dump if hints file is too short
- unmap the space and close fd's
- bcopy -> memcpy
- stat the file to get the size to map, instead of doing multiple mmaps.

diffstat:

 sbin/ldconfig/ldconfig.c |  74 +++++++++++++++++++++++++++--------------------
 1 files changed, 42 insertions(+), 32 deletions(-)

diffs (179 lines):

diff -r 4a9aeb8c0cb2 -r 931863b189dc sbin/ldconfig/ldconfig.c
--- a/sbin/ldconfig/ldconfig.c  Fri Jul 16 20:49:34 1999 +0000
+++ b/sbin/ldconfig/ldconfig.c  Fri Jul 16 22:23:29 1999 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ldconfig.c,v 1.26 1999/06/17 21:15:10 thorpej Exp $    */
+/*     $NetBSD: ldconfig.c,v 1.27 1999/07/16 22:23:29 christos Exp $   */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -181,7 +181,7 @@
                        line[--len] = '\0';
                } else {
                        cline = xmalloc(len+1);
-                       bcopy(line, cline, len);
+                       memcpy(cline, line, len);
                        line = cline;
                        line[len] = '\0';
                }
@@ -261,7 +261,7 @@
                if (!isdigit(*(cp+4)))
                        continue;
 
-               bzero((caddr_t)dewey, sizeof(dewey));
+               memset(dewey, 0, sizeof(dewey));
                ndewey = getdewey(dewey, cp + 4);
                enter(dir, dp->d_name, name, dewey, ndewey);
        }
@@ -295,7 +295,7 @@
                        shp->name = strdup(name);
                        free(shp->path);
                        shp->path = concat(dir, "/", file);
-                       bcopy(dewey, shp->dewey, sizeof(shp->dewey));
+                       memcpy(shp->dewey, dewey, sizeof(shp->dewey));
                        shp->ndewey = ndewey;
                }
                break;
@@ -312,7 +312,7 @@
        shp = (struct shlib_list *)xmalloc(sizeof *shp);
        shp->name = strdup(name);
        shp->path = concat(dir, "/", file);
-       bcopy(dewey, shp->dewey, MAXDEWEY);
+       memcpy(shp->dewey, dewey, MAXDEWEY);
        shp->ndewey = ndewey;
        shp->next = NULL;
 
@@ -383,7 +383,7 @@
 
        /* Allocate buckets and string table */
        blist = (struct hints_bucket *)xmalloc(n);
-       bzero((char *)blist, n);
+       memset(blist, 0, n);
        for (i = 0; i < hdr.hh_nbucket; i++)
                /* Empty all buckets */
                blist[i].hi_next = -1;
@@ -424,7 +424,7 @@
                str_index += 1 + strlen(shp->path);
 
                /* Copy versions */
-               bcopy(shp->dewey, bp->hi_dewey, sizeof(bp->hi_dewey));
+               memcpy(bp->hi_dewey, shp->dewey, sizeof(bp->hi_dewey));
                bp->hi_ndewey = shp->ndewey;
        }
 
@@ -484,52 +484,54 @@
 readhints()
 {
        int                     fd;
-       caddr_t                 addr;
-       long                    msize;
+       void                    *addr = (void *) -1;
+       size_t                  msize;
        struct hints_header     *hdr;
        struct hints_bucket     *blist;
        char                    *strtab;
        struct shlib_list       *shp;
        int                     i;
+       struct                  stat st;
+       int                     error = 0;
 
        if ((fd = open(_PATH_LD_HINTS, O_RDONLY, 0)) == -1) {
                warn("%s", _PATH_LD_HINTS);
-               return (-1);
+               goto cleanup;
+       }
+
+       if (fstat(fd, &st) == -1) {
+               warn("%s", _PATH_LD_HINTS);
+               goto cleanup;
        }
 
-       msize = getpagesize();
+       msize = (size_t)st.st_size;
+       if (msize < sizeof(*hdr)) {
+               warnx("%s: File too short", _PATH_LD_HINTS);
+               goto cleanup;
+       }
+
        addr = mmap(0, msize, PROT_READ, MAP_FILE|MAP_PRIVATE, fd, 0);
 
-       if (addr == (caddr_t)-1) {
+       if (addr == (void *)-1) {
                warn("%s", _PATH_LD_HINTS);
-               return (-1);
+               goto cleanup;
        }
 
        hdr = (struct hints_header *)addr;
        if (HH_BADMAG(*hdr)) {
                warnx("%s: Bad magic: %lo",
-                       _PATH_LD_HINTS, hdr->hh_magic);
-               return (-1);
+                   _PATH_LD_HINTS, hdr->hh_magic);
+               goto cleanup;
        }
 
        if (hdr->hh_version != LD_HINTS_VERSION_2) {
                warnx("Unsupported version: %ld", hdr->hh_version);
-               return (-1);
+               goto cleanup;
        }
 
-       if (hdr->hh_ehints > msize) {
-               if (mmap(addr+msize, hdr->hh_ehints - msize,
-                               PROT_READ, MAP_FILE|MAP_PRIVATE|MAP_FIXED,
-                               fd, msize) != (caddr_t)(addr+msize)) {
 
-                       warn("%s", _PATH_LD_HINTS);
-                       return (-1);
-               }
-       }
-       close(fd);
-
-       blist = (struct hints_bucket *)(addr + hdr->hh_hashtab);
-       strtab = (char *)(addr + hdr->hh_strtab);
+       blist = (struct hints_bucket *)((char *)addr + hdr->hh_hashtab);
+       strtab = ((char *)addr + hdr->hh_strtab);
 
        for (i = 0; i < hdr->hh_nbucket; i++) {
                struct hints_bucket     *bp = &blist[i];
@@ -537,18 +539,18 @@
                /* Sanity check */
                if (bp->hi_namex >= hdr->hh_strtab_sz) {
                        warnx("Bad name index: %#x", bp->hi_namex);
-                       return (-1);
+                       goto cleanup;
                }
                if (bp->hi_pathx >= hdr->hh_strtab_sz) {
                        warnx("Bad path index: %#x", bp->hi_pathx);
-                       return (-1);
+                       goto cleanup;
                }
 
                /* Allocate new list element */
                shp = (struct shlib_list *)xmalloc(sizeof *shp);
                shp->name = strdup(strtab + bp->hi_namex);
                shp->path = strdup(strtab + bp->hi_pathx);
-               bcopy(bp->hi_dewey, shp->dewey, sizeof(shp->dewey));
+               memcpy(shp->dewey, bp->hi_dewey, sizeof(shp->dewey));
                shp->ndewey = bp->hi_ndewey;
                shp->next = NULL;
 
@@ -556,8 +558,16 @@
                shlib_tail = &shp->next;
        }
        dir_list = strdup(strtab + hdr->hh_dirlist);
+       goto done;
+cleanup:
+       error = 1;
+done:
+       if (fd != -1)
+               close(fd);
+       if (addr != (void *)-1)
+               munmap(addr, msize);
+       return error;
 
-       return (0);
 }
 
 static void



Home | Main Index | Thread Index | Old Index