On Tue, Jun 6, 2017 at 8:18 PM, Eli Zaretskii <e...@gnu.org> wrote: >> From: Orgad Shaneh <org...@gmail.com> >> Date: Mon, 5 Jun 2017 23:13:26 +0300 >> >> 1 You must use a full name for SHELL, including the extension (SHELL=sh >> doesn't work. SHELL=sh.exe >> does, if sh.exe exists in PATH). PATHEXT should be used for the executable >> detection. > > Can you tell why this is a problem? There's no equivalent of PATHEXT > on Posix systems, and no one coded anything like that for Windows. Is > it really such a serious problem? If so, in what use cases?
Ah, the PATH lookup I referred to is in #ifdef WINDOWS32. I have a script that calls make with SHELL=sh, and I don't want to adapt it (and make it sh.exe) specifically for Windows. >> 2 It looks like if PATH contains quotes, they're treated in a strange >> manner. Instead of just removing >> (unescaping) them, make looks for <run directory>\"some directory in >> quotes" (observed with Process >> Monitor). The quotes must be removed before calling _access(). > > An example would help, but generally speaking PATH with quotes is > invalid; see for example this post: > > > https://serverfault.com/questions/349179/path-variable-and-quotation-marks-windows > > If we accept that such values of PATH is invalid, then what you > describe hits "undefined behavior", and Make is not at fault. If you > disagree, please describe use cases where it is hard or impossible to > fix PATH so that it has no quotes. I accept it. I just noticed it when I did some experiments to workaround the 1st issue :) >> 3 If the shell is not found, make crashes. do_variable_definition() reaches >> lookup_variable(), which returns >> NULL. Then the NULL v is dereferenced (v->append = append etc.) >> I tried adding NULL validations. This prevents the crash, but then SHELL=sh >> becomes the target instead of >> declaring a variable (*** No rule to make target 'SHELL=sh'. Stop.) > > I cannot reproduce this in simple Makefiles I tried. The most severe > problem I saw was this: > > D:\usr\eli\data>make -f- > SHELL=sh.exe > > all: > $(SHELL) -c echo foo > ^Z > sh.exe -c echo foo > process_begin: CreateProcess(NULL, sh.exe -c echo foo, ...) failed. > make (e=2): The system cannot find the file specified. > make: *** [D:/usr/tmp/Gma08172:4: all] Error 2 > > which doesn't fit your description. Can you show an example where > Make crashes due to NULL pointer dereference? Sorry, I forgot to mention that I refer to command-line argument (make SHELL=sh. You can replace sh with anything that doesn't exist like make SHELL=fsdfsdf. SHELL=cmd is an exception, since it is handled separately, and BTW it does support cmd and cmd.exe). You don't even need a Makefile to reproduce the crash. > And one more thing: you didn't say which version of Make did you use > in your testing, and where/how did you obtain its binary; I used the > latest version 4.2.1. Should you wish to try the version I use, you > can find its precompiled binaries here: I used 4.2.1 from MSYS2/mingw32, and built it from source for debugging (after I experienced the crash). - Orgad _______________________________________________ Bug-make mailing list Bug-make@gnu.org https://lists.gnu.org/mailman/listinfo/bug-make