summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libexec/ld.so/prebind/objarray.c114
-rw-r--r--libexec/ld.so/prebind/prebind_struct.h5
2 files changed, 69 insertions, 50 deletions
diff --git a/libexec/ld.so/prebind/objarray.c b/libexec/ld.so/prebind/objarray.c
index 583f25d1f92..cf772a48ccc 100644
--- a/libexec/ld.so/prebind/objarray.c
+++ b/libexec/ld.so/prebind/objarray.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: objarray.c,v 1.6 2006/05/08 20:37:01 deraadt Exp $ */
+/* $OpenBSD: objarray.c,v 1.7 2006/05/10 23:03:53 drahn Exp $ */
/*
* Copyright (c) 2006 Dale Rahn <drahn@dalerahn.com>
*
@@ -60,7 +60,7 @@ void
elf_add_object_curbin_list(struct elf_object *object)
{
struct objlist *ol;
- ol = malloc(sizeof (struct objlist));
+ ol = xmalloc(sizeof (struct objlist));
ol->object = object;
TAILQ_INSERT_TAIL(&(curbin->curbin_list), ol, list);
if ( load_object == NULL)
@@ -77,7 +77,7 @@ void
elf_init_objarray(void)
{
objarray_sz = 512;
- objarray = malloc(sizeof (objarray[0]) * objarray_sz);
+ objarray = xmalloc(sizeof (objarray[0]) * objarray_sz);
}
void
@@ -101,16 +101,10 @@ elf_sum_reloc()
copy_oldsymcache(i);
continue;
}
- objarray[i].symcache = calloc(sizeof(struct symcache_noflag),
+ objarray[i].symcache = xcalloc(sizeof(struct symcache_noflag),
objarray[i].obj->nchains);
- objarray[i].pltsymcache = calloc(sizeof(struct symcache_noflag),
- objarray[i].obj->nchains);
-
- if (objarray[i].symcache == NULL ||
- objarray[i].pltsymcache == NULL) {
- printf("out of memory allocating symcache\n");
- exit (20);
- }
+ objarray[i].pltsymcache = xcalloc(sizeof(
+ struct symcache_noflag), objarray[i].obj->nchains);
TAILQ_FOREACH(ol, &(objarray[i].inst_list),
inst_list) {
@@ -148,9 +142,9 @@ elf_sum_reloc()
numobjs++;
}
pl->nobj = numobjs;
- pl->libmap = calloc(numobjs, sizeof (u_int32_t *));
- pl->fixup = calloc(2 * numobjs, sizeof (struct fixup *));
- pl->fixupcnt = calloc(2 * numobjs, sizeof (int));
+ pl->libmap = xcalloc(numobjs, sizeof (u_int32_t *));
+ pl->fixup = xcalloc(2 * numobjs, sizeof (struct fixup *));
+ pl->fixupcnt = xcalloc(2 * numobjs, sizeof (int));
numobjs = 0;
TAILQ_FOREACH(ol, &(pl->curbin_list), list) {
@@ -190,8 +184,8 @@ elf_prep_lib_prebind(struct elf_object *object)
symcache = objarray[object->dyn.null].symcache;
pltsymcache = objarray[object->dyn.null].pltsymcache;
- libmap = calloc(objarray_cnt, sizeof (int));
- idxtolib = calloc(objarray_cnt, sizeof (int));
+ libmap = xcalloc(objarray_cnt, sizeof (int));
+ idxtolib = xcalloc(objarray_cnt, sizeof (int));
objarray[object->dyn.null].idxtolib = idxtolib;
for (i = 0; i < objarray_cnt; i++)
@@ -210,7 +204,7 @@ elf_prep_lib_prebind(struct elf_object *object)
nametablen += strlen(symcache[i].obj->load_name) + 1;
numlibs++;
}
- symcachetab = calloc(symcache_cnt , sizeof(struct symcachetab));
+ symcachetab = xcalloc(symcache_cnt , sizeof(struct symcachetab));
symcache_cnt = 0;
for (i = 0; i < object->nchains; i++) {
@@ -235,7 +229,7 @@ elf_prep_lib_prebind(struct elf_object *object)
nametablen += strlen(pltsymcache[i].obj->load_name) + 1;
numlibs++;
}
- pltsymcachetab = calloc(pltsymcache_cnt , sizeof(struct symcachetab));
+ pltsymcachetab = xcalloc(pltsymcache_cnt , sizeof(struct symcachetab));
pltsymcache_cnt = 0;
for (i = 0; i < object->nchains; i++) {
@@ -251,8 +245,8 @@ elf_prep_lib_prebind(struct elf_object *object)
objarray[object->dyn.null].numlibs = numlibs;
- nameidx = calloc(numlibs, sizeof (struct nameidx));
- nametab = malloc(nametablen);
+ nameidx = xcalloc(numlibs, sizeof (struct nameidx));
+ nametab = xmalloc(nametablen);
nametablen = 0;
for (i = 0; i < numlibs; i++) {
@@ -309,8 +303,8 @@ elf_prep_bin_prebind(struct proglist *pl)
object = TAILQ_FIRST(&(pl->curbin_list))->object;
symcache = objarray[object->dyn.null].symcache;
pltsymcache = objarray[object->dyn.null].pltsymcache;
- libmap = calloc(objarray_cnt, sizeof (int));
- idxtolib = calloc(pl->nobj, sizeof (int));
+ libmap = xcalloc(objarray_cnt, sizeof (int));
+ idxtolib = xcalloc(pl->nobj, sizeof (int));
for (i = 0; i < objarray_cnt; i++)
libmap[i] = -1;
@@ -324,7 +318,7 @@ elf_prep_bin_prebind(struct proglist *pl)
nametablen += strlen(ol->object->load_name) + 1;
libmap[ref_obj] = numlibs;
idxtolib[numlibs] = ref_obj;
-#if 0
+#if 1
printf("obj :%d, idx %d %s\n", numlibs, ref_obj, ol->object->load_name);
#endif
numlibs++;
@@ -337,7 +331,7 @@ elf_prep_bin_prebind(struct proglist *pl)
symcache_cnt++;
}
- symcachetab = calloc(symcache_cnt , sizeof(struct symcachetab));
+ symcachetab = xcalloc(symcache_cnt , sizeof(struct symcachetab));
symcache_cnt = 0;
for (i = 0; i < object->nchains; i++) {
@@ -357,7 +351,7 @@ elf_prep_bin_prebind(struct proglist *pl)
if (pltsymcache[i].sym != NULL)
pltsymcache_cnt++;
}
- pltsymcachetab = calloc(pltsymcache_cnt , sizeof(struct symcachetab));
+ pltsymcachetab = xcalloc(pltsymcache_cnt , sizeof(struct symcachetab));
pltsymcache_cnt = 0;
for (i = 0; i < object->nchains; i++) {
@@ -371,11 +365,10 @@ elf_prep_bin_prebind(struct proglist *pl)
pltsymcache_cnt++;
}
- nameidx = calloc(numlibs, sizeof (struct nameidx));
- nametab = malloc(nametablen);
+ objarray[object->dyn.null].numlibs = numlibs;
- if (nameidx == NULL || nametab == NULL)
- perror("buffers");
+ nameidx = xcalloc(numlibs, sizeof (struct nameidx));
+ nametab = xmalloc(nametablen);
nametablen = 0;
for (i = 0; i < numlibs; i++) {
@@ -393,7 +386,7 @@ elf_prep_bin_prebind(struct proglist *pl)
printf("\tlib %s\n", &nametab[nameidx[i].name]);
}
#endif
- pl->libmapcnt = calloc(numlibs, sizeof(u_int32_t));
+ pl->libmapcnt = xcalloc(numlibs, sizeof(u_int32_t));
/* have to do both got and plt fixups */
for (i = 0; i < numlibs; i++) {
@@ -407,8 +400,9 @@ elf_prep_bin_prebind(struct proglist *pl)
}
pl->libmapcnt[i] = objarray[idxtolib[i]].numlibs;
- for (j = 0; j < objarray[idxtolib[i]].numlibs; j++)
- pl->libmap[i][j] = libmap[pl->libmap[i][j]];
+ if (i != 0)
+ for (j = 0; j < objarray[idxtolib[i]].numlibs; j++)
+ pl->libmap[i][j] = libmap[pl->libmap[i][j]];
}
ret = elf_write_lib(object, nameidx, nametab, nametablen, numlibs,
@@ -511,14 +505,14 @@ elf_write_lib(struct elf_object *object, struct nameidx *nameidx,
next_start += 2*nfixup * sizeof(u_int32_t);
footer.fixupcnt_idx = next_start;
next_start += 2*nfixup * sizeof(u_int32_t);
- fixuptab = calloc( 2*nfixup, sizeof(u_int32_t));
+ fixuptab = xcalloc( 2*nfixup, sizeof(u_int32_t));
for ( i = 0; i < 2*nfixup; i++) {
fixuptab[i] = next_start;
next_start += fixupcnt[i] * sizeof(struct fixup);
}
footer.libmap_idx = next_start;
next_start += 2*nfixup * sizeof(u_int32_t);
- maptab = calloc( 2*nfixup, sizeof(u_int32_t));
+ maptab = xcalloc( 2*nfixup, sizeof(u_int32_t));
maptab[0] = next_start;
for (i = 1; i < nfixup; i++) {
maptab[i] = next_start;
@@ -729,7 +723,7 @@ elf_calc_fixups(struct proglist *pl, struct objlist *ol, int libidx)
numfixups++;
}
}
- pl->fixup[2*libidx] = calloc(numfixups, sizeof (struct fixup));
+ pl->fixup[2*libidx] = xcalloc(numfixups, sizeof (struct fixup));
numfixups = 0;
for (i = 0; i < ol->object->nchains; i++) {
@@ -775,7 +769,7 @@ elf_calc_fixups(struct proglist *pl, struct objlist *ol, int libidx)
numfixups++;
}
}
- pl->fixup[2*libidx+1] = calloc(numfixups, sizeof (struct fixup));
+ pl->fixup[2*libidx+1] = xcalloc(numfixups, sizeof (struct fixup));
numfixups = 0;
for (i = 0; i < ol->object->nchains; i++) {
@@ -800,7 +794,7 @@ elf_calc_fixups(struct proglist *pl, struct objlist *ol, int libidx)
}
pl->fixupcnt[2*libidx+1] = numfixups;
- pl->libmap[libidx] = calloc( objarray[objidx].numlibs,
+ pl->libmap[libidx] = xcalloc( objarray[objidx].numlibs,
sizeof(u_int32_t));
for (i = 0; i < objarray[objidx].numlibs; i++) {
@@ -818,7 +812,7 @@ elf_add_object(struct elf_object *object, int objtype)
{
struct objarray_list *newarray;
struct objlist *ol;
- ol = malloc(sizeof (struct objlist));
+ ol = xmalloc(sizeof (struct objlist));
ol->object = object;
if (objtype != OBJTYPE_EXE)
TAILQ_INSERT_TAIL(&library_list, ol, list);
@@ -839,6 +833,7 @@ elf_add_object(struct elf_object *object, int objtype)
objarray[objarray_cnt].id0 = arc4random(); /* XXX FIX */
objarray[objarray_cnt].id1 = arc4random();
objarray[objarray_cnt].oprebind_data = NULL;
+ objarray[objarray_cnt].numlibs = 0;
objarray_cnt++;
elf_add_object_curbin_list(object);
@@ -938,7 +933,7 @@ write_txtbusy_file(char *name)
/* allocate a 256k buffer to copy the file */
#define BUFSZ (256 * 1024)
- buf = malloc(BUFSZ);
+ buf = xmalloc(BUFSZ);
fd = open(prebind_name, O_RDWR|O_CREAT|O_TRUNC, sb.st_mode);
oldfd = open(name, O_RDONLY);
@@ -1010,15 +1005,9 @@ copy_oldsymcache(int objidx)
prebind_map = objarray[object->dyn.null].oprebind_data;
objarray[objidx].symcache =
- calloc(sizeof(struct symcache_noflag), object->nchains);
+ xcalloc(sizeof(struct symcache_noflag), object->nchains);
objarray[objidx].pltsymcache =
- calloc(sizeof(struct symcache_noflag), object->nchains);
-
- if (objarray[objidx].symcache == NULL ||
- objarray[objidx].pltsymcache == NULL) {
- printf("out of memory allocating symcache\n");
- exit (20);
- }
+ xcalloc(sizeof(struct symcache_noflag), object->nchains);
poffset = (u_int32_t *)prebind_map;
c = prebind_map;
@@ -1029,7 +1018,7 @@ copy_oldsymcache(int objidx)
nameidx = prebind_map + footer->nameidx_idx;
nametab = prebind_map + footer->nametab_idx;
- idxtolib = calloc(footer->numlibs, sizeof(int));
+ idxtolib = xcalloc(footer->numlibs, sizeof(int));
found = 0;
for (i = 0; i < footer->numlibs; i++) {
found = 0;
@@ -1079,3 +1068,30 @@ done:
free (idxtolib);
/* munmap(prebind_map, size);*/
}
+
+void *
+xmalloc(size_t size)
+{
+ void *ret;
+
+ ret = malloc(size);
+ if (ret == NULL) {
+ printf("unable to allocate memory\n");
+ exit (20);
+ }
+ return ret;
+}
+
+void *
+xcalloc(size_t nmemb, size_t size)
+{
+ void *ret;
+
+ ret = calloc(nmemb, size);
+ if (ret == NULL) {
+ printf("unable to allocate memory\n");
+ abort();
+ exit (20);
+ }
+ return ret;
+}
diff --git a/libexec/ld.so/prebind/prebind_struct.h b/libexec/ld.so/prebind/prebind_struct.h
index 54a2584359b..c5533ddc64c 100644
--- a/libexec/ld.so/prebind/prebind_struct.h
+++ b/libexec/ld.so/prebind/prebind_struct.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: prebind_struct.h,v 1.2 2006/05/04 15:33:15 drahn Exp $ */
+/* $OpenBSD: prebind_struct.h,v 1.3 2006/05/10 23:03:53 drahn Exp $ */
/*
* Copyright (c) 2006 Dale Rahn <drahn@dalerahn.com>
*
@@ -79,3 +79,6 @@ void elf_dump_footer(struct prebind_footer *footer);
extern int verbose;
void elf_load_existing_prebind(struct elf_object *object, int fd);
+
+void *xmalloc(size_t);
+void *xcalloc(size_t,size_t);