1#include <limits.h>2#include <stdint.h>3#include <stdlib.h>4#include <stdio.h>5#include <string.h>67#include <scc/mach.h>89#include "libmach.h"1011Map *12remap(Map *map, int nsec, int nseg)13{14 int n;15 struct mapsec *sec, *seg;1617 if (nseg > SIZE_MAX/sizeof(*sec) || nseg > SIZE_MAX/sizeof(*seg))18 return NULL;1920 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;3637 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;5253 return map;54}5556Map *57newmap(int nsec, int nseg)58{59 Map m, *map;6061 if (!remap(memset(&m, 0, sizeof(Map)), nsec, nseg))62 goto err;6364 if ((map = malloc(sizeof(*map))) == NULL)65 goto err;6667 *map = m;68 return map;6970err:71 free(m.sec);72 free(m.seg);73 return NULL;74}