From ed0f307c89ce6e9c766a9405cee19f0cc60f1ce0 Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Mon, 17 Apr 2023 19:25:05 -0400 Subject: ustar, main: Dynamically allocate member structs TODO: Save max strlen()s in first loop and printf() and free() in second loop. --- (limited to 'src/ustar.c') diff --git a/src/ustar.c b/src/ustar.c index a277f15..7df8c43 100644 --- a/src/ustar.c +++ b/src/ustar.c @@ -141,7 +141,7 @@ _opkg_opk_ustar_next(struct opkg_opk_ustar *ustar, int opkg_opk_ustar_list(struct opkg_opk_ustar *ustar, - struct opkg_opk_ustar_member *member) + struct opkg_opk_ustar_member **member) { static struct _opkg_opk_ustar_header header; int ret; @@ -151,54 +151,63 @@ opkg_opk_ustar_list(struct opkg_opk_ustar *ustar, return ret; /* Error or end of archive */ } + *member = malloc(sizeof(**member)); + if (*member == NULL) { + return OPKG_OPK_ERROR; + } + if (header.prefix[0] != '\0') { - sprintf(member->name, "%s/%s", header.prefix, header.name); + sprintf((*member)->name, "%s/%s", header.prefix, header.name); } else { - memcpy(member->name, header.name, sizeof(header.name)); - member->name[sizeof(header.name)] = '\0'; + memcpy((*member)->name, header.name, sizeof(header.name)); + (*member)->name[sizeof(header.name)] = '\0'; } - member->mode = strtol((char *) header.mode, &end, + (*member)->mode = strtol((char *) header.mode, &end, OPKG_OPK_USTAR_NUM_BASE_); if (*end != '\0') { + free(*member); return OPKG_OPK_ERROR; } - member->size = ustar->data_size_remaining; - member->mtime = strtol((char *) header.mtime, &end, + (*member)->size = ustar->data_size_remaining; + (*member)->mtime = strtol((char *) header.mtime, &end, OPKG_OPK_USTAR_NUM_BASE_); if (*end != '\0') { + free(*member); return OPKG_OPK_ERROR; } switch (*header.typeflag) { case '0': /* Regular file */ case '7': /* High-performance or regular file */ - member->type = '-'; + (*member)->type = '-'; break; case '2': /* Symbolic link */ - member->type = 'l'; - strncpy(member->linkname, header.linkname, - sizeof(member->linkname)); + (*member)->type = 'l'; + strncpy((*member)->linkname, header.linkname, + sizeof((*member)->linkname)); break; case '3': /* Character special file */ - member->type = 'c'; + (*member)->type = 'c'; break; case '4': /* Block special file */ - member->type = 'b'; + (*member)->type = 'b'; break; case '5': /* Directory */ - member->type = 'd'; + (*member)->type = 'd'; break; case '6': /* FIFO special file */ - member->type = 'p'; + (*member)->type = 'p'; break; case '1': /* Link */ default: /* Reserved */ + free(*member); return OPKG_OPK_ERROR; /* Unsupported */ } - strncpy(member->uname, header.uname, sizeof(member->uname)); - strncpy(member->gname, header.gname, sizeof(member->gname)); + strncpy((*member)->uname, header.uname, sizeof((*member)->uname)); + strncpy((*member)->gname, header.gname, sizeof((*member)->gname)); while (ustar->data_size_remaining > 0) { if (opkg_opk_ustar_read(ustar, NULL, NULL) == OPKG_OPK_ERROR) { + free(*member); return OPKG_OPK_ERROR; } } -- cgit v0.9.1