newmap.c (1178B)
1 #include <limits.h> 2 #include <stdint.h> 3 #include <stdlib.h> 4 #include <stdio.h> 5 #include <string.h> 6 7 #include <scc/mach.h> 8 9 #include "libmach.h" 10 11 Map * 12 remap(Map *map, int nsec, int nseg) 13 { 14 int n; 15 struct mapsec *sec, *seg; 16 17 if (nseg > SIZE_MAX/sizeof(*sec) || nseg > SIZE_MAX/sizeof(*seg)) 18 return NULL; 19 20 n = nseg - map->nseg; 21 if (nseg == 0) { 22 free(map->seg); 23 seg = NULL; 24 } else if (n == 0) { 25 seg = map->seg; 26 } else { 27 seg = realloc(map->seg, nseg * sizeof(*seg)); 28 if (!seg) 29 return NULL; 30 if (n > 0) { 31 memset(&seg[map->nseg], 0, n * sizeof(*seg)); 32 } 33 } 34 map->seg = seg; 35 map->nseg = nseg; 36 37 n = nsec - map->nsec; 38 if (nsec == 0) { 39 free(map->seg); 40 sec = NULL; 41 } else if (n == 0) { 42 sec = map->sec; 43 } else { 44 sec = realloc(map->sec, nsec * sizeof(*sec)); 45 if (!sec) 46 return NULL; 47 if (n > 0) 48 memset(&sec[map->nsec], 0, n * sizeof(*sec)); 49 } 50 map->sec = sec; 51 map->nsec = nsec; 52 53 return map; 54 } 55 56 Map * 57 newmap(int nsec, int nseg) 58 { 59 Map m, *map; 60 61 if (!remap(memset(&m, 0, sizeof(Map)), nsec, nseg)) 62 goto err; 63 64 if ((map = malloc(sizeof(*map))) == NULL) 65 goto err; 66 67 *map = m; 68 return map; 69 70 err: 71 free(m.sec); 72 free(m.seg); 73 return NULL; 74 }