rtld: Sync memory allocation with FreeBSD
authorJohn Marino <draco@marino.st>
Sun, 25 Mar 2012 10:49:17 +0000 (12:49 +0200)
committerJohn Marino <draco@marino.st>
Sun, 25 Mar 2012 11:28:16 +0000 (13:28 +0200)
Taken from:
FreeBSD SVN 233306 (22 March 2012)
FreeBSD SVN 233307 (22 March 2012)
FreeBSD SVN 233357 (22 March 2012)

Remove unused CalTech #ifdef fragments.

Use xmalloc() instead of malloc() in the places where malloc() calls
are assumed to not fail. Make the xcalloc() calling conventions follow
the calloc(3) calling conventions and replace unchecked calls to calloc()
with calls to xcalloc(). Remove redundand declarations from xmalloc.c,
which are already present in rtld.h.

Implement xstrdup() using strlen()/xmalloc()/memcpy() already presented
in rtld, instead of pulling in libc strdup().

libexec/rtld-elf/malloc.c
libexec/rtld-elf/rtld.c
libexec/rtld-elf/rtld.h
libexec/rtld-elf/xmalloc.c

index 413bbb9..220888a 100644 (file)
 #include <sys/param.h>
 #include <sys/mman.h>
 #include "rtld_printf.h"
-#ifndef BSD
-#define MAP_COPY       MAP_PRIVATE
-#define MAP_FILE       0
-#define MAP_ANON       0
-#endif
-
-#ifndef BSD            /* Need do better than this */
-#define NEED_DEV_ZERO  1
-#endif
 
 static void morecore();
 static int findbucket();
@@ -464,12 +455,6 @@ int        n;
        int     fd = -1;
        int     offset;
 
-#ifdef NEED_DEV_ZERO
-       fd = open(_PATH_DEVZERO, O_RDWR, 0);
-       if (fd == -1)
-               perror(_PATH_DEVZERO);
-#endif
-
        if (pagepool_end - pagepool_start > pagesz) {
                caddr_t addr = (caddr_t)
                        (((long)pagepool_start + pagesz - 1) & ~(pagesz - 1));
@@ -489,8 +474,5 @@ int n;
        pagepool_end = pagepool_start + n * pagesz;
        pagepool_start += offset;
 
-#ifdef NEED_DEV_ZERO
-       close(fd);
-#endif
        return n;
 }
index c70a7d9..74752d8 100644 (file)
@@ -4056,7 +4056,7 @@ tls_get_addr_common(Elf_Addr** dtvp, int index, size_t offset)
        int to_copy;
 
        wlock_acquire(rtld_bind_lock, &lockstate);
-       newdtv = calloc(1, (tls_max_index + 2) * sizeof(Elf_Addr));
+       newdtv = xcalloc(tls_max_index + 2, sizeof(Elf_Addr));
        to_copy = dtv[1];
        if (to_copy > tls_max_index)
            to_copy = tls_max_index;
@@ -4428,7 +4428,7 @@ rtld_verify_object_versions(Obj_Entry *obj)
      * way.
      */
     obj->vernum = maxvernum + 1;
-    obj->vertab = calloc(obj->vernum, sizeof(Ver_Entry));
+    obj->vertab = xcalloc(obj->vernum, sizeof(Ver_Entry));
 
     vd = obj->verdef;
     while (vd != NULL) {
index c9be7b3..3870177 100644 (file)
@@ -46,7 +46,7 @@
 #endif
 
 #define NEW(type)      ((type *) xmalloc(sizeof(type)))
-#define CNEW(type)     ((type *) xcalloc(sizeof(type)))
+#define CNEW(type)     ((type *) xcalloc(1, sizeof(type)))
 
 /* We might as well do booleans like C++. */
 typedef unsigned char bool;
@@ -330,7 +330,7 @@ typedef struct Struct_SymLook {
 void _rtld_error(const char *, ...) __printflike(1, 2);
 const char *rtld_strerror(int);
 Obj_Entry *map_object(int, const char *, const struct stat *);
-void *xcalloc(size_t);
+void *xcalloc(size_t, size_t);
 void *xmalloc(size_t);
 char *xstrdup(const char *);
 extern Elf_Addr _GLOBAL_OFFSET_TABLE_[];
index 0d99225..178f49b 100644 (file)
 #include "rtld.h"
 #include "rtld_printf.h"
 
-void *xcalloc(size_t);
-void *xmalloc(size_t);
-char *xstrdup(const char *);
-
 void *
-xcalloc(size_t size)
+xcalloc(size_t number, size_t size)
 {
-    return memset(xmalloc(size), 0, size);
+       void *p;
+
+       p = calloc(number, size);
+       if (p == NULL) {
+               rtld_fdputstr(STDERR_FILENO, "Out of memory\n");
+               _exit(1);
+       }
+       return (p);
 }
 
 void *
@@ -54,12 +57,13 @@ xmalloc(size_t size)
 }
 
 char *
-xstrdup(const char *s)
+xstrdup(const char *str)
 {
-    char *p = strdup(s);
-    if (p == NULL) {
-        rtld_fdputstr(STDERR_FILENO, "Out of memory\n");
-        _exit(1);
-    }
-    return p;
+       char *copy;
+       size_t len;
+
+       len = strlen(str) + 1;
+       copy = xmalloc(len);
+       memcpy(copy, str, len);
+       return (copy);
 }