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

[PATCH 07/19] mingw: let lstat() fail with errno == ENOTDIR when appropriate

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jan 24, 2016, 15:44 UTC
Message-ID
<d723c85ea89699e9fe4c0535881bf48758adab5d.1453650173.git.johannes.schindelin@gmx.de>
In-Reply-To
<cover.1453650173.git.johannes.schindelin@gmx.de>

POSIX semantics requires lstat() to fail with ENOTDIR when "[a] component of the path prefix names an existing file that is neither a directory nor a symbolic link to a directory".

See http://pubs.opengroup.org/onlinepubs/9699919799/functions/lstat.html
This behavior is expected by t1404-update-ref-df-conflicts now.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 compat/mingw.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)
diff --git a/compat/mingw.c b/compat/mingw.c
index e4839b9..9e60335 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -454,6 +454,39 @@ static inline time_t filetime_to_time_t(const FILETIME *ft)
 	return (time_t)(filetime_to_hnsec(ft) / 10000000);
 }
 
+/**
+ * Verifies that safe_create_leading_directories() would succeed.
+ */
+static int has_valid_directory_prefix(wchar_t *wfilename)
+{
+	int n = wcslen(wfilename);
+
+	while (n > 0) {
+		wchar_t c = wfilename[--n];
+		DWORD attributes;
+
+		if (!is_dir_sep(c))
+			continue;
+
+		wfilename[n] = L'\0';
+		attributes = GetFileAttributesW(wfilename);
+		wfilename[n] = c;
+		if (attributes == FILE_ATTRIBUTE_DIRECTORY ||
+				attributes == FILE_ATTRIBUTE_DEVICE)
+			return 1;
+		if (attributes == INVALID_FILE_ATTRIBUTES)
+			switch (GetLastError()) {
+			case ERROR_PATH_NOT_FOUND:
+				continue;
+			case ERROR_FILE_NOT_FOUND:
+				/* This implies parent directory exists. */
+				return 1;
+			}
+		return 0;
+	}
+	return 1;
+}
+
 /* We keep the do_lstat code in a separate function to avoid recursion.
  * When a path ends with a slash, the stat will fail with ENOENT. In
  * this case, we strip the trailing slashes and stat again.
@@ -514,6 +547,12 @@ static int do_lstat(int follow, const char *file_name, struct stat *buf)
 	case ERROR_NOT_ENOUGH_MEMORY:
 		errno = ENOMEM;
 		break;
+	case ERROR_PATH_NOT_FOUND:
+		if (!has_valid_directory_prefix(wfilename)) {
+			errno = ENOTDIR;
+			break;
+		}
+		/* fallthru */
 	default:
 		errno = ENOENT;
 		break;
