commit cfd8977458f82d690f2d1af9e378b4f1b743514b
parent 9fca757b99d81dd58763d1c2f5c59ab435923aa6
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Wed, 14 Feb 2024 19:34:07 +0100
libmach: Resize Map in setmap
In many cases we will not know the number of
mappings at the very beginning, so resizing
it in setmap makes sense.
Diffstat:
4 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/include/scc/scc/mach.h b/include/scc/scc/mach.h
@@ -113,7 +113,8 @@ extern int getindex(int, long *, char ***, long **, FILE *);
#endif
-extern Map *newmap(int);
+extern Map *newmap(Map *, int);
+extern Map *remap(Map *, int);
extern Obj *newobj(int);
extern void delobj(Obj *);
diff --git a/src/libmach/coff32/coff32loadmap.c b/src/libmach/coff32/coff32loadmap.c
@@ -16,7 +16,7 @@ coff32loadmap(Obj *obj, FILE *fp)
FILHDR *hdr = &coff->hdr;
nsec = hdr->f_nscns;
- if ((map = newmap(nsec)) == NULL)
+ if ((map = newmap(NULL, nsec)) == NULL)
return NULL;
for (scn = coff->scns; nsec--; ++scn) {
diff --git a/src/libmach/newmap.c b/src/libmach/newmap.c
@@ -9,11 +9,9 @@
#include "libmach.h"
Map *
-newmap(int n)
+remap(Map *map, int n)
{
size_t vsiz;
- struct mapsec *p;
- Map *map;
if (n > SIZE_MAX/sizeof(struct mapsec))
goto out_range;
@@ -22,11 +20,11 @@ newmap(int n)
goto out_range;
vsiz += sizeof(*map);
- if ((map = malloc(vsiz)) == NULL)
+ if ((map = realloc(map, vsiz)) == NULL)
return NULL;
map->n = n;
- memset(map->sec, 0, vsiz);
+ return map;
return map;
@@ -34,3 +32,13 @@ out_range:
errno = ERANGE;
return NULL;
}
+
+Map *
+newmap(Map *map, int n)
+{
+ if ((map = remap(map, n)) == NULL)
+ return NULL;
+ memset(map->sec, 0, n * sizeof(struct mapsec));
+
+ return map;
+}
diff --git a/src/libmach/setmap.c b/src/libmach/setmap.c
@@ -18,15 +18,19 @@ setmap(Map *map,
n = map->n;
for (sec = map->sec; n--; sec++) {
- if (!sec->name) {
- sec->name = name;
- sec->fp = fp,
- sec->begin = begin;
- sec->end = end;
- sec->offset = off;
- return 0;
- }
+ if (!sec->name || !strcmp(sec->name, name))
+ goto found;
}
- return -1;
-}
-\ No newline at end of file
+ if ((map = remap(map, map->n+1 )) == NULL)
+ return -1;
+ sec = &map->sec[map->n-1];
+
+found:
+ sec->name = name;
+ sec->fp = fp,
+ sec->begin = begin;
+ sec->end = end;
+ sec->offset = off;
+ return 0;
+}