[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