]> Dogcows Code - chaz/tar/blobdiff - src/sparse.c
tar: don't assume O_NONBLOCK is benign on regular files
[chaz/tar] / src / sparse.c
index 9680b6052244cbb0904d5fedf9ba671995cbd1da..8e5ad284c243b0afa515a48084911a42b18948af 100644 (file)
@@ -230,7 +230,7 @@ sparse_scan_file (struct tar_sparse_file *file)
       if (!tar_sparse_scan (file, scan_begin, NULL))
        return false;
 
-      while ((count = safe_read (fd, buffer, sizeof buffer)) != 0
+      while ((count = blocking_read (fd, buffer, sizeof buffer)) != 0
             && count != SAFE_READ_ERROR)
        {
          /* Analyze the block.  */
@@ -360,7 +360,7 @@ sparse_extract_region (struct tar_sparse_file *file, size_t i)
          return false;
        }
       set_next_block_after (blk);
-      count = full_write (file->fd, blk->buffer, wrbytes);
+      count = blocking_write (file->fd, blk->buffer, wrbytes);
       write_size -= count;
       file->dumped_size += count;
       mv_size_left (file->stat_info->archive_file_size - file->dumped_size);
@@ -1029,8 +1029,11 @@ pax_dump_header_1 (struct tar_sparse_file *file)
   xheader_store ("GNU.sparse.name", file->stat_info, NULL);
   xheader_store ("GNU.sparse.realsize", file->stat_info, NULL);
 
-  file->stat_info->file_name = xheader_format_name (file->stat_info,
-                                           "%d/GNUSparseFile.%p/%f", 0);
+  file->stat_info->file_name =
+    xheader_format_name (file->stat_info, "%d/GNUSparseFile.%p/%f", 0);
+  /* Make sure the created header name is shorter than NAME_FIELD_SIZE: */
+  if (strlen (file->stat_info->file_name) > NAME_FIELD_SIZE)
+    file->stat_info->file_name[NAME_FIELD_SIZE] = 0;
 
   blk = start_header (file->stat_info);
   /* Store the effective (shrunken) file size */
This page took 0.022904 seconds and 4 git commands to generate.