]> Dogcows Code - chaz/tar/blobdiff - src/tar.h
Carefully crafted invalid headers can cause buffer overrun.
[chaz/tar] / src / tar.h
index 9ba0a46be8a6b0b23d7c5d1455ca3e4d10fba155..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
@@ -15,7 +15,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.  */
 
 /* tar Header Block, from POSIX 1003.1-1990.  */
 
@@ -42,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 */
@@ -162,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 */
 };
 
@@ -210,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.  */
@@ -220,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 */
@@ -234,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
@@ -248,6 +300,8 @@ union block
   struct star_header star_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.025667 seconds and 4 git commands to generate.