rtld-elf - Fix ancient C code
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 18 Dec 2019 16:18:32 +0000 (08:18 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 18 Dec 2019 16:18:32 +0000 (08:18 -0800)
* Adjust malloc() (used only by rtld-elf) to use size_t and fix
  a number of shift operations.

Submitted-by: swildner
libexec/rtld-elf/malloc.c

index 1ea4550..35690fa 100644 (file)
@@ -121,7 +121,7 @@ static void
 botch(char *s)
 {
        fprintf(stderr, "\r\nassertion botched: %s\r\n", s);
-       (void) fflush(stderr);          /* just in case user buffered it */
+       (void) fflush(stderr);          /* just in case user buffered it */
        abort();
 }
 #else
@@ -134,10 +134,10 @@ botch(char *s)
 void *
 malloc(size_t nbytes)
 {
-       register union overhead *op;
-       register int bucket;
+       register union overhead *op;
+       register int bucket;
        register long n;
-       register unsigned amt;
+       register size_t amt;
 
        /*
         * First time malloc is called, setup page size and
@@ -148,15 +148,15 @@ malloc(size_t nbytes)
                if (morepages(NPOOLPAGES) == 0)
                        return NULL;
                op = (union overhead *)(pagepool_start);
-               n = n - sizeof (*op) - ((long)op & (n - 1));
+               n = n - sizeof (*op) - ((long)op & (n - 1));
                if (n < 0)
                        n += pagesz;
-               if (n) {
+               if (n) {
                        pagepool_start += n;
                }
                bucket = 0;
                amt = 8;
-               while ((unsigned)pagesz > amt) {
+               while ((size_t)pagesz > amt) {
                        amt <<= 1;
                        bucket++;
                }
@@ -177,7 +177,7 @@ malloc(size_t nbytes)
 #endif
                n = -(sizeof (*op) + RSLOP);
        } else {
-               amt = pagesz;
+               amt = (size_t)pagesz;
                bucket = pagebucket;
        }
        while (nbytes > amt + n) {
@@ -190,17 +190,17 @@ malloc(size_t nbytes)
         * If nothing in hash bucket right now,
         * request more memory from the system.
         */
-       if ((op = nextf[bucket]) == NULL) {
-               morecore(bucket);
-               if ((op = nextf[bucket]) == NULL)
-                       return (NULL);
+       if ((op = nextf[bucket]) == NULL) {
+               morecore(bucket);
+               if ((op = nextf[bucket]) == NULL)
+                       return (NULL);
        }
        /* remove from linked list */
-       nextf[bucket] = op->ov_next;
+       nextf[bucket] = op->ov_next;
        op->ov_magic = MAGIC;
        op->ov_index = bucket;
 #ifdef MSTATS
-       nmalloc[bucket]++;
+       nmalloc[bucket]++;
 #endif
 #ifdef RCHECK
        /*
@@ -209,9 +209,9 @@ malloc(size_t nbytes)
         */
        op->ov_size = roundup2(nbytes, RSLOP);
        op->ov_rmagic = RMAGIC;
-       *(u_short *)((caddr_t)(op + 1) + op->ov_size) = RMAGIC;
+       *(u_short *)((caddr_t)(op + 1) + op->ov_size) = RMAGIC;
 #endif
-       return ((char *)(op + 1));
+       return ((char *)(op + 1));
 }
 
 /*
@@ -235,25 +235,25 @@ calloc(size_t num, size_t size)
 static void
 morecore(int bucket)
 {
-       register union overhead *op;
-       register int sz;                /* size of desired block */
-       int amt;                        /* amount to allocate */
-       int nblks;                      /* how many blocks we get */
+       register union overhead *op;
+       register size_t sz;             /* size of desired block */
+       size_t amt;                     /* amount to allocate */
+       int nblks;                      /* how many blocks we get */
 
        /*
         * sbrk_size <= 0 only for big, FLUFFY, requests (about
         * 2^30 bytes on a VAX, I think) or for a negative arg.
         */
-       sz = 1 << (bucket + 3);
+       sz = 1LU << (bucket + 3);
 #ifdef MALLOC_DEBUG
        ASSERT(sz > 0);
 #else
-       if (sz <= 0)
+       if (sz == 0)
                return;
 #endif
        if (sz < pagesz) {
                amt = pagesz;
-               nblks = amt / sz;
+               nblks = amt / sz;
        } else {
                amt = sz + pagesz;
                nblks = 1;
@@ -268,38 +268,38 @@ morecore(int bucket)
         * Add new memory allocated to that on
         * free list for this hash bucket.
         */
-       nextf[bucket] = op;
-       while (--nblks > 0) {
+       nextf[bucket] = op;
+       while (--nblks > 0) {
                op->ov_next = (union overhead *)((caddr_t)op + sz);
                op = (union overhead *)((caddr_t)op + sz);
-       }
+       }
 }
 
 void
 free(void *cp)
 {
-       register int size;
+       register int size;
        register union overhead *op;
 
-       if (cp == NULL)
-               return;
+       if (cp == NULL)
+               return;
        op = (union overhead *)((caddr_t)cp - sizeof (union overhead));
 #ifdef MALLOC_DEBUG
-       ASSERT(op->ov_magic == MAGIC);          /* make sure it was in use */
+       ASSERT(op->ov_magic == MAGIC);          /* make sure it was in use */
 #else
        if (op->ov_magic != MAGIC)
                return;                         /* sanity */
 #endif
 #ifdef RCHECK
-       ASSERT(op->ov_rmagic == RMAGIC);
+       ASSERT(op->ov_rmagic == RMAGIC);
        ASSERT(*(u_short *)((caddr_t)(op + 1) + op->ov_size) == RMAGIC);
 #endif
-       size = op->ov_index;
-       ASSERT(size < NBUCKETS);
+       size = op->ov_index;
+       ASSERT(size < NBUCKETS);
        op->ov_next = nextf[size];      /* also clobbers ov_magic */
-       nextf[size] = op;
+       nextf[size] = op;
 #ifdef MSTATS
-       nmalloc[size]--;
+       nmalloc[size]--;
 #endif
 }
 
@@ -319,14 +319,14 @@ int realloc_srchlen = 4;  /* 4 should be plenty, -1 =>'s whole list */
 void *
 realloc(void *cp, size_t nbytes)
 {
-       register u_int onb;
+       register size_t onb;
        register int i;
        union overhead *op;
-       char *res;
+       char *res;
        int was_alloced = 0;
 
-       if (cp == NULL)
-               return (malloc(nbytes));
+       if (cp == NULL)
+               return (malloc(nbytes));
        op = (union overhead *)((caddr_t)cp - sizeof (union overhead));
        if (op->ov_magic == MAGIC) {
                was_alloced++;
@@ -350,7 +350,7 @@ realloc(void *cp, size_t nbytes)
                    (i = findbucket(op, realloc_srchlen)) < 0)
                        i = NBUCKETS;
        }
-       onb = 1 << (i + 3);
+       onb = 1LU << (i + 3);
        if (onb < (u_int)pagesz)
                onb -= sizeof (*op) + RSLOP;
        else
@@ -358,7 +358,7 @@ realloc(void *cp, size_t nbytes)
        /* avoid the copy if same size block */
        if (was_alloced) {
                if (i) {
-                       i = 1 << (i + 2);
+                       i = 1LU << (i + 2);
                        if (i < pagesz)
                                i -= sizeof (*op) + RSLOP;
                        else
@@ -373,11 +373,11 @@ realloc(void *cp, size_t nbytes)
                } else
                        free(cp);
        }
-       if ((res = malloc(nbytes)) == NULL)
-               return (NULL);
-       if (cp != res)          /* common optimization if "compacting" */
+       if ((res = malloc(nbytes)) == NULL)
+               return (NULL);
+       if (cp != res)          /* common optimization if "compacting" */
                bcopy(cp, res, (nbytes < onb) ? nbytes : onb);
-       return (res);
+       return (res);
 }
 
 /*
@@ -413,25 +413,27 @@ findbucket(union overhead *freep, int srchlen)
 void
 mstats(char *s)
 {
-       register int i, j;
-       register union overhead *p;
-       int totfree = 0,
-       totused = 0;
-
-       fprintf(stderr, "Memory allocation statistics %s\nfree:\t", s);
-       for (i = 0; i < NBUCKETS; i++) {
-               for (j = 0, p = nextf[i]; p; p = p->ov_next, j++)
-                       ;
-               fprintf(stderr, " %d", j);
-               totfree += j * (1 << (i + 3));
-       }
-       fprintf(stderr, "\nused:\t");
-       for (i = 0; i < NBUCKETS; i++) {
-               fprintf(stderr, " %d", nmalloc[i]);
-               totused += nmalloc[i] * (1 << (i + 3));
-       }
-       fprintf(stderr, "\n\tTotal in use: %d, total free: %d\n",
-           totused, totfree);
+       register int i, j;
+       register union overhead *p;
+       size_t totfree, totused;
+
+       totfree = 0;
+       totused = 0;
+
+       fprintf(stderr, "Memory allocation statistics %s\nfree:\t", s);
+       for (i = 0; i < NBUCKETS; i++) {
+               for (j = 0, p = nextf[i]; p; p = p->ov_next, j++)
+                       ;
+               fprintf(stderr, " %d", j);
+               totfree += j * (1LU << (i + 3));
+       }
+       fprintf(stderr, "\nused:\t");
+       for (i = 0; i < NBUCKETS; i++) {
+               fprintf(stderr, " %d", nmalloc[i]);
+               totused += nmalloc[i] * (1LU << (i + 3));
+       }
+       fprintf(stderr, "\n\tTotal in use: %zd, total free: %zd\n",
+               totused, totfree);
 }
 #endif