]> Dogcows Code - chaz/tar/blob - src/list.c
Carefully crafted invalid headers can cause buffer overrun.
[chaz/tar] / src / list.c
1 /* List a tar archive, with support routines for reading a tar archive.
2
3 Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
4 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
5
6 Written by John Gilmore, on 1985-08-26.
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
21
22 #include <system.h>
23 #include <inttostr.h>
24 #include <quotearg.h>
25
26 #include "common.h"
27
28 #define max(a, b) ((a) < (b) ? (b) : (a))
29
30 union block *current_header; /* points to current archive header */
31 enum archive_format current_format; /* recognized format */
32 union block *recent_long_name; /* recent long name header and contents */
33 union block *recent_long_link; /* likewise, for long link */
34 size_t recent_long_name_blocks; /* number of blocks in recent_long_name */
35 size_t recent_long_link_blocks; /* likewise, for long link */
36
37 static uintmax_t from_header (const char *, size_t, const char *,
38 uintmax_t, uintmax_t, bool, bool);
39
40 /* Base 64 digits; see Internet RFC 2045 Table 1. */
41 static char const base_64_digits[64] =
42 {
43 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
44 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
45 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
46 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
47 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
48 };
49
50 /* Table of base-64 digit values indexed by unsigned chars.
51 The value is 64 for unsigned chars that are not base-64 digits. */
52 static char base64_map[UCHAR_MAX + 1];
53
54 static void
55 base64_init (void)
56 {
57 int i;
58 memset (base64_map, 64, sizeof base64_map);
59 for (i = 0; i < 64; i++)
60 base64_map[(int) base_64_digits[i]] = i;
61 }
62
63 /* Main loop for reading an archive. */
64 void
65 read_and (void (*do_something) (void))
66 {
67 enum read_header status = HEADER_STILL_UNREAD;
68 enum read_header prev_status;
69 struct timespec mtime;
70
71 base64_init ();
72 name_gather ();
73
74 open_archive (ACCESS_READ);
75 do
76 {
77 prev_status = status;
78 tar_stat_destroy (&current_stat_info);
79 xheader_destroy (&extended_header);
80
81 status = read_header (false);
82 switch (status)
83 {
84 case HEADER_STILL_UNREAD:
85 case HEADER_SUCCESS_EXTENDED:
86 abort ();
87
88 case HEADER_SUCCESS:
89
90 /* Valid header. We should decode next field (mode) first.
91 Ensure incoming names are null terminated. */
92
93 if (! name_match (current_stat_info.file_name)
94 || (NEWER_OPTION_INITIALIZED (newer_mtime_option)
95 /* FIXME: We get mtime now, and again later; this causes
96 duplicate diagnostics if header.mtime is bogus. */
97 && ((mtime.tv_sec
98 = TIME_FROM_HEADER (current_header->header.mtime)),
99 /* FIXME: Grab fractional time stamps from
100 extended header. */
101 mtime.tv_nsec = 0,
102 set_stat_mtime (&current_stat_info.stat, mtime),
103 OLDER_STAT_TIME (current_stat_info.stat, m)))
104 || excluded_name (current_stat_info.file_name))
105 {
106 switch (current_header->header.typeflag)
107 {
108 case GNUTYPE_VOLHDR:
109 case GNUTYPE_MULTIVOL:
110 case GNUTYPE_NAMES:
111 break;
112
113 case DIRTYPE:
114 if (show_omitted_dirs_option)
115 WARN ((0, 0, _("%s: Omitting"),
116 quotearg_colon (current_stat_info.file_name)));
117 /* Fall through. */
118 default:
119 decode_header (current_header,
120 &current_stat_info, &current_format, 0);
121 skip_member ();
122 continue;
123 }
124 }
125
126 (*do_something) ();
127 continue;
128
129 case HEADER_ZERO_BLOCK:
130 if (block_number_option)
131 {
132 char buf[UINTMAX_STRSIZE_BOUND];
133 fprintf (stdlis, _("block %s: ** Block of NULs **\n"),
134 STRINGIFY_BIGINT (current_block_ordinal (), buf));
135 }
136
137 set_next_block_after (current_header);
138
139 if (!ignore_zeros_option)
140 {
141 char buf[UINTMAX_STRSIZE_BOUND];
142
143 status = read_header (false);
144 if (status == HEADER_ZERO_BLOCK)
145 break;
146 WARN ((0, 0, _("A lone zero block at %s"),
147 STRINGIFY_BIGINT (current_block_ordinal (), buf)));
148 break;
149 }
150 status = prev_status;
151 continue;
152
153 case HEADER_END_OF_FILE:
154 if (block_number_option)
155 {
156 char buf[UINTMAX_STRSIZE_BOUND];
157 fprintf (stdlis, _("block %s: ** End of File **\n"),
158 STRINGIFY_BIGINT (current_block_ordinal (), buf));
159 }
160 break;
161
162 case HEADER_FAILURE:
163 /* If the previous header was good, tell them that we are
164 skipping bad ones. */
165 set_next_block_after (current_header);
166 switch (prev_status)
167 {
168 case HEADER_STILL_UNREAD:
169 ERROR ((0, 0, _("This does not look like a tar archive")));
170 /* Fall through. */
171
172 case HEADER_ZERO_BLOCK:
173 case HEADER_SUCCESS:
174 if (block_number_option)
175 {
176 char buf[UINTMAX_STRSIZE_BOUND];
177 off_t block_ordinal = current_block_ordinal ();
178 block_ordinal -= recent_long_name_blocks;
179 block_ordinal -= recent_long_link_blocks;
180 fprintf (stdlis, _("block %s: "),
181 STRINGIFY_BIGINT (block_ordinal, buf));
182 }
183 ERROR ((0, 0, _("Skipping to next header")));
184 break;
185
186 case HEADER_END_OF_FILE:
187 case HEADER_FAILURE:
188 /* We are in the middle of a cascade of errors. */
189 break;
190
191 case HEADER_SUCCESS_EXTENDED:
192 abort ();
193 }
194 continue;
195 }
196 break;
197 }
198 while (!all_names_found (&current_stat_info));
199
200 close_archive ();
201 names_notfound (); /* print names not found */
202 }
203
204 /* Print a header block, based on tar options. */
205 void
206 list_archive (void)
207 {
208 /* Print the header block. */
209
210 decode_header (current_header, &current_stat_info, &current_format, 0);
211 if (verbose_option)
212 print_header (&current_stat_info, -1);
213
214 if (incremental_option && current_header->header.typeflag == GNUTYPE_DUMPDIR)
215 {
216 off_t size;
217 size_t written, check;
218 union block *data_block;
219
220 set_next_block_after (current_header);
221 if (multi_volume_option)
222 {
223 assign_string (&save_name, current_stat_info.orig_file_name);
224 save_totsize = current_stat_info.stat.st_size;
225 }
226 for (size = current_stat_info.stat.st_size; size > 0; size -= written)
227 {
228 if (multi_volume_option)
229 save_sizeleft = size;
230 data_block = find_next_block ();
231 if (!data_block)
232 {
233 ERROR ((0, 0, _("Unexpected EOF in archive")));
234 break; /* FIXME: What happens, then? */
235 }
236 written = available_space_after (data_block);
237 if (written > size)
238 written = size;
239 errno = 0;
240 check = fwrite (data_block->buffer, sizeof (char), written, stdlis);
241 set_next_block_after ((union block *)
242 (data_block->buffer + written - 1));
243 if (check != written)
244 {
245 write_error_details (current_stat_info.file_name, check, written);
246 skip_file (size - written);
247 break;
248 }
249 }
250 if (multi_volume_option)
251 assign_string (&save_name, 0);
252 fputc ('\n', stdlis);
253 fflush (stdlis);
254 return;
255
256 }
257
258 if (multi_volume_option)
259 assign_string (&save_name, current_stat_info.orig_file_name);
260
261 skip_member ();
262
263 if (multi_volume_option)
264 assign_string (&save_name, 0);
265 }
266
267 /* Check header checksum */
268 /* The standard BSD tar sources create the checksum by adding up the
269 bytes in the header as type char. I think the type char was unsigned
270 on the PDP-11, but it's signed on the Next and Sun. It looks like the
271 sources to BSD tar were never changed to compute the checksum
272 correctly, so both the Sun and Next add the bytes of the header as
273 signed chars. This doesn't cause a problem until you get a file with
274 a name containing characters with the high bit set. So tar_checksum
275 computes two checksums -- signed and unsigned. */
276
277 enum read_header
278 tar_checksum (union block *header, bool silent)
279 {
280 size_t i;
281 int unsigned_sum = 0; /* the POSIX one :-) */
282 int signed_sum = 0; /* the Sun one :-( */
283 int recorded_sum;
284 uintmax_t parsed_sum;
285 char *p;
286
287 p = header->buffer;
288 for (i = sizeof *header; i-- != 0;)
289 {
290 unsigned_sum += (unsigned char) *p;
291 signed_sum += (signed char) (*p++);
292 }
293
294 if (unsigned_sum == 0)
295 return HEADER_ZERO_BLOCK;
296
297 /* Adjust checksum to count the "chksum" field as blanks. */
298
299 for (i = sizeof header->header.chksum; i-- != 0;)
300 {
301 unsigned_sum -= (unsigned char) header->header.chksum[i];
302 signed_sum -= (signed char) (header->header.chksum[i]);
303 }
304 unsigned_sum += ' ' * sizeof header->header.chksum;
305 signed_sum += ' ' * sizeof header->header.chksum;
306
307 parsed_sum = from_header (header->header.chksum,
308 sizeof header->header.chksum, 0,
309 (uintmax_t) 0,
310 (uintmax_t) TYPE_MAXIMUM (int), true, silent);
311 if (parsed_sum == (uintmax_t) -1)
312 return HEADER_FAILURE;
313
314 recorded_sum = parsed_sum;
315
316 if (unsigned_sum != recorded_sum && signed_sum != recorded_sum)
317 return HEADER_FAILURE;
318
319 return HEADER_SUCCESS;
320 }
321
322 /* Read a block that's supposed to be a header block. Return its
323 address in "current_header", and if it is good, the file's size in
324 current_stat_info.stat.st_size.
325
326 Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a
327 block full of zeros (EOF marker).
328
329 If RAW_EXTENDED_HEADERS is nonzero, do not automagically fold the
330 GNU long name and link headers into later headers.
331
332 You must always set_next_block_after(current_header) to skip past
333 the header which this routine reads. */
334
335 enum read_header
336 read_header (bool raw_extended_headers)
337 {
338 union block *header;
339 union block *header_copy;
340 char *bp;
341 union block *data_block;
342 size_t size, written;
343 union block *next_long_name = 0;
344 union block *next_long_link = 0;
345 size_t next_long_name_blocks;
346 size_t next_long_link_blocks;
347
348 while (1)
349 {
350 enum read_header status;
351
352 header = find_next_block ();
353 current_header = header;
354 if (!header)
355 return HEADER_END_OF_FILE;
356
357 if ((status = tar_checksum (header, false)) != HEADER_SUCCESS)
358 return status;
359
360 /* Good block. Decode file size and return. */
361
362 if (header->header.typeflag == LNKTYPE)
363 current_stat_info.stat.st_size = 0; /* links 0 size on tape */
364 else
365 current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size);
366
367 if (header->header.typeflag == GNUTYPE_LONGNAME
368 || header->header.typeflag == GNUTYPE_LONGLINK
369 || header->header.typeflag == XHDTYPE
370 || header->header.typeflag == XGLTYPE
371 || header->header.typeflag == SOLARIS_XHDTYPE)
372 {
373 if (raw_extended_headers)
374 return HEADER_SUCCESS_EXTENDED;
375 else if (header->header.typeflag == GNUTYPE_LONGNAME
376 || header->header.typeflag == GNUTYPE_LONGLINK)
377 {
378 size_t name_size = current_stat_info.stat.st_size;
379 size_t n = name_size % BLOCKSIZE;
380 size = name_size + BLOCKSIZE;
381 if (n)
382 size += BLOCKSIZE - n;
383
384 if (name_size != current_stat_info.stat.st_size
385 || size < name_size)
386 xalloc_die ();
387
388 header_copy = xmalloc (size + 1);
389
390 if (header->header.typeflag == GNUTYPE_LONGNAME)
391 {
392 if (next_long_name)
393 free (next_long_name);
394 next_long_name = header_copy;
395 next_long_name_blocks = size / BLOCKSIZE;
396 }
397 else
398 {
399 if (next_long_link)
400 free (next_long_link);
401 next_long_link = header_copy;
402 next_long_link_blocks = size / BLOCKSIZE;
403 }
404
405 set_next_block_after (header);
406 *header_copy = *header;
407 bp = header_copy->buffer + BLOCKSIZE;
408
409 for (size -= BLOCKSIZE; size > 0; size -= written)
410 {
411 data_block = find_next_block ();
412 if (! data_block)
413 {
414 ERROR ((0, 0, _("Unexpected EOF in archive")));
415 break;
416 }
417 written = available_space_after (data_block);
418 if (written > size)
419 written = size;
420
421 memcpy (bp, data_block->buffer, written);
422 bp += written;
423 set_next_block_after ((union block *)
424 (data_block->buffer + written - 1));
425 }
426
427 *bp = '\0';
428 }
429 else if (header->header.typeflag == XHDTYPE
430 || header->header.typeflag == SOLARIS_XHDTYPE)
431 xheader_read (header, OFF_FROM_HEADER (header->header.size));
432 else if (header->header.typeflag == XGLTYPE)
433 {
434 xheader_read (header, OFF_FROM_HEADER (header->header.size));
435 xheader_decode_global ();
436 }
437
438 /* Loop! */
439
440 }
441 else
442 {
443 char const *name;
444 struct posix_header const *h = &current_header->header;
445 char namebuf[sizeof h->prefix + 1 + NAME_FIELD_SIZE + 1];
446
447 if (recent_long_name)
448 free (recent_long_name);
449
450 if (next_long_name)
451 {
452 name = next_long_name->buffer + BLOCKSIZE;
453 recent_long_name = next_long_name;
454 recent_long_name_blocks = next_long_name_blocks;
455 }
456 else
457 {
458 /* Accept file names as specified by POSIX.1-1996
459 section 10.1.1. */
460 char *np = namebuf;
461
462 if (h->prefix[0] && strcmp (h->magic, TMAGIC) == 0)
463 {
464 memcpy (np, h->prefix, sizeof h->prefix);
465 np[sizeof h->prefix] = '\0';
466 np += strlen (np);
467 *np++ = '/';
468 }
469 memcpy (np, h->name, sizeof h->name);
470 np[sizeof h->name] = '\0';
471 name = namebuf;
472 recent_long_name = 0;
473 recent_long_name_blocks = 0;
474 }
475 assign_string (&current_stat_info.orig_file_name, name);
476 assign_string (&current_stat_info.file_name, name);
477 current_stat_info.had_trailing_slash = strip_trailing_slashes (current_stat_info.file_name);
478
479 if (recent_long_link)
480 free (recent_long_link);
481
482 if (next_long_link)
483 {
484 name = next_long_link->buffer + BLOCKSIZE;
485 recent_long_link = next_long_link;
486 recent_long_link_blocks = next_long_link_blocks;
487 }
488 else
489 {
490 memcpy (namebuf, h->linkname, sizeof h->linkname);
491 namebuf[sizeof h->linkname] = '\0';
492 name = namebuf;
493 recent_long_link = 0;
494 recent_long_link_blocks = 0;
495 }
496 assign_string (&current_stat_info.link_name, name);
497
498 return HEADER_SUCCESS;
499 }
500 }
501 }
502
503 #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
504
505 /* Decode things from a file HEADER block into STAT_INFO, also setting
506 *FORMAT_POINTER depending on the header block format. If
507 DO_USER_GROUP, decode the user/group information (this is useful
508 for extraction, but waste time when merely listing).
509
510 read_header() has already decoded the checksum and length, so we don't.
511
512 This routine should *not* be called twice for the same block, since
513 the two calls might use different DO_USER_GROUP values and thus
514 might end up with different uid/gid for the two calls. If anybody
515 wants the uid/gid they should decode it first, and other callers
516 should decode it without uid/gid before calling a routine,
517 e.g. print_header, that assumes decoded data. */
518 void
519 decode_header (union block *header, struct tar_stat_info *stat_info,
520 enum archive_format *format_pointer, int do_user_group)
521 {
522 enum archive_format format;
523 struct timespec atime;
524 struct timespec ctime;
525 struct timespec mtime;
526
527 if (strcmp (header->header.magic, TMAGIC) == 0)
528 {
529 if (header->star_header.prefix[130] == 0
530 && ISOCTAL (header->star_header.atime[0])
531 && header->star_header.atime[11] == ' '
532 && ISOCTAL (header->star_header.ctime[0])
533 && header->star_header.ctime[11] == ' ')
534 format = STAR_FORMAT;
535 else if (extended_header.size)
536 format = POSIX_FORMAT;
537 else
538 format = USTAR_FORMAT;
539 }
540 else if (strcmp (header->header.magic, OLDGNU_MAGIC) == 0)
541 format = OLDGNU_FORMAT;
542 else
543 format = V7_FORMAT;
544 *format_pointer = format;
545
546 stat_info->stat.st_mode = MODE_FROM_HEADER (header->header.mode);
547 mtime.tv_sec = TIME_FROM_HEADER (header->header.mtime);
548 mtime.tv_nsec = 0;
549 set_stat_mtime (&stat_info->stat, mtime);
550 assign_string (&stat_info->uname,
551 header->header.uname[0] ? header->header.uname : NULL);
552 assign_string (&stat_info->gname,
553 header->header.gname[0] ? header->header.gname : NULL);
554
555 if (format == OLDGNU_FORMAT && incremental_option)
556 {
557 atime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.atime);
558 ctime.tv_sec = TIME_FROM_HEADER (header->oldgnu_header.ctime);
559 atime.tv_nsec = ctime.tv_nsec = 0;
560 }
561 else if (format == STAR_FORMAT)
562 {
563 atime.tv_sec = TIME_FROM_HEADER (header->star_header.atime);
564 ctime.tv_sec = TIME_FROM_HEADER (header->star_header.ctime);
565 atime.tv_nsec = ctime.tv_nsec = 0;
566 }
567 else
568 atime = ctime = start_time;
569
570 set_stat_atime (&stat_info->stat, atime);
571 set_stat_ctime (&stat_info->stat, ctime);
572
573 if (format == V7_FORMAT)
574 {
575 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
576 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
577 stat_info->stat.st_rdev = 0;
578 }
579 else
580 {
581 if (do_user_group)
582 {
583 /* FIXME: Decide if this should somewhat depend on -p. */
584
585 if (numeric_owner_option
586 || !*header->header.uname
587 || !uname_to_uid (header->header.uname, &stat_info->stat.st_uid))
588 stat_info->stat.st_uid = UID_FROM_HEADER (header->header.uid);
589
590 if (numeric_owner_option
591 || !*header->header.gname
592 || !gname_to_gid (header->header.gname, &stat_info->stat.st_gid))
593 stat_info->stat.st_gid = GID_FROM_HEADER (header->header.gid);
594 }
595
596 switch (header->header.typeflag)
597 {
598 case BLKTYPE:
599 case CHRTYPE:
600 stat_info->stat.st_rdev =
601 makedev (MAJOR_FROM_HEADER (header->header.devmajor),
602 MINOR_FROM_HEADER (header->header.devminor));
603 break;
604
605 default:
606 stat_info->stat.st_rdev = 0;
607 }
608 }
609
610 stat_info->archive_file_size = stat_info->stat.st_size;
611 xheader_decode (stat_info);
612
613 if (sparse_member_p (stat_info))
614 {
615 sparse_fixup_header (stat_info);
616 stat_info->is_sparse = true;
617 }
618 else
619 stat_info->is_sparse = false;
620 }
621
622 /* Convert buffer at WHERE0 of size DIGS from external format to
623 uintmax_t. DIGS must be positive. If TYPE is nonnull, the data
624 are of type TYPE. The buffer must represent a value in the range
625 -MINUS_MINVAL through MAXVAL. If OCTAL_ONLY, allow only octal
626 numbers instead of the other GNU extensions. Return -1 on error,
627 diagnosing the error if TYPE is nonnull and if !SILENT. */
628 static uintmax_t
629 from_header (char const *where0, size_t digs, char const *type,
630 uintmax_t minus_minval, uintmax_t maxval,
631 bool octal_only, bool silent)
632 {
633 uintmax_t value;
634 char const *where = where0;
635 char const *lim = where + digs;
636 int negative = 0;
637
638 /* Accommodate buggy tar of unknown vintage, which outputs leading
639 NUL if the previous field overflows. */
640 where += !*where;
641
642 /* Accommodate older tars, which output leading spaces. */
643 for (;;)
644 {
645 if (where == lim)
646 {
647 if (type && !silent)
648 ERROR ((0, 0,
649 /* TRANSLATORS: %s is type of the value (gid_t, uid_t, etc.) */
650 _("Blanks in header where numeric %s value expected"),
651 type));
652 return -1;
653 }
654 if (!ISSPACE ((unsigned char) *where))
655 break;
656 where++;
657 }
658
659 value = 0;
660 if (ISODIGIT (*where))
661 {
662 char const *where1 = where;
663 uintmax_t overflow = 0;
664
665 for (;;)
666 {
667 value += *where++ - '0';
668 if (where == lim || ! ISODIGIT (*where))
669 break;
670 overflow |= value ^ (value << LG_8 >> LG_8);
671 value <<= LG_8;
672 }
673
674 /* Parse the output of older, unportable tars, which generate
675 negative values in two's complement octal. If the leading
676 nonzero digit is 1, we can't recover the original value
677 reliably; so do this only if the digit is 2 or more. This
678 catches the common case of 32-bit negative time stamps. */
679 if ((overflow || maxval < value) && '2' <= *where1 && type)
680 {
681 /* Compute the negative of the input value, assuming two's
682 complement. */
683 int digit = (*where1 - '0') | 4;
684 overflow = 0;
685 value = 0;
686 where = where1;
687 for (;;)
688 {
689 value += 7 - digit;
690 where++;
691 if (where == lim || ! ISODIGIT (*where))
692 break;
693 digit = *where - '0';
694 overflow |= value ^ (value << LG_8 >> LG_8);
695 value <<= LG_8;
696 }
697 value++;
698 overflow |= !value;
699
700 if (!overflow && value <= minus_minval)
701 {
702 if (!silent)
703 WARN ((0, 0,
704 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
705 _("Archive octal value %.*s is out of %s range; assuming two's complement"),
706 (int) (where - where1), where1, type));
707 negative = 1;
708 }
709 }
710
711 if (overflow)
712 {
713 if (type && !silent)
714 ERROR ((0, 0,
715 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
716 _("Archive octal value %.*s is out of %s range"),
717 (int) (where - where1), where1, type));
718 return -1;
719 }
720 }
721 else if (octal_only)
722 {
723 /* Suppress the following extensions. */
724 }
725 else if (*where == '-' || *where == '+')
726 {
727 /* Parse base-64 output produced only by tar test versions
728 1.13.6 (1999-08-11) through 1.13.11 (1999-08-23).
729 Support for this will be withdrawn in future releases. */
730 int dig;
731 if (!silent)
732 {
733 static bool warned_once;
734 if (! warned_once)
735 {
736 warned_once = true;
737 WARN ((0, 0, _("Archive contains obsolescent base-64 headers")));
738 }
739 }
740 negative = *where++ == '-';
741 while (where != lim
742 && (dig = base64_map[(unsigned char) *where]) < 64)
743 {
744 if (value << LG_64 >> LG_64 != value)
745 {
746 char *string = alloca (digs + 1);
747 memcpy (string, where0, digs);
748 string[digs] = '\0';
749 if (type && !silent)
750 ERROR ((0, 0,
751 _("Archive signed base-64 string %s is out of %s range"),
752 quote (string), type));
753 return -1;
754 }
755 value = (value << LG_64) | dig;
756 where++;
757 }
758 }
759 else if (*where == '\200' /* positive base-256 */
760 || *where == '\377' /* negative base-256 */)
761 {
762 /* Parse base-256 output. A nonnegative number N is
763 represented as (256**DIGS)/2 + N; a negative number -N is
764 represented as (256**DIGS) - N, i.e. as two's complement.
765 The representation guarantees that the leading bit is
766 always on, so that we don't confuse this format with the
767 others (assuming ASCII bytes of 8 bits or more). */
768 int signbit = *where & (1 << (LG_256 - 2));
769 uintmax_t topbits = (((uintmax_t) - signbit)
770 << (CHAR_BIT * sizeof (uintmax_t)
771 - LG_256 - (LG_256 - 2)));
772 value = (*where++ & ((1 << (LG_256 - 2)) - 1)) - signbit;
773 for (;;)
774 {
775 value = (value << LG_256) + (unsigned char) *where++;
776 if (where == lim)
777 break;
778 if (((value << LG_256 >> LG_256) | topbits) != value)
779 {
780 if (type && !silent)
781 ERROR ((0, 0,
782 _("Archive base-256 value is out of %s range"),
783 type));
784 return -1;
785 }
786 }
787 negative = signbit;
788 if (negative)
789 value = -value;
790 }
791
792 if (where != lim && *where && !ISSPACE ((unsigned char) *where))
793 {
794 if (type)
795 {
796 char buf[1000]; /* Big enough to represent any header. */
797 static struct quoting_options *o;
798
799 if (!o)
800 {
801 o = clone_quoting_options (0);
802 set_quoting_style (o, locale_quoting_style);
803 }
804
805 while (where0 != lim && ! lim[-1])
806 lim--;
807 quotearg_buffer (buf, sizeof buf, where0, lim - where, o);
808 if (!silent)
809 ERROR ((0, 0,
810 /* TRANSLATORS: Second %s is a type name (gid_t,uid_t,etc.) */
811 _("Archive contains %.*s where numeric %s value expected"),
812 (int) sizeof buf, buf, type));
813 }
814
815 return -1;
816 }
817
818 if (value <= (negative ? minus_minval : maxval))
819 return negative ? -value : value;
820
821 if (type && !silent)
822 {
823 char minval_buf[UINTMAX_STRSIZE_BOUND + 1];
824 char maxval_buf[UINTMAX_STRSIZE_BOUND];
825 char value_buf[UINTMAX_STRSIZE_BOUND + 1];
826 char *minval_string = STRINGIFY_BIGINT (minus_minval, minval_buf + 1);
827 char *value_string = STRINGIFY_BIGINT (value, value_buf + 1);
828 if (negative)
829 *--value_string = '-';
830 if (minus_minval)
831 *--minval_string = '-';
832 /* TRANSLATORS: Second %s is type name (gid_t,uid_t,etc.) */
833 ERROR ((0, 0, _("Archive value %s is out of %s range %s..%s"),
834 value_string, type,
835 minval_string, STRINGIFY_BIGINT (maxval, maxval_buf)));
836 }
837
838 return -1;
839 }
840
841 gid_t
842 gid_from_header (const char *p, size_t s)
843 {
844 return from_header (p, s, "gid_t",
845 - (uintmax_t) TYPE_MINIMUM (gid_t),
846 (uintmax_t) TYPE_MAXIMUM (gid_t),
847 false, false);
848 }
849
850 major_t
851 major_from_header (const char *p, size_t s)
852 {
853 return from_header (p, s, "major_t",
854 - (uintmax_t) TYPE_MINIMUM (major_t),
855 (uintmax_t) TYPE_MAXIMUM (major_t), false, false);
856 }
857
858 minor_t
859 minor_from_header (const char *p, size_t s)
860 {
861 return from_header (p, s, "minor_t",
862 - (uintmax_t) TYPE_MINIMUM (minor_t),
863 (uintmax_t) TYPE_MAXIMUM (minor_t), false, false);
864 }
865
866 mode_t
867 mode_from_header (const char *p, size_t s)
868 {
869 /* Do not complain about unrecognized mode bits. */
870 unsigned u = from_header (p, s, "mode_t",
871 - (uintmax_t) TYPE_MINIMUM (mode_t),
872 TYPE_MAXIMUM (uintmax_t), false, false);
873 return ((u & TSUID ? S_ISUID : 0)
874 | (u & TSGID ? S_ISGID : 0)
875 | (u & TSVTX ? S_ISVTX : 0)
876 | (u & TUREAD ? S_IRUSR : 0)
877 | (u & TUWRITE ? S_IWUSR : 0)
878 | (u & TUEXEC ? S_IXUSR : 0)
879 | (u & TGREAD ? S_IRGRP : 0)
880 | (u & TGWRITE ? S_IWGRP : 0)
881 | (u & TGEXEC ? S_IXGRP : 0)
882 | (u & TOREAD ? S_IROTH : 0)
883 | (u & TOWRITE ? S_IWOTH : 0)
884 | (u & TOEXEC ? S_IXOTH : 0));
885 }
886
887 off_t
888 off_from_header (const char *p, size_t s)
889 {
890 /* Negative offsets are not allowed in tar files, so invoke
891 from_header with minimum value 0, not TYPE_MINIMUM (off_t). */
892 return from_header (p, s, "off_t", (uintmax_t) 0,
893 (uintmax_t) TYPE_MAXIMUM (off_t), false, false);
894 }
895
896 size_t
897 size_from_header (const char *p, size_t s)
898 {
899 return from_header (p, s, "size_t", (uintmax_t) 0,
900 (uintmax_t) TYPE_MAXIMUM (size_t), false, false);
901 }
902
903 time_t
904 time_from_header (const char *p, size_t s)
905 {
906 return from_header (p, s, "time_t",
907 - (uintmax_t) TYPE_MINIMUM (time_t),
908 (uintmax_t) TYPE_MAXIMUM (time_t), false, false);
909 }
910
911 uid_t
912 uid_from_header (const char *p, size_t s)
913 {
914 return from_header (p, s, "uid_t",
915 - (uintmax_t) TYPE_MINIMUM (uid_t),
916 (uintmax_t) TYPE_MAXIMUM (uid_t), false, false);
917 }
918
919 uintmax_t
920 uintmax_from_header (const char *p, size_t s)
921 {
922 return from_header (p, s, "uintmax_t", (uintmax_t) 0,
923 TYPE_MAXIMUM (uintmax_t), false, false);
924 }
925
926
927 /* Return a printable representation of T. The result points to
928 static storage that can be reused in the next call to this
929 function, to ctime, or to asctime. If FULL_TIME, then output the
930 time stamp to its full resolution; otherwise, just output it to
931 1-minute resolution. */
932 char const *
933 tartime (struct timespec t, bool full_time)
934 {
935 enum { fraclen = sizeof ".FFFFFFFFF" - 1 };
936 static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
937 INT_STRLEN_BOUND (int) + 16)
938 + fraclen];
939 struct tm *tm;
940 time_t s = t.tv_sec;
941 int ns = t.tv_nsec;
942 bool negative = s < 0;
943 char *p;
944
945 if (negative && ns != 0)
946 {
947 s++;
948 ns = 1000000000 - ns;
949 }
950
951 tm = utc_option ? gmtime (&s) : localtime (&s);
952 if (tm)
953 {
954 if (full_time)
955 {
956 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d:%02d",
957 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
958 tm->tm_hour, tm->tm_min, tm->tm_sec);
959 code_ns_fraction (ns, buffer + strlen (buffer));
960 }
961 else
962 sprintf (buffer, "%04ld-%02d-%02d %02d:%02d",
963 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
964 tm->tm_hour, tm->tm_min);
965 return buffer;
966 }
967
968 /* The time stamp cannot be broken down, most likely because it
969 is out of range. Convert it as an integer,
970 right-adjusted in a field with the same width as the usual
971 4-year ISO time format. */
972 p = umaxtostr (negative ? - (uintmax_t) s : s,
973 buffer + sizeof buffer - UINTMAX_STRSIZE_BOUND - fraclen);
974 if (negative)
975 *--p = '-';
976 while ((buffer + sizeof buffer - sizeof "YYYY-MM-DD HH:MM"
977 + (full_time ? sizeof ":SS.FFFFFFFFF" - 1 : 0))
978 < p)
979 *--p = ' ';
980 if (full_time)
981 code_ns_fraction (ns, buffer + sizeof buffer - 1 - fraclen);
982 return p;
983 }
984
985 /* Actually print it.
986
987 Plain and fancy file header block logging. Non-verbose just prints
988 the name, e.g. for "tar t" or "tar x". This should just contain
989 file names, so it can be fed back into tar with xargs or the "-T"
990 option. The verbose option can give a bunch of info, one line per
991 file. I doubt anybody tries to parse its format, or if they do,
992 they shouldn't. Unix tar is pretty random here anyway. */
993
994
995 /* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
996 HEAD_STANDARD, which must be set up in advance. Not very clean.. */
997
998 /* Width of "user/group size", with initial value chosen
999 heuristically. This grows as needed, though this may cause some
1000 stairstepping in the output. Make it too small and the output will
1001 almost always look ragged. Make it too large and the output will
1002 be spaced out too far. */
1003 static int ugswidth = 19;
1004
1005 /* Width of printed time stamps. It grows if longer time stamps are
1006 found (typically, those with nanosecond resolution). Like
1007 USGWIDTH, some stairstepping may occur. */
1008 static int datewidth = sizeof "YYYY-MM-DD HH:MM" - 1;
1009
1010 void
1011 print_header (struct tar_stat_info *st, off_t block_ordinal)
1012 {
1013 char modes[11];
1014 char const *time_stamp;
1015 int time_stamp_len;
1016 char *temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
1017
1018 /* These hold formatted ints. */
1019 char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND];
1020 char *user, *group;
1021 char size[2 * UINTMAX_STRSIZE_BOUND];
1022 /* holds formatted size or major,minor */
1023 char uintbuf[UINTMAX_STRSIZE_BOUND];
1024 int pad;
1025 int sizelen;
1026
1027 if (block_number_option)
1028 {
1029 char buf[UINTMAX_STRSIZE_BOUND];
1030 if (block_ordinal < 0)
1031 block_ordinal = current_block_ordinal ();
1032 block_ordinal -= recent_long_name_blocks;
1033 block_ordinal -= recent_long_link_blocks;
1034 fprintf (stdlis, _("block %s: "),
1035 STRINGIFY_BIGINT (block_ordinal, buf));
1036 }
1037
1038 if (verbose_option <= 1)
1039 {
1040 /* Just the fax, mam. */
1041 fprintf (stdlis, "%s\n", quotearg (temp_name));
1042 }
1043 else
1044 {
1045 /* File type and modes. */
1046
1047 modes[0] = '?';
1048 switch (current_header->header.typeflag)
1049 {
1050 case GNUTYPE_VOLHDR:
1051 modes[0] = 'V';
1052 break;
1053
1054 case GNUTYPE_MULTIVOL:
1055 modes[0] = 'M';
1056 break;
1057
1058 case GNUTYPE_NAMES:
1059 modes[0] = 'N';
1060 break;
1061
1062 case GNUTYPE_LONGNAME:
1063 case GNUTYPE_LONGLINK:
1064 modes[0] = 'L';
1065 ERROR ((0, 0, _("Unexpected long name header")));
1066 break;
1067
1068 case GNUTYPE_SPARSE:
1069 case REGTYPE:
1070 case AREGTYPE:
1071 modes[0] = '-';
1072 if (temp_name[strlen (temp_name) - 1] == '/')
1073 modes[0] = 'd';
1074 break;
1075 case LNKTYPE:
1076 modes[0] = 'h';
1077 break;
1078 case GNUTYPE_DUMPDIR:
1079 modes[0] = 'd';
1080 break;
1081 case DIRTYPE:
1082 modes[0] = 'd';
1083 break;
1084 case SYMTYPE:
1085 modes[0] = 'l';
1086 break;
1087 case BLKTYPE:
1088 modes[0] = 'b';
1089 break;
1090 case CHRTYPE:
1091 modes[0] = 'c';
1092 break;
1093 case FIFOTYPE:
1094 modes[0] = 'p';
1095 break;
1096 case CONTTYPE:
1097 modes[0] = 'C';
1098 break;
1099 }
1100
1101 pax_decode_mode (st->stat.st_mode, modes + 1);
1102
1103 /* Time stamp. */
1104
1105 time_stamp = tartime (get_stat_mtime (&st->stat), false);
1106 time_stamp_len = strlen (time_stamp);
1107 if (datewidth < time_stamp_len)
1108 datewidth = time_stamp_len;
1109
1110 /* User and group names. */
1111
1112 if (st->uname
1113 && st->uname[0]
1114 && current_format != V7_FORMAT
1115 && !numeric_owner_option)
1116 user = st->uname;
1117 else
1118 {
1119 /* Try parsing it as an unsigned integer first, and as a
1120 uid_t if that fails. This method can list positive user
1121 ids that are too large to fit in a uid_t. */
1122 uintmax_t u = from_header (current_header->header.uid,
1123 sizeof current_header->header.uid, 0,
1124 (uintmax_t) 0,
1125 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1126 false, false);
1127 if (u != -1)
1128 user = STRINGIFY_BIGINT (u, uform);
1129 else
1130 {
1131 sprintf (uform, "%ld",
1132 (long) UID_FROM_HEADER (current_header->header.uid));
1133 user = uform;
1134 }
1135 }
1136
1137 if (st->gname
1138 && st->gname[0]
1139 && current_format != V7_FORMAT
1140 && !numeric_owner_option)
1141 group = st->gname;
1142 else
1143 {
1144 /* Try parsing it as an unsigned integer first, and as a
1145 gid_t if that fails. This method can list positive group
1146 ids that are too large to fit in a gid_t. */
1147 uintmax_t g = from_header (current_header->header.gid,
1148 sizeof current_header->header.gid, 0,
1149 (uintmax_t) 0,
1150 (uintmax_t) TYPE_MAXIMUM (uintmax_t),
1151 false, false);
1152 if (g != -1)
1153 group = STRINGIFY_BIGINT (g, gform);
1154 else
1155 {
1156 sprintf (gform, "%ld",
1157 (long) GID_FROM_HEADER (current_header->header.gid));
1158 group = gform;
1159 }
1160 }
1161
1162 /* Format the file size or major/minor device numbers. */
1163
1164 switch (current_header->header.typeflag)
1165 {
1166 case CHRTYPE:
1167 case BLKTYPE:
1168 strcpy (size,
1169 STRINGIFY_BIGINT (major (st->stat.st_rdev), uintbuf));
1170 strcat (size, ",");
1171 strcat (size,
1172 STRINGIFY_BIGINT (minor (st->stat.st_rdev), uintbuf));
1173 break;
1174
1175 default:
1176 /* st->stat.st_size keeps stored file size */
1177 strcpy (size, STRINGIFY_BIGINT (st->stat.st_size, uintbuf));
1178 break;
1179 }
1180
1181 /* Figure out padding and print the whole line. */
1182
1183 sizelen = strlen (size);
1184 pad = strlen (user) + 1 + strlen (group) + 1 + sizelen;
1185 if (pad > ugswidth)
1186 ugswidth = pad;
1187
1188 fprintf (stdlis, "%s %s/%s %*s %-*s",
1189 modes, user, group, ugswidth - pad + sizelen, size,
1190 datewidth, time_stamp);
1191
1192 fprintf (stdlis, " %s", quotearg (temp_name));
1193
1194 switch (current_header->header.typeflag)
1195 {
1196 case SYMTYPE:
1197 fprintf (stdlis, " -> %s\n", quotearg (st->link_name));
1198 break;
1199
1200 case LNKTYPE:
1201 fprintf (stdlis, _(" link to %s\n"), quotearg (st->link_name));
1202 break;
1203
1204 default:
1205 {
1206 char type_string[2];
1207 type_string[0] = current_header->header.typeflag;
1208 type_string[1] = '\0';
1209 fprintf (stdlis, _(" unknown file type %s\n"),
1210 quote (type_string));
1211 }
1212 break;
1213
1214 case AREGTYPE:
1215 case REGTYPE:
1216 case GNUTYPE_SPARSE:
1217 case CHRTYPE:
1218 case BLKTYPE:
1219 case DIRTYPE:
1220 case FIFOTYPE:
1221 case CONTTYPE:
1222 case GNUTYPE_DUMPDIR:
1223 putc ('\n', stdlis);
1224 break;
1225
1226 case GNUTYPE_LONGLINK:
1227 fprintf (stdlis, _("--Long Link--\n"));
1228 break;
1229
1230 case GNUTYPE_LONGNAME:
1231 fprintf (stdlis, _("--Long Name--\n"));
1232 break;
1233
1234 case GNUTYPE_VOLHDR:
1235 fprintf (stdlis, _("--Volume Header--\n"));
1236 break;
1237
1238 case GNUTYPE_MULTIVOL:
1239 strcpy (size,
1240 STRINGIFY_BIGINT
1241 (UINTMAX_FROM_HEADER (current_header->oldgnu_header.offset),
1242 uintbuf));
1243 fprintf (stdlis, _("--Continued at byte %s--\n"), size);
1244 break;
1245
1246 case GNUTYPE_NAMES:
1247 fprintf (stdlis, _("--Mangled file names--\n"));
1248 break;
1249 }
1250 }
1251 fflush (stdlis);
1252 }
1253
1254 /* Print a similar line when we make a directory automatically. */
1255 void
1256 print_for_mkdir (char *dirname, int length, mode_t mode)
1257 {
1258 char modes[11];
1259
1260 if (verbose_option > 1)
1261 {
1262 /* File type and modes. */
1263
1264 modes[0] = 'd';
1265 pax_decode_mode (mode, modes + 1);
1266
1267 if (block_number_option)
1268 {
1269 char buf[UINTMAX_STRSIZE_BOUND];
1270 fprintf (stdlis, _("block %s: "),
1271 STRINGIFY_BIGINT (current_block_ordinal (), buf));
1272 }
1273
1274 fprintf (stdlis, "%s %*s %.*s\n", modes, ugswidth + 1 + datewidth,
1275 _("Creating directory:"), length, quotearg (dirname));
1276 }
1277 }
1278
1279 /* Skip over SIZE bytes of data in blocks in the archive. */
1280 void
1281 skip_file (off_t size)
1282 {
1283 union block *x;
1284
1285 if (multi_volume_option)
1286 {
1287 save_totsize = size;
1288 save_sizeleft = size;
1289 }
1290
1291 if (seekable_archive)
1292 {
1293 off_t nblk = seek_archive (size);
1294 if (nblk >= 0)
1295 {
1296 size -= nblk * BLOCKSIZE;
1297 if (multi_volume_option) /* Argh.. */
1298 save_sizeleft -= nblk * BLOCKSIZE;
1299 }
1300 else
1301 seekable_archive = false;
1302 }
1303
1304 while (size > 0)
1305 {
1306 x = find_next_block ();
1307 if (! x)
1308 FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
1309
1310 set_next_block_after (x);
1311 size -= BLOCKSIZE;
1312 if (multi_volume_option)
1313 save_sizeleft -= BLOCKSIZE;
1314 }
1315 }
1316
1317 /* Skip the current member in the archive.
1318 NOTE: Current header must be decoded before calling this function. */
1319 void
1320 skip_member (void)
1321 {
1322 char save_typeflag = current_header->header.typeflag;
1323 set_next_block_after (current_header);
1324
1325 assign_string (&save_name, current_stat_info.orig_file_name);
1326
1327 if (current_stat_info.is_sparse)
1328 sparse_skip_file (&current_stat_info);
1329 else if (save_typeflag != DIRTYPE)
1330 skip_file (current_stat_info.stat.st_size);
1331 }
This page took 0.088307 seconds and 5 git commands to generate.