git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v8 2/2] run-command: restrict PATH search to executable files

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 26, 2017, 01:44 UTC
Message-ID
<xmqqzif4t01f.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<20170425234700.194277-2-bmwill@google.com>
Brandon Williams <bmwill@google.com> writes:
Show 26 quoted lines
> In some situations run-command will incorrectly try (and fail) to
> execute a directory instead of an executable file.  This was observed by
> having a directory called "ssh" in $PATH before the real ssh and trying
> to use ssh protoccol, reslting in the following:
>
> 	$ git ls-remote ssh://url
> 	fatal: cannot exec 'ssh': Permission denied
>
> It ends up being worse and run-command will even try to execute a
> non-executable file if it preceeds the executable version of a file on
> the PATH.  For example, if PATH=~/bin1:~/bin2:~/bin3 and there exists a
> directory 'git-hello' in 'bin1', a non-executable file 'git-hello' in
> bin2 and an executable file 'git-hello' (which prints "Hello World!") in
> bin3 the following will occur:
>
> 	$ git hello
> 	fatal: cannot exec 'git-hello': Permission denied
>
> This is due to only checking 'access()' when locating an executable in
> PATH, which doesn't distinguish between files and directories.  Instead
> use 'is_executable()' which check that the path is to a regular,
> executable file.  Now run-command won't try to execute the directory or
> non-executable file 'git-hello':
>
> 	$ git hello
> 	Hello World!

Could you add a line after this example, that says something like "which matches what execvp() would have done with a request to execute git-hello with such a $PATH."

That is because it can be argued that bin1/git-hello should be found and get complaint "not an executable file", or that bin1/git-hello should be skipped but bin2/git-hello should be found and get complaint "not an executable file", both to help the user diagnose and fix the broken $PATH (or director contents). It is the easiest to justify why we chose this other definition to skip both git-hello in bin1 and bin2 if that is an established existing practice---we can say "sure, what you propose also may make sense, but we match what execvp(3) does".

