]> Dogcows Code - chaz/tar/blobdiff - src/xheader.c
A sweep of the sparse code prompted by a bug report by Jim Meyering.
[chaz/tar] / src / xheader.c
index e88934e85ec82823e8b6ee1ebcf55338b3feba46..dadaf5430276c39ae731d1a78a24fb177d72f943 100644 (file)
@@ -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));
     }
 }
 
This page took 0.024892 seconds and 4 git commands to generate.