-- 
2.7.0.windows.1.7.g55a05c8
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 17 of 113 in “Let Git's tests pass on Windows”
  1. 00/19 Let Git's tests pass on WindowsJohannes Schindelin, Jan 24, 2016
  2. 01/19 mingw: let's use gettext with MSYS2Johannes Schindelin, Jan 24, 2016
  3. Junio C HamanoJan 25, 2016
  4. Johannes SchindelinJan 25, 2016
  5. Junio C HamanoJan 25, 2016
  6. 02/19 mingw: do not trust MSYS2's MinGW gettext.shJohannes Schindelin, Jan 24, 2016
  7. 03/19 Git.pm: stop assuming that absolute paths start with a slashJohannes Schindelin, Jan 24, 2016
  8. 04/19 mingw: factor out Windows specific environment setupJohannes Schindelin, Jan 24, 2016
  9. 05/19 mingw: prepare the TMPDIR environment variable for shell scriptsJohannes Schindelin, Jan 24, 2016
  10. Eric SunshineJan 25, 2016
  11. Johannes SchindelinJan 26, 2016
  12. 06/19 mingw: try to delete target directory before renamingJohannes Schindelin, Jan 24, 2016
  13. Philip OakleyJan 24, 2016
  14. Johannes SchindelinJan 25, 2016
  15. Junio C HamanoJan 25, 2016
  16. Johannes SchindelinJan 26, 2016
  17. 07/19 mingw: let lstat() fail with errno == ENOTDIR when appropriateJohannes Schindelin, Jan 24, 2016
  18. 08/19 mingw: fix t5601-clone.shJohannes Schindelin, Jan 24, 2016
  19. 09/19 mingw: accomodate t0060-path-utils for MSYS2Johannes Schindelin, Jan 24, 2016
  20. Johannes SixtJan 24, 2016
  21. Johannes SchindelinJan 25, 2016
  22. 10/19 mingw: disable mkfifo-based testsJohannes Schindelin, Jan 24, 2016
  23. 11/19 tests: turn off git-daemon tests if FIFOs are not availableJohannes Schindelin, Jan 24, 2016
  24. 12/19 mingw: do not use symlinks with SVN in t9100Johannes Schindelin, Jan 24, 2016
  25. Junio C HamanoJan 25, 2016
  26. Johannes SchindelinJan 25, 2016
  27. 13/19 mingw: outsmart MSYS2's path substitution in t1508Johannes Schindelin, Jan 24, 2016
  28. Junio C HamanoJan 25, 2016
  29. Eric SunshineJan 25, 2016
  30. Junio C HamanoJan 25, 2016
  31. Johannes SchindelinJan 26, 2016
  32. Johannes SchindelinJan 25, 2016
  33. Johannes SchindelinJan 25, 2016
  34. 14/19 mingw: fix t9700's assumption about directory separatorsJohannes Schindelin, Jan 24, 2016
  35. 15/19 mingw: work around pwd issues in the testsJohannes Schindelin, Jan 24, 2016
  36. 16/19 mingw: avoid absolute path in t0008Johannes Schindelin, Jan 24, 2016
  37. Junio C HamanoJan 25, 2016
  38. Johannes SchindelinJan 25, 2016
  39. Ray DonnellyJan 25, 2016
  40. Junio C HamanoJan 25, 2016
  41. Johannes SchindelinJan 26, 2016
  42. 17/19 mingw: fix git-svn tests that expect chmod to workJohannes Schindelin, Jan 24, 2016
  43. Junio C HamanoJan 25, 2016
  44. Johannes SchindelinJan 26, 2016
  45. Junio C HamanoJan 26, 2016
  46. 18/19 mingw: skip a couple of git-svn tests that cannot pass on WindowsJohannes Schindelin, Jan 24, 2016
  47. Junio C HamanoJan 25, 2016
  48. Johannes SchindelinJan 26, 2016
  49. 19/19 mingw: do not bother to test funny file namesJohannes Schindelin, Jan 24, 2016
  50. Junio C HamanoJan 25, 2016
  51. Johannes SchindelinJan 25, 2016
  52. 00/19 Let Git's tests pass on WindowsJohannes Schindelin, Jan 26, 2016
  53. 01/19 mingw: let's use gettext with MSYS2Johannes Schindelin, Jan 26, 2016
  54. 02/19 mingw: do not trust MSYS2's MinGW gettext.shJohannes Schindelin, Jan 26, 2016
  55. 03/19 Git.pm: stop assuming that absolute paths start with a slashJohannes Schindelin, Jan 26, 2016
  56. 04/19 mingw: factor out Windows specific environment setupJohannes Schindelin, Jan 26, 2016
  57. 05/19 mingw: prepare the TMPDIR environment variable for shell scriptsJohannes Schindelin, Jan 26, 2016
  58. 06/19 mingw: try to delete target directory before renamingJohannes Schindelin, Jan 26, 2016
  59. 07/19 mingw: let lstat() fail with errno == ENOTDIR when appropriateJohannes Schindelin, Jan 26, 2016
  60. 08/19 mingw: fix t5601-clone.shJohannes Schindelin, Jan 26, 2016
  61. 09/19 mingw: accomodate t0060-path-utils for MSYS2Johannes Schindelin, Jan 26, 2016
  62. 10/19 mingw: disable mkfifo-based testsJohannes Schindelin, Jan 26, 2016
  63. 11/19 tests: turn off git-daemon tests if FIFOs are not availableJohannes Schindelin, Jan 26, 2016
  64. 12/19 mingw: skip test in t1508 that fails due to path conversionJohannes Schindelin, Jan 26, 2016
  65. Junio C HamanoJan 26, 2016
  66. Johannes SchindelinJan 27, 2016
  67. Junio C HamanoJan 27, 2016
  68. Johannes SchindelinJan 28, 2016
  69. 13/19 mingw: fix t9700's assumption about directory separatorsJohannes Schindelin, Jan 26, 2016
  70. 14/19 mingw: work around pwd issues in the testsJohannes Schindelin, Jan 26, 2016
  71. 15/19 Avoid absolute path in t0008Johannes Schindelin, Jan 26, 2016
  72. 16/19 mingw: mark t9100's test cases with appropriate prereqsJohannes Schindelin, Jan 26, 2016
  73. Junio C HamanoJan 26, 2016
  74. Johannes SchindelinJan 27, 2016
  75. 17/19 mingw: avoid illegal filename in t9118Johannes Schindelin, Jan 26, 2016
  76. 18/19 mingw: handle the missing POSIXPERM prereq in t9124Johannes Schindelin, Jan 26, 2016
  77. Junio C HamanoJan 26, 2016
  78. Johannes SchindelinJan 27, 2016
  79. 19/19 mingw: do not bother to test funny file namesJohannes Schindelin, Jan 26, 2016
  80. Eric SunshineJan 26, 2016
  81. Junio C HamanoJan 26, 2016
  82. Johannes SchindelinJan 27, 2016
  83. Junio C HamanoJan 26, 2016
  84. Johannes SchindelinJan 27, 2016
  85. Junio C HamanoJan 27, 2016
  86. 00/20 Let Git's tests pass on WindowsJohannes Schindelin, Jan 27, 2016
  87. 01/20 mingw: let's use gettext with MSYS2Johannes Schindelin, Jan 27, 2016
  88. 02/20 mingw: do not trust MSYS2's MinGW gettext.shJohannes Schindelin, Jan 27, 2016
  89. 03/20 Git.pm: stop assuming that absolute paths start with a slashJohannes Schindelin, Jan 27, 2016
  90. 04/20 mingw: factor out Windows specific environment setupJohannes Schindelin, Jan 27, 2016
  91. 05/20 mingw: prepare the TMPDIR environment variable for shell scriptsJohannes Schindelin, Jan 27, 2016
  92. 06/20 mingw: try to delete target directory before renamingJohannes Schindelin, Jan 27, 2016
  93. 07/20 mingw: let lstat() fail with errno == ENOTDIR when appropriateJohannes Schindelin, Jan 27, 2016
  94. 08/20 mingw: fix t5601-clone.shJohannes Schindelin, Jan 27, 2016
  95. 09/20 mingw: accomodate t0060-path-utils for MSYS2Johannes Schindelin, Jan 27, 2016
  96. 10/20 mingw: disable mkfifo-based testsJohannes Schindelin, Jan 27, 2016
  97. 11/20 tests: turn off git-daemon tests if FIFOs are not availableJohannes Schindelin, Jan 27, 2016
  98. Eric SunshineJan 28, 2016
  99. Johannes SchindelinJan 28, 2016
  100. Junio C HamanoJan 28, 2016
  101. 12/20 mingw: skip test in t1508 that fails due to path conversionJohannes Schindelin, Jan 27, 2016
  102. 13/20 mingw: fix t9700's assumption about directory separatorsJohannes Schindelin, Jan 27, 2016
  103. 14/20 mingw: work around pwd issues in the testsJohannes Schindelin, Jan 27, 2016
  104. 15/20 Avoid absolute path in t0008Johannes Schindelin, Jan 27, 2016
  105. 16/20 mingw: mark t9100's test cases with appropriate prereqsJohannes Schindelin, Jan 27, 2016
  106. Johannes SchindelinJan 27, 2016
  107. 17/20 mingw: avoid illegal filename in t9118Johannes Schindelin, Jan 27, 2016
  108. 18/20 mingw: handle the missing POSIXPERM prereq in t9124Johannes Schindelin, Jan 27, 2016
  109. 19/20 mingw: skip a test in t9130 that cannot pass on WindowsJohannes Schindelin, Jan 27, 2016
  110. 20/20 mingw: do not bother to test funny file namesJohannes Schindelin, Jan 27, 2016
  111. Eric SunshineJan 28, 2016
  112. Johannes SchindelinJan 28, 2016
  113. Junio C HamanoJan 28, 2016

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.