Date: Fri, 15 Mar 2002 12:14:38 +0100 (CET) From: Martin.Kraemer@Fujitsu-Siemens.com To: FreeBSD-gnats-submit@FreeBSD.org, tcsh@mx.gw.com, tcsh-bugs@mx.gw.com, submit@bugs.debian.org Cc: christos@zoulas.com Subject: bin/35921: Wrong path reduction of dot-dot paths in dnormalize() Message-ID: <200203151114.g2FBEcW12401@deejai2.mch.fsc.net>
next in thread | raw e-mail | index | archive | help
>Number: 35921 >Category: bin >Synopsis: Wrong path reduction of dot-dot paths in dnormalize() >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Mar 15 03:20:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: >Release: FreeBSD 4.5-STABLE i386 >Organization: Fujitsu-Siemens.com >Environment: System: FreeBSD deejai2.mch.fsc.net 4.5-STABLE FreeBSD 4.5-STABLE #6: Thu Jan 31 21:40:04 CET 2002 martin@deejai2.mch.fsc.net:/usr/src/sys/compile/DEEJAI4B i386 >Description: This patch tries to fix an error which I discovered when compiling a source file. I tried % set symlinks = expand % cc -I../.. blah.c and was astonished that the compiler complained about a nonexistant file "/home/martin". See below for the reason and fix. It manifests for command line arguments which end in "/.." (or contain "/../") but which are not valid paths, like "-I../..". This error only happens if "set symlinks = expand" is set. % cd /usr/local/bin % set symlinks = expand % printf "%s\n" -I. -I../.. -I../../.. ../.. .. -I. /usr/local/bin /usr/local /usr /usr/local Note that for "-I../.." and "-I../../..", something *very* strange has happened: their prefix "-I" vanished and they were replaced by an (off-by-one depth) absolute path. (That is done in dnormalize() which assumes that a relative path exists and can be shortened/normalized by removing redundant "../something" pairs. The fix tries to test whether it makes sense to call dnormalize() -- it only does if the path is a valid path in the first place. The output after applying the fix is: % printf "%s\n" -I. -I../.. -I../../.. ../.. .. -I. -I../.. -I../../.. /usr /usr/local which is what I expected. >How-To-Repeat: % cd /usr/local/bin % set symlinks = expand % echo -I../.. /usr/local/bin >Fix: Index: sh.dir.c =================================================================== RCS file: /home/cvs/tcsh/sh.dir.c,v retrieving revision 1.1.1.6 diff -u -r1.1.1.6 sh.dir.c --- sh.dir.c 15 Mar 2002 10:30:34 -0000 1.1.1.6 +++ sh.dir.c 15 Mar 2002 11:04:23 -0000 @@ -415,6 +415,18 @@ if ((TRM(cwd[(dotdot = (int) Strlen(cwd)) - 1])) == '/') cwd[--dotdot] = '\0'; } + /* Reduction of ".." following the stuff we collected in buf + * only makes sense if the directory item in buf really exists. + * Avoid reduction of "-I../.." (typical compiler call) to "" + * or "/usr/nonexistant/../bin" to "/usr/bin": + */ + if (cwd[0]) { + struct stat exists; + if (0 != stat(short2str(cwd), &exists)) { + xfree((ptr_t) cwd); + return Strsave(start); + } + } if (!*cp) break; } >Release-Note: >Audit-Trail: >Unformatted: Package: tcsh Version: 6.11.0 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203151114.g2FBEcW12401>