X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=scripts%2Fxsparse.c;fp=scripts%2Fxsparse.c;h=14d5658c18a34541152a960e289e15c4490f36ba;hb=a59c819beb4886ee43f16dfd80ec1151fda1abe6;hp=fd91b48726c2b75a71367c3271d6742610f89ae3;hpb=57b11473b0135b1e092cf045f94635c934c7c63f;p=chaz%2Ftar diff --git a/scripts/xsparse.c b/scripts/xsparse.c index fd91b48..14d5658 100644 --- a/scripts/xsparse.c +++ b/scripts/xsparse.c @@ -1,7 +1,7 @@ /* xsparse - expands compressed sparse file images extracted from GNU tar archives. - Copyright (C) 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2006, 2007, 2010 Free Software Foundation, Inc. Written by Sergey Poznyakoff @@ -20,6 +20,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include +#include #include #include #include @@ -39,7 +40,7 @@ struct sp_array { off_t offset; - size_t numbytes; + off_t numbytes; }; char *progname; @@ -226,7 +227,7 @@ read_xheader (char *name) } else if (strcmp (kw, "numbytes") == 0) { - sparse_map[i++].numbytes = string_to_size (val, NULL); + sparse_map[i++].numbytes = string_to_off (val, NULL); } else if (strcmp (kw, "map") == 0) { @@ -236,7 +237,7 @@ read_xheader (char *name) if (*val != ',') die (1, "bad GNU.sparse.map: expected `,' but found `%c'", *val); - sparse_map[i].numbytes = string_to_size (val+1, &val); + sparse_map[i].numbytes = string_to_off (val+1, &val); if (*val != ',') { if (!(*val == 0 && i == sparse_map_size-1)) @@ -277,7 +278,7 @@ read_map (FILE *ifp) get_line (nbuf, sizeof nbuf, ifp); sparse_map[i].offset = string_to_off (nbuf, NULL); get_line (nbuf, sizeof nbuf, ifp); - sparse_map[i].numbytes = string_to_size (nbuf, NULL); + sparse_map[i].numbytes = string_to_off (nbuf, NULL); } fseeko (ifp, ((ftell (ifp) + BLOCKSIZE - 1) / BLOCKSIZE) * BLOCKSIZE, @@ -288,12 +289,15 @@ void expand_sparse (FILE *sfp, int ofd) { size_t i; - size_t maxbytes = 0; + off_t max_numbytes = 0; + size_t maxbytes; char *buffer; for (i = 0; i < sparse_map_size; i++) - if (maxbytes < sparse_map[i].numbytes) - maxbytes = sparse_map[i].numbytes; + if (max_numbytes < sparse_map[i].numbytes) + max_numbytes = sparse_map[i].numbytes; + + maxbytes = max_numbytes < SIZE_MAX ? max_numbytes : SIZE_MAX; for (buffer = malloc (maxbytes); !buffer; maxbytes /= 2) if (maxbytes == 0) @@ -301,7 +305,7 @@ expand_sparse (FILE *sfp, int ofd) for (i = 0; i < sparse_map_size; i++) { - size_t size = sparse_map[i].numbytes; + off_t size = sparse_map[i].numbytes; if (size == 0) ftruncate (ofd, sparse_map[i].offset);