summaryrefslogtreecommitdiffstats
path: root/src/ustar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ustar.c')
-rw-r--r--src/ustar.c43
1 files changed, 26 insertions, 17 deletions
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;
}
}