X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fxheader.c;h=dadaf5430276c39ae731d1a78a24fb177d72f943;hb=040b5ab5f969f9ee6c69a54bc284e2ff57b86556;hp=e88934e85ec82823e8b6ee1ebcf55338b3feba46;hpb=4f4a858eb6c0413aff0e4a0a787f151563643666;p=chaz%2Ftar diff --git a/src/xheader.c b/src/xheader.c index e88934e..dadaf54 100644 --- a/src/xheader.c +++ b/src/xheader.c @@ -1079,8 +1079,8 @@ static void sparse_offset_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void *data) { - size_t i = *(size_t*)data; - code_num (st->sparse_map[i].offset, keyword, xhdr); + size_t *pi = data; + code_num (st->sparse_map[*pi].offset, keyword, xhdr); } static void @@ -1088,15 +1088,21 @@ sparse_offset_decoder (struct tar_stat_info *st, char const *arg) { uintmax_t u; if (decode_num (&u, arg, TYPE_MAXIMUM (off_t), "GNU.sparse.offset")) - st->sparse_map[st->sparse_map_avail].offset = u; + { + if (st->sparse_map_avail < st->sparse_map_size) + st->sparse_map[st->sparse_map_avail].offset = u; + else + ERROR ((0, 0, _("Malformed extended header: excess %s=%s"), + "GNU.sparse.offset", arg)); + } } static void sparse_numbytes_coder (struct tar_stat_info const *st, char const *keyword, struct xheader *xhdr, void *data) { - size_t i = *(size_t*)data; - code_num (st->sparse_map[i].numbytes, keyword, xhdr); + size_t *pi = data; + code_num (st->sparse_map[*pi].numbytes, keyword, xhdr); } static void @@ -1105,11 +1111,11 @@ sparse_numbytes_decoder (struct tar_stat_info *st, char const *arg) uintmax_t u; if (decode_num (&u, arg, SIZE_MAX, "GNU.sparse.numbytes")) { - if (st->sparse_map_avail == st->sparse_map_size) - st->sparse_map = x2nrealloc (st->sparse_map, - &st->sparse_map_size, - sizeof st->sparse_map[0]); - st->sparse_map[st->sparse_map_avail++].numbytes = u; + if (st->sparse_map_avail < st->sparse_map_size) + st->sparse_map[st->sparse_map_avail++].numbytes = u; + else + ERROR ((0, 0, _("Malformed extended header: excess %s=%s"), + "GNU.sparse.numbytes", arg)); } }