[BusyBox] More tar bugs...

Matt Kraai kraai at alumni.carnegiemellon.edu
Mon Sep 4 02:00:59 UTC 2000


On Sun, Sep 03, 2000 at 06:51:41PM -0700, Matt Kraai wrote:
> On Sun, Sep 03, 2000 at 05:43:09PM +0200, Alfred M. Szmidt wrote:
> > Ok, found a cute bug in tar today
> > I have two files, "test" and "tset" in a tar+gzip archive
> > test contains "Hurray! we are testing tar!!!"
> > and tset contains "!!!rat gnitset era ew !yarruH"
> > 
> > # Busybox
> > $ cat ../test.tar.gz | gunzip -c - | tar -Oxf - test
> > Hurray! we are testing tar!!!
> > !!!rat gnitset era ew !yarruH
> > $
> > 
> > # GNU
> > $ cat ../test.tar.gz | gunzip -c - | tar -Oxf - test
> > Hurray! we are testing tar!!!
> > $
> 
> The version of tar provided by busybox does not allow you to select
> which files to extract from an archive.  It always extracts everything
> in the archive.  The attached patch allows you to select files to
> extract (or list).  Should it be committed?

Well, let me try this again *with* the patch.

Matt
-------------- next part --------------
Index: tar.c
===================================================================
RCS file: /var/cvs/busybox/tar.c,v
retrieving revision 1.59
diff -u -r1.59 tar.c
--- tar.c	2000/09/01 02:53:01	1.59
+++ tar.c	2000/09/04 01:49:21
@@ -125,7 +125,8 @@
 
 /* Local procedures to restore files from a tar file.  */
 static int readTarFile(const char* tarName, int extractFlag, int listFlag, 
-		int tostdoutFlag, int verboseFlag, char** excludeList);
+		int tostdoutFlag, int verboseFlag, char** extractList,
+		char** excludeList);
 
 
 
@@ -190,7 +191,7 @@
 					if (strcmp(optarg, "exclude")==0) {
 						if (argv[optind]==NULL)
 							fatalError( "option `--exclude' requires an argument\n");
-						excludeList=realloc( excludeList, sizeof(char**) * (excludeListSize+2));
+						excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
 						excludeList[excludeListSize] = argv[optind];
 						/* Remove leading "/"s */
 						if (*excludeList[excludeListSize] =='/') {
@@ -222,7 +223,7 @@
 #endif
 	}
 	if (listFlag == TRUE || extractFlag == TRUE) {
-		exit(readTarFile(tarName, extractFlag, listFlag, tostdoutFlag, verboseFlag, excludeList));
+		exit(readTarFile(tarName, extractFlag, listFlag, tostdoutFlag, verboseFlag, &argv[optind], excludeList));
 	}
 
   flagError:
@@ -477,7 +478,8 @@
  * If the list is empty than all files are extracted or listed.
  */
 static int readTarFile(const char* tarName, int extractFlag, int listFlag, 
-		int tostdoutFlag, int verboseFlag, char** excludeList)
+		int tostdoutFlag, int verboseFlag, char** extractList,
+		char** excludeList)
 {
 	int status, tarFd=-1;
 	int errorFlag=FALSE;
@@ -544,6 +546,27 @@
 				continue;
 		}
 #endif
+		if (*extractList != NULL) {
+			int skipFlag = TRUE;
+			for (tmpList = extractList; *tmpList != NULL; tmpList++) {
+				if (strncmp( *tmpList, header.name, strlen(*tmpList))==0 || (
+							header.name[strlen(header.name)-1]=='/'
+							&& strncmp( *tmpList, header.name, 
+								MIN(strlen(header.name)-1, strlen(*tmpList)))==0)) {
+					/* If it is a regular file, pretend to extract it with
+					 * the extractFlag set to FALSE, so the junk in the tarball
+					 * is properly skipped over */
+					skipFlag = FALSE;
+					break;
+				}
+			}
+			/* There are not the droids you're looking for, move along */
+			if (skipFlag == TRUE) {
+				if ( header.type==REGTYPE || header.type==REGTYPE0 )
+						tarExtractRegularFile(&header, FALSE, FALSE);
+				continue;
+			}
+		}
 		/* Special treatment if the list (-t) flag is on */
 		if (verboseFlag == TRUE && extractFlag == FALSE) {
 			int len, len1;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 232 bytes
Desc: not available
Url : http://lists.busybox.net/pipermail/busybox/attachments/20000903/d7a10f9d/attachment.pgp 


More information about the busybox mailing list