]> Dogcows Code - chaz/tar/blobdiff - src/buffer.c
Carefully crafted invalid headers can cause buffer overrun.
[chaz/tar] / src / buffer.c
index e4225fe1e72e0a2739c93a3af6016c8f1953cd85..5977f5a56ed80b17ad6723646fcb46b405928d64 100644 (file)
@@ -17,7 +17,7 @@
 
    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
-   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 #include <system.h>
 
@@ -73,7 +73,6 @@ static bool hit_eof;
 static int checkpoint;
 
 static bool read_full_records = false;
-static bool reading_from_pipe = false;
 
 /* We're reading, but we just read the last block and it's time to update.
    Declared in update.c
@@ -126,23 +125,16 @@ double duration;
 void
 set_start_time ()
 {
-#if HAVE_CLOCK_GETTIME
-  if (clock_gettime (CLOCK_REALTIME, &start_timespec) != 0)
-#endif
-    start_time = time (0);
+  gettime (&start_time);
 }
 
 void
 compute_duration ()
 {
-#if HAVE_CLOCK_GETTIME
   struct timespec now;
-  if (clock_gettime (CLOCK_REALTIME, &now) == 0)
-    duration += ((now.tv_sec - start_timespec.tv_sec)
-                + (now.tv_nsec - start_timespec.tv_nsec) / 1e9);
-  else
-#endif
-    duration += time (NULL) - start_time;
+  gettime (&now);
+  duration += ((now.tv_sec - start_time.tv_sec)
+              + (now.tv_nsec - start_time.tv_nsec) / 1e9);
   set_start_time ();
 }
 
@@ -160,9 +152,9 @@ struct zip_magic
 {
   enum compress_type type;
   size_t length;
-  char magic[sizeof "BZh" - 1];
-  char program[sizeof "compress"];
-  char option[sizeof "-Z"];
+  char *magic;
+  char *program;
+  char *option;
 };
 
 static struct zip_magic const magic[] = {
@@ -182,21 +174,17 @@ enum compress_type
 check_compressed_archive ()
 {
   struct zip_magic const *p;
-  bool sfr, srp;
+  bool sfr;
 
   /* Prepare global data needed for find_next_block: */
   record_end = record_start; /* set up for 1st record = # 0 */
   sfr = read_full_records;
   read_full_records = true; /* Suppress fatal error on reading a partial
                               record */
-  srp = reading_from_pipe;
-  reading_from_pipe = true; /* Suppress warning message on reading a partial
-                              record */
   find_next_block ();
 
   /* Restore global values */
   read_full_records = sfr;
-  reading_from_pipe = srp;
 
   if (tar_checksum (record_start, true) == HEADER_SUCCESS)
     /* Probably a valid header */
@@ -236,7 +224,7 @@ open_compressed_archive ()
       /* Open compressed archive */
       use_compress_program_option = compress_program (type);
       child_pid = sys_child_open_for_uncompress ();
-      read_full_records = reading_from_pipe = true;
+      read_full_records = true;
     }
 
   records_read = 0;
@@ -406,7 +394,6 @@ open_archive (enum access_mode wanted_access)
   access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
 
   read_full_records = read_full_records_option;
-  reading_from_pipe = false;
 
   records_read = 0;
 
@@ -416,7 +403,7 @@ open_archive (enum access_mode wanted_access)
        {
        case ACCESS_READ:
          child_pid = sys_child_open_for_uncompress ();
-         read_full_records = reading_from_pipe = true;
+         read_full_records = true;
          record_end = record_start; /* set up for 1st record = # 0 */
          break;
 
@@ -548,7 +535,7 @@ open_archive (enum access_mode wanted_access)
            strip_trailing_slashes (current_stat_info.file_name);
 
          record_start->header.typeflag = GNUTYPE_VOLHDR;
-         TIME_TO_CHARS (start_time, record_start->header.mtime);
+         TIME_TO_CHARS (start_time.tv_sec, record_start->header.mtime);
          finish_header (&current_stat_info, record_start, -1);
        }
       break;
@@ -593,7 +580,9 @@ flush_write (void)
        {
          if (save_name)
            {
-             assign_string (&real_s_name, safer_name_suffix (save_name, false));
+             assign_string (&real_s_name,
+                            safer_name_suffix (save_name, false,
+                                               absolute_names_option));
              real_s_totsize = save_totsize;
              real_s_sizeleft = save_sizeleft;
            }
@@ -640,7 +629,7 @@ flush_write (void)
       memset (record_start, 0, BLOCKSIZE);
       sprintf (record_start->header.name, "%s Volume %d",
               volume_label_option, volno);
-      TIME_TO_CHARS (start_time, record_start->header.mtime);
+      TIME_TO_CHARS (start_time.tv_sec, record_start->header.mtime);
       record_start->header.typeflag = GNUTYPE_VOLHDR;
       finish_header (&current_stat_info, record_start, -1);
     }
@@ -653,8 +642,8 @@ flush_write (void)
        record_start++;
 
       if (strlen (real_s_name) > NAME_FIELD_SIZE)
-       FATAL_ERROR ((0, 0,
-                     _("%s: file name too long to be stored in a GNU multivolume header"),
+       WARN ((0, 0,
+             _("%s: file name too long to be stored in a GNU multivolume header, truncated"),
                      quotearg_colon (real_s_name)));
 
       memset (record_start, 0, BLOCKSIZE);
@@ -699,7 +688,9 @@ flush_write (void)
        assign_string (&real_s_name, 0);
       else
        {
-         assign_string (&real_s_name, safer_name_suffix (save_name, false));
+         assign_string (&real_s_name,
+                        safer_name_suffix (save_name, false,
+                                           absolute_names_option));
          real_s_sizeleft = save_sizeleft;
          real_s_totsize = save_totsize;
        }
@@ -760,20 +751,7 @@ short_read (size_t status)
          archive_read_error ();
 
       if (status == 0)
-       {
-         if (!reading_from_pipe)
-           {
-             char buf[UINTMAX_STRSIZE_BOUND];
-
-             WARN((0, 0,
-                   ngettext ("Read %s byte from %s",
-                             "Read %s bytes from %s",
-                             record_size - left),
-                   STRINGIFY_BIGINT (record_size - left, buf),
-                   *archive_name_cursor));
-           }
-         break;
-       }
+       break;
 
       if (! read_full_records)
        {
@@ -840,7 +818,9 @@ flush_read (void)
     {
       if (save_name)
        {
-         assign_string (&real_s_name, safer_name_suffix (save_name, false));
+         assign_string (&real_s_name,
+                        safer_name_suffix (save_name, false,
+                                           absolute_names_option));
          real_s_sizeleft = save_sizeleft;
          real_s_totsize = save_totsize;
        }
This page took 0.0281 seconds and 4 git commands to generate.