|Summary:||libiberty make_relative_prefix_1 mistakes directories for executables|
|Product:||gcc||Reporter:||Michael Lotz <mmlr>|
|Component:||other||Assignee:||Not yet assigned to anyone <unassigned>|
|Severity:||normal||CC:||aschorr, dfeldstern, dickie, gcc-bugs, jakub, mvanier, psmith, ttignor|
|Build:||Known to work:|
|Known to fail:||Last reconfirmed:|
Proposed fix for make_relative_prefix_1
Proposed fix with conditional use of stat based on HAVE_SYS_STAT_H
Simple repro for "gcc" subdir in PATH bug.
Description Michael Lotz 2009-01-25 14:54:59 UTC
When GCC tries to resolve paths to executables it generates an exec prefix based on argv. It does that using the make_relative_prefix_1 function in libiberty (make-relative-prefix.c). If argv doesn't contain a path (i.e. it only reads "gcc"), make_relative_prefix_1 searches the PATH to find the full path to the current executable. When checking candidates however, it only checks the executable bit to determine whether or not it found the current executable. This means that when there is a directory with the same name as the executable in the PATH, this mechanism will produce a wrong prefix. Attached is a patch that uses stat to determine whether the candidate file is a regular file at all, hence skipping directories.
Comment 1 Michael Lotz 2009-01-25 14:56:28 UTC
Created attachment 17181 [details] Proposed fix for make_relative_prefix_1
Comment 2 Andrew Pinski 2009-01-26 19:23:57 UTC
*** Bug 37995 has been marked as a duplicate of this bug. ***
Comment 3 DJ Delorie 2009-01-26 19:46:56 UTC
Subject: Re: New: libiberty make_relative_prefix_1 mistakes directories for executables Your code conditionally includes <sys/stat.h> but doesn't conditionally enable the other code. If sys/stat.h isn't found, perhaps the code could revert to the old access() code?
Comment 4 Michael Lotz 2009-01-27 01:23:31 UTC
Created attachment 17189 [details] Proposed fix with conditional use of stat based on HAVE_SYS_STAT_H This only conditionally uses stat() if HAVE_SYS_STAT_H is defined. Not sure about the indentation style at all, sorry.
Comment 5 Andrew Pinski 2009-02-23 18:01:28 UTC
*** Bug 39278 has been marked as a duplicate of this bug. ***
Comment 6 Jack Howarth 2009-02-24 01:17:26 UTC
The currently proposed patch doesn't solve the problem where 'make -k check-libiberty' executed at the top level of the build directory results in gcc being used instead of xgcc. If you execute 'make -k check' in darwin_objdir/libiberty, you get... /sw/src/fink.build/gcc44-4.3.999-20090221/darwin_objdir/./prev-gcc/xgcc -B/sw/src/fink.build/gcc44-4.3.999-20090221/darwin_objdir/./prev-gcc/ -B/sw/lib/gcc4.4/i686-apple-darwin10/bin/ -DHAVE_CONFIG_H -g -O2 -fomit-frame-pointer -I.. -I../../../gcc-4.4-20090221/libiberty/testsuite/../../include -o test-demangle \ ../../../gcc-4.4-20090221/libiberty/testsuite/test-demangle.c ../libiberty.a whereas if you execute 'make -k check-libiberty' in darwin_objdir, you get the incorrect compiler... gcc -DHAVE_CONFIG_H -g -O2 -I.. -I../../../gcc-4.4-20090221/libiberty/testsuite/../../include -o test-demangle \ ../../../gcc-4.4-20090221/libiberty/testsuite/test-demangle.c ../libiberty.a
Comment 7 Michael Lotz 2009-02-24 17:16:41 UTC
(In reply to comment #6) > The currently proposed patch doesn't solve the problem where 'make -k > check-libiberty' executed at the top level of the build directory results in > gcc being used instead of xgcc. That's not really the scope of this patch though. This is just to correct the case where a directory is mistaken for an executable. The other issue looks like a separate bug to me.
Comment 8 Andrew Pinski 2009-06-25 01:25:03 UTC
*** Bug 40548 has been marked as a duplicate of this bug. ***
Comment 9 Tom Tignor 2012-08-15 21:31:57 UTC
I ran into the related 37995 bug today (now closed as a duplicate of this one) on gcc version 4.4.6. The bug reproduces simply by having a directory with a "gcc" subdirectory in your PATH ahead of the directory which holds the gcc binary. I have session output showing the repro procedure which I'll attach.
Comment 10 Tom Tignor 2012-08-15 21:34:50 UTC
Created attachment 28023 [details] Simple repro for "gcc" subdir in PATH bug.
Comment 11 Jakub Jelinek 2012-08-16 06:58:19 UTC
Comment 12 Tom Tignor 2012-08-16 12:59:39 UTC
Hi Jakub, Can you tell me what gcc version has the fix? Read through 48306 and saw "Fixed in 4.5+" but I have a colleague here who is able to reproduce on 4.5.1. Tom :-) From: "jakub at gcc dot gnu.org" <firstname.lastname@example.org> To: Thomas Tignor/Marlborough/IBM@IBMUS Date: 08/16/2012 02:59 AM Subject: [Bug other/38966] libiberty make_relative_prefix_1 mistakes directories for executables http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38966 Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED CC| |jakub at gcc dot gnu.org Resolution| |DUPLICATE --- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-08-16 06:58:19 UTC --- Dup of PR48306. *** This bug has been marked as a duplicate of bug 48306 ***