Subject: bin/29040: pax-as-tar: -s does not handle invalid patterns properly
To: None <gnats-admin@netbsd.org, netbsd-bugs@netbsd.org>
From: Christian Biere <christianbiere@gmx.de>
List: netbsd-bugs
Date: 01/21/2005 19:46:00
>Number:         29040
>Category:       bin
>Synopsis:       pax-as-tar: -s does not handle invalid patterns properly
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    bin-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri Jan 21 19:46:00 +0000 2005
>Originator:     Christian Biere
>Release:        NetBSD 2.99.11
>Environment:
System: NetBSD cyclonus 2.99.11 NetBSD 2.99.11 (STARSCREAM) #4: Fri Jan 7 14:02:19 CET 2005 bin@cyclonus:/usr/obj/sys/arch/i386/compile/STARSCREAM i386
Architecture: i386
Machine: i386
>Description:

I've run tar with -version as argument and noticed that it prints parts
of the environment in the error message. I've reduced the arguments to
-sio and then single stepped with gdb to the code in question. The code
performs a NULL pointer check instead of checking for a NUL character
which causes invalid patterns to pass this stage. After that the pointer
points to argv[argc + 1] which is (at least here) identical to ``envp''.

>How-To-Repeat:

$ tar -sio
tar: Invalid replacement string option ioiSHELL=/bin/bash
usage: tar [-]{crtux}[-befhjlmopqvwzHLOPXZ014578] [archive] [blocksize]
           [-C directory] [-T file] [-s replstr] [file ...]

Note the "iSHELL=..." in the output above.

>Fix:

Index: pat_rep.c
===================================================================
RCS file: /cvsroot/src/bin/pax/pat_rep.c,v
retrieving revision 1.21
diff -u -u -r1.21 pat_rep.c
--- pat_rep.c	27 Oct 2003 00:12:41 -0000	1.21
+++ pat_rep.c	21 Jan 2005 19:30:48 -0000
@@ -136,7 +136,7 @@
 		if (*pt1 == *str)
 			break;
 	}
-	if (pt1 == NULL) {
+	if ('\0' == *pt1) {
 		tty_warn(1, "Invalid replacement string %s", str);
 		return(-1);
 	}