The patch text looks good.
Thanks.
Previous: Jonathan NiederNext: Brandon Williams
Message 137 of 140 in “forking and threading”
  1. 0/5 forking and threadingBrandon Williams, Apr 10, 2017
  2. 1/5 run-command: convert sane_execvp to sane_execvpeBrandon Williams, Apr 10, 2017
  3. Brandon WilliamsApr 12, 2017
  4. 2/5 run-command: prepare argv before forkingBrandon Williams, Apr 10, 2017
  5. 5/5 run-command: add note about forking and threadingBrandon Williams, Apr 10, 2017
  6. Jonathan NiederApr 11, 2017
  7. Eric WongApr 11, 2017
  8. Jonathan NiederApr 11, 2017
  9. Brandon WilliamsApr 11, 2017
  10. Eric WongApr 11, 2017
  11. 4/5 run-command: prepare child environment before forkingBrandon Williams, Apr 10, 2017
  12. Jonathan NiederApr 11, 2017
  13. Brandon WilliamsApr 11, 2017
  14. Jonathan NiederApr 11, 2017
  15. 3/5 run-command: allocate child_err before forkingBrandon Williams, Apr 10, 2017
  16. 6/5 run-command: avoid potential dangers in forked childEric Wong, Apr 11, 2017
  17. Brandon WilliamsApr 11, 2017
  18. Eric WongApr 11, 2017
  19. Brandon WilliamsApr 11, 2017
  20. Jonathan NiederApr 11, 2017
  21. Brandon WilliamsApr 11, 2017
  22. 0/6 forking and threadingBrandon Williams, Apr 13, 2017
  23. 4/6 run-command: don't die in child when duping /dev/nullBrandon Williams, Apr 13, 2017
  24. Eric WongApr 13, 2017
  25. Brandon WilliamsApr 13, 2017
  26. 1/6 t5550: use write_script to generate post-update hookBrandon Williams, Apr 13, 2017
  27. Jonathan NiederApr 13, 2017
  28. Eric WongApr 13, 2017
  29. Brandon WilliamsApr 13, 2017
  30. Eric WongApr 13, 2017
  31. 5/6 run-command: eliminate calls to error handling functions in childBrandon Williams, Apr 13, 2017
  32. 2/6 run-command: prepare command before forkingBrandon Williams, Apr 13, 2017
  33. Jonathan NiederApr 13, 2017
  34. Brandon WilliamsApr 13, 2017
  35. 6/6 run-command: add note about forking and threadingBrandon Williams, Apr 13, 2017
  36. 3/6 run-command: prepare child environment before forkingBrandon Williams, Apr 13, 2017
  37. Jonathan NiederApr 13, 2017
  38. Brandon WilliamsApr 13, 2017
  39. 7/6 run-command: block signals between fork and execveEric Wong, Apr 13, 2017
  40. Brandon WilliamsApr 13, 2017
  41. Brandon WilliamsApr 14, 2017
  42. Eric WongApr 14, 2017
  43. Eric WongApr 14, 2017
  44. 00/10 forking and threadingBrandon Williams, Apr 14, 2017
  45. 01/10 t5550: use write_script to generate post-update hookBrandon Williams, Apr 14, 2017
  46. 02/10 t0061: run_command executes scripts without a #! lineBrandon Williams, Apr 14, 2017
  47. 03/10 run-command: prepare command before forkingBrandon Williams, Apr 14, 2017
  48. 07/10 run-command: eliminate calls to error handling functions in childBrandon Williams, Apr 14, 2017
  49. Eric WongApr 14, 2017
  50. Brandon WilliamsApr 14, 2017
  51. 05/10 run-command: prepare child environment before forkingBrandon Williams, Apr 14, 2017
  52. 09/10 run-command: add note about forking and threadingBrandon Williams, Apr 14, 2017
  53. 08/10 run-command: handle dup2 and close errors in childBrandon Williams, Apr 14, 2017
  54. 10/10 run-command: block signals between fork and execveBrandon Williams, Apr 14, 2017
  55. Brandon WilliamsApr 14, 2017
  56. Eric WongApr 14, 2017
  57. 06/10 run-command: don't die in child when duping /dev/nullBrandon Williams, Apr 14, 2017
  58. Eric WongApr 14, 2017
  59. Brandon WilliamsApr 14, 2017
  60. 04/10 run-command: use the async-signal-safe execv instead of execvpBrandon Williams, Apr 14, 2017
  61. 00/10 forking and threadingBrandon Williams, Apr 17, 2017
  62. 01/10 t5550: use write_script to generate post-update hookBrandon Williams, Apr 17, 2017
  63. 03/10 run-command: prepare command before forkingBrandon Williams, Apr 17, 2017
  64. 02/10 t0061: run_command executes scripts without a #! lineBrandon Williams, Apr 17, 2017
  65. 04/10 run-command: use the async-signal-safe execv instead of execvpBrandon Williams, Apr 17, 2017
  66. 07/10 run-command: eliminate calls to error handling functions in childBrandon Williams, Apr 17, 2017
  67. 06/10 run-command: don't die in child when duping /dev/nullBrandon Williams, Apr 17, 2017
  68. 10/10 run-command: block signals between fork and execveBrandon Williams, Apr 17, 2017
  69. 09/10 run-command: add note about forking and threadingBrandon Williams, Apr 17, 2017
  70. 05/10 run-command: prepare child environment before forkingBrandon Williams, Apr 17, 2017
  71. Eric WongApr 18, 2017
  72. Brandon WilliamsApr 18, 2017
  73. 08/10 run-command: handle dup2 and close errors in childBrandon Williams, Apr 17, 2017
  74. 00/11 forking and threadingBrandon Williams, Apr 18, 2017
  75. 01/11 t5550: use write_script to generate post-update hookBrandon Williams, Apr 18, 2017
  76. 03/11 run-command: prepare command before forkingBrandon Williams, Apr 18, 2017
  77. 02/11 t0061: run_command executes scripts without a #! lineBrandon Williams, Apr 18, 2017
  78. Johannes SixtApr 19, 2017
  79. Johannes SixtApr 19, 2017
  80. Brandon WilliamsApr 19, 2017
  81. Johannes SixtApr 19, 2017
  82. Johannes SchindelinApr 20, 2017
  83. Brandon WilliamsApr 20, 2017
  84. Johannes SchindelinApr 20, 2017
  85. Brandon WilliamsApr 20, 2017
  86. 05/11 string-list: add string_list_remove functionBrandon Williams, Apr 18, 2017
  87. Stefan BellerApr 18, 2017
  88. Brandon WilliamsApr 18, 2017
  89. Stefan BellerApr 18, 2017
  90. 07/11 run-command: don't die in child when duping /dev/nullBrandon Williams, Apr 18, 2017
  91. 04/11 run-command: use the async-signal-safe execv instead of execvpBrandon Williams, Apr 18, 2017
  92. 08/11 run-command: eliminate calls to error handling functions in childBrandon Williams, Apr 18, 2017
  93. 10/11 run-command: add note about forking and threadingBrandon Williams, Apr 18, 2017
  94. 09/11 run-command: handle dup2 and close errors in childBrandon Williams, Apr 18, 2017
  95. 11/11 run-command: block signals between fork and execveBrandon Williams, Apr 18, 2017
  96. Johannes SixtApr 19, 2017
  97. Eric WongApr 19, 2017
  98. Brandon WilliamsApr 19, 2017
  99. 06/11 run-command: prepare child environment before forkingBrandon Williams, Apr 18, 2017
  100. 00/11 forking and threadingBrandon Williams, Apr 19, 2017
  101. 01/11 t5550: use write_script to generate post-update hookBrandon Williams, Apr 19, 2017
  102. 02/11 t0061: run_command executes scripts without a #! lineBrandon Williams, Apr 19, 2017
  103. Johannes SchindelinApr 20, 2017
  104. Brandon WilliamsApr 20, 2017
  105. 04/11 run-command: use the async-signal-safe execv instead of execvpBrandon Williams, Apr 19, 2017
  106. Junio C HamanoMay 17, 2017
  107. Jeff KingMay 17, 2017
  108. Jeff KingMay 17, 2017
  109. Junio C HamanoMay 17, 2017
  110. Brandon WilliamsMay 17, 2017
  111. 05/11 string-list: add string_list_remove functionBrandon Williams, Apr 19, 2017
  112. 08/11 run-command: eliminate calls to error handling functions in childBrandon Williams, Apr 19, 2017
  113. 06/11 run-command: prepare child environment before forkingBrandon Williams, Apr 19, 2017
  114. 03/11 run-command: prepare command before forkingBrandon Williams, Apr 19, 2017
  115. 07/11 run-command: don't die in child when duping /dev/nullBrandon Williams, Apr 19, 2017
  116. 09/11 run-command: handle dup2 and close errors in childBrandon Williams, Apr 19, 2017
  117. 10/11 run-command: add note about forking and threadingBrandon Williams, Apr 19, 2017
  118. 11/11 run-command: block signals between fork and execveBrandon Williams, Apr 19, 2017
  119. Brandon WilliamsApr 24, 2017
  120. 12/11 run-command: don't try to execute directoriesBrandon Williams, Apr 24, 2017
  121. Jonathan NiederApr 25, 2017
  122. Junio C HamanoApr 25, 2017
  123. Jonathan NiederApr 25, 2017
  124. Jeff KingApr 25, 2017
  125. Junio C HamanoApr 25, 2017
  126. Jonathan NiederApr 25, 2017
  127. 1/2 exec_cmd: expose is_executable functionBrandon Williams, Apr 25, 2017
  128. 2/2 run-command: don't try to execute directoriesBrandon Williams, Apr 25, 2017
  129. Jonathan NiederApr 25, 2017
  130. Brandon WilliamsApr 25, 2017
  131. Jonathan NiederApr 25, 2017
  132. Johannes SixtApr 25, 2017
  133. Brandon WilliamsApr 25, 2017
  134. 1/2 run-command: expose is_executable functionBrandon Williams, Apr 25, 2017
  135. 2/2 run-command: restrict PATH search to executable filesBrandon Williams, Apr 25, 2017
  136. Jonathan NiederApr 25, 2017
  137. Junio C HamanoApr 26, 2017
  138. 2/2 run-command: restrict PATH search to executable filesBrandon Williams, Apr 26, 2017
  139. Junio C HamanoApr 27, 2017
  140. Jonathan NiederApr 25, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.