misc/150890: bsdtar does not always dive into subdirectories with --newerXXX option

Tobias Herre tobias.herre at srh-hochschule-berlin.de
Thu Sep 23 22:20:04 UTC 2010


>Number:         150890
>Category:       misc
>Synopsis:       bsdtar does not always dive into subdirectories with --newerXXX option
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Sep 23 22:20:03 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Tobias Herre
>Release:        FreeBSD 8.1
>Organization:
SRH Hochschule Berlin
>Environment:
grusel 8.1-STABLE FreeBSD 8.1-STABLE #1: Thu Sep 16 13:40:46 UTC 2010     root at grusel2.otauni.de:/usr/obj/usr/src/sys/SRHPOWER  amd64

>Description:
when --newerXXX option is given bsdtar ignores directory subtrees where modified or new files could exist if the parent directory is not modified. 


>How-To-Repeat:
grusel# mkdir -p test/txt
grusel# echo "Hello" > test/txt/hello.txt
grusel# tar -v -c -f archive0.tar test
a test
a test/txt
a test/txt/hello.txt
grusel# echo "World" >> test/txt/hello.txt
grusel# tar -v -c -f archive1.tar --newer-than archive0.tar test
grusel# tar -t -f archive0.tar 
test/
test/txt/
test/txt/hello.txt
grusel# tar -t -f archive1.tar
grusel# 

>Fix:
Apply the patch

Patch attached with submission follows:

--- usr.bin/tar/write.orig	2010-09-23 22:03:20.838021523 +0200
+++ usr.bin/tar/write.c	2010-09-23 22:54:58.985341640 +0200
@@ -752,13 +752,6 @@
 				descend = 0;
 		}
 
-		/*
-		 * In -u mode, check that the file is newer than what's
-		 * already in the archive; in all modes, obey --newerXXX flags.
-		 */
-		if (!new_enough(bsdtar, name, st))
-			continue;
-
 		archive_entry_free(entry);
 		entry = archive_entry_new();
 
@@ -813,7 +806,7 @@
 		 * check would veto this file, we shouldn't bother
 		 * the user with it.
 		 */
-		if (bsdtar->option_interactive &&
+		if (bsdtar->option_interactive && new_enough(bsdtar, name, st) &&
 		    !yes("add '%s'", name))
 			continue;
 
@@ -821,6 +814,15 @@
 		if (descend && !bsdtar->option_no_subdirs)
 			tree_descend(tree);
 
+
+		/*
+		 * In -u mode, check that the file is newer than what's
+		 * already in the archive; in all modes, obey --newerXXX flags.
+		 */
+		if (!new_enough(bsdtar, name, st))
+			continue;
+
+
 		/*
 		 * Rewrite the pathname to be archived.  If rewrite
 		 * fails, skip the entry.


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list