]> Dogcows Code - chaz/tar/blobdiff - src/tar.h
Carefully crafted invalid headers can cause buffer overrun.
[chaz/tar] / src / tar.h
index 5aa0a489bb56d998e4d16af0b90c9b605038cef3..3e958ec80086a526560e4f31c33486cc528a5a06 100644 (file)
--- a/src/tar.h
+++ b/src/tar.h
@@ -1,7 +1,7 @@
 /* GNU tar Archive Format description.
 
    Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   2000, 2001, 2003 Free Software Foundation, Inc.
+   2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
 
    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.  */
-
-/* If OLDGNU_COMPATIBILITY is not zero, tar produces archives which, by
-   default, are readable by older versions of GNU tar.  This can be
-   overriden by using --posix; in this case, POSIXLY_CORRECT in environment
-   may be set for enforcing stricter conformance.  If OLDGNU_COMPATIBILITY
-   is zero or undefined, tar will eventually produces archives which, by
-   default, POSIX compatible; then either using --posix or defining
-   POSIXLY_CORRECT enforces stricter conformance.
-
-   This #define will disappear in a few years.  FP, June 1995.  */
-#define OLDGNU_COMPATIBILITY 1
+   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 /* tar Header Block, from POSIX 1003.1-1990.  */
 
@@ -53,29 +42,6 @@ struct posix_header
                                /* 500 */
 };
 
-struct star_header
-{                              /* byte offset */
-  char name[100];              /*   0 */
-  char mode[8];                        /* 100 */
-  char uid[8];                 /* 108 */
-  char gid[8];                 /* 116 */
-  char size[12];               /* 124 */
-  char mtime[12];              /* 136 */
-  char chksum[8];              /* 148 */
-  char typeflag;               /* 156 */
-  char linkname[100];          /* 157 */
-  char magic[6];               /* 257 */
-  char version[2];             /* 263 */
-  char uname[32];              /* 265 */
-  char gname[32];              /* 297 */
-  char devmajor[8];            /* 329 */
-  char devminor[8];            /* 337 */
-  char prefix[131];            /* 345 */
-  char atime[12];               /* 476 */
-  char ctime[12];               /* 488 */
-                                /* 500 */
-};
-
 #define TMAGIC   "ustar"       /* ustar and a null */
 #define TMAGLEN  6
 #define TVERSION "00"          /* 00 and no null */
@@ -149,26 +115,6 @@ struct sparse
 #define SPARSES_IN_OLDGNU_HEADER 4
 #define SPARSES_IN_SPARSE_HEADER 21
 
-/* The GNU extra header contains some information GNU tar needs, but not
-   foreseen in POSIX header format.  It is only used after a POSIX header
-   (and never with old GNU headers), and immediately follows this POSIX
-   header, when typeflag is a letter rather than a digit, so signaling a GNU
-   extension.  */
-
-struct extra_header
-{                              /* byte offset */
-  char atime[12];              /*   0 */
-  char ctime[12];              /*  12 */
-  char offset[12];             /*  24 */
-  char realsize[12];           /*  36 */
-  char longnames[4];           /*  48 */
-  char unused_pad1[68];                /*  52 */
-  struct sparse sp[SPARSES_IN_EXTRA_HEADER];
-                               /* 120 */
-  char isextended;             /* 504 */
-                               /* 505 */
-};
-
 /* Extension header for sparse files, used immediately after the GNU extra
    header, and used only if all sparse information cannot fit into that
    extra header.  There might even be many such extension headers, one after
@@ -193,15 +139,17 @@ struct sparse_header
 struct oldgnu_header
 {                              /* byte offset */
   char unused_pad1[345];       /*   0 */
-  char atime[12];              /* 345 */
-  char ctime[12];              /* 357 */
-  char offset[12];             /* 369 */
-  char longnames[4];           /* 381 */
+  char atime[12];              /* 345 Incr. archive: atime of the file */
+  char ctime[12];              /* 357 Incr. archive: ctime of the file */
+  char offset[12];             /* 369 Multivolume archive: the offset of
+                                  the start of this volume */
+  char longnames[4];           /* 381 Not used */
   char unused_pad2;            /* 385 */
   struct sparse sp[SPARSES_IN_OLDGNU_HEADER];
                                /* 386 */
-  char isextended;             /* 482 */
-  char realsize[12];           /* 483 */
+  char isextended;             /* 482 Sparse file: Extension sparse header
+                                  follows */
+  char realsize[12];           /* 483 Sparse file: Real size*/
                                /* 495 */
 };
 
@@ -241,6 +189,60 @@ struct oldgnu_header
 /* This file is a tape/volume header.  Ignore it on extraction.  */
 #define GNUTYPE_VOLHDR 'V'
 
+/* Solaris extended header */
+#define SOLARIS_XHDTYPE 'X'
+
+\f
+/* Jörg Schilling star header */
+
+struct star_header
+{                              /* byte offset */
+  char name[100];              /*   0 */
+  char mode[8];                        /* 100 */
+  char uid[8];                 /* 108 */
+  char gid[8];                 /* 116 */
+  char size[12];               /* 124 */
+  char mtime[12];              /* 136 */
+  char chksum[8];              /* 148 */
+  char typeflag;               /* 156 */
+  char linkname[100];          /* 157 */
+  char magic[6];               /* 257 */
+  char version[2];             /* 263 */
+  char uname[32];              /* 265 */
+  char gname[32];              /* 297 */
+  char devmajor[8];            /* 329 */
+  char devminor[8];            /* 337 */
+  char prefix[131];            /* 345 */
+  char atime[12];               /* 476 */
+  char ctime[12];               /* 488 */
+                                /* 500 */
+};
+
+#define SPARSES_IN_STAR_HEADER      4
+#define SPARSES_IN_STAR_EXT_HEADER  21
+
+struct star_in_header {
+  char fill[345];       /*   0  Everything that is before t_prefix */
+  char prefix[1];       /* 345  t_name prefix */
+  char fill2;           /* 346  */
+  char fill3[8];        /* 347  */
+  char isextended;      /* 355  */
+  struct sparse sp[SPARSES_IN_STAR_HEADER]; /* 356  */
+  char realsize[12];    /* 452  Actual size of the file */
+  char offset[12];      /* 464  Offset of multivolume contents */
+  char atime[12];       /* 476  */
+  char ctime[12];       /* 488  */
+  char mfill[8];        /* 500  */
+  char xmagic[4];       /* 508  "tar" */
+};
+
+struct star_ext_header {
+  struct sparse sp[SPARSES_IN_STAR_EXT_HEADER];
+  char isextended;
+};
+
+\f
+
 /* tar Header Block, overall structure.  */
 
 /* tar files are made in basic blocks of this size.  */
@@ -251,11 +253,21 @@ enum archive_format
   DEFAULT_FORMAT,              /* format to be decided later */
   V7_FORMAT,                   /* old V7 tar format */
   OLDGNU_FORMAT,               /* GNU format as per before tar 1.12 */
-  POSIX_FORMAT,                        /* restricted, pure POSIX format */
+  USTAR_FORMAT,                 /* POSIX.1-1988 (ustar) format */
+  POSIX_FORMAT,                        /* POSIX.1-2001 format */
   STAR_FORMAT,                  /* Star format defined in 1994 */
-  GNU_FORMAT                   /* POSIX format with GNU extensions */
+  GNU_FORMAT                   /* Same as OLDGNU_FORMAT with one exception:
+                                   see FIXME note for to_chars() function
+                                   (create.c:189) */
 };
 
+/* Information about a sparse file.  */
+struct sp_array
+  {
+    off_t offset;
+    size_t numbytes;
+  };
+
 struct tar_stat_info
 {
   char *orig_file_name;     /* name of file read from the archive header */
@@ -265,11 +277,20 @@ struct tar_stat_info
                               trailing slash before it was normalized. */
   char *link_name;          /* name of link for the current archive entry.  */
 
-  unsigned int  devminor;   /* device minor number */
-  unsigned int  devmajor;   /* device major number */
   char          *uname;     /* user name of owner */
   char          *gname;     /* group name of owner */
-  struct stat   stat;       /* regular filesystem stat */ 
+  struct stat   stat;       /* regular filesystem stat */
+
+  off_t archive_file_size;  /* Size of file as stored in the archive.
+                              Equals stat.st_size for non-sparse files */
+
+  bool   is_sparse;         /* Is the file sparse */
+
+  size_t sparse_map_avail;  /* Index to the first unused element in
+                              sparse_map array. Zero if the file is
+                              not sparse */
+  size_t sparse_map_size;   /* Size of the sparse map */
+  struct sp_array *sparse_map;
 };
 
 union block
@@ -277,9 +298,10 @@ union block
   char buffer[BLOCKSIZE];
   struct posix_header header;
   struct star_header star_header;
-  struct extra_header extra_header;
   struct oldgnu_header oldgnu_header;
   struct sparse_header sparse_header;
+  struct star_in_header star_in_header;
+  struct star_ext_header star_ext_header;
 };
 
 /* End of Format description.  */
This page took 0.02513 seconds and 4 git commands to generate.