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

Re: [PATCH 04/15] Set _O_BINARY as default fmode for both MinGW and MSVC

From
Alexey Borzenkov <snaury@gmail.com>
Date
Sep 16, 2009, 20:00 UTC
Message-ID
<e2480c70909161300o3db4b416k8f33ccce2f987c55@mail.gmail.com>
In-Reply-To
<4AB10F01.9010703@viscovery.net>
On Wed, Sep 16, 2009 at 8:14 PM, Johannes Sixt <j.sixt@viscovery.net> wrote:
Show 9 quoted lines
>> MinGW set the _CRT_fmode to set both the default fmode and
>> _O_BINARY on stdin/stdout/stderr. Rather use the main()
>> define in mingw.h to set this for both MinGW and MSVC.
>>
>> This will ensure that a MinGW and MSVC build will handle
>> input and output identically.
> This one breaks t5302-pack-index.sh (test 15, "[index v1] 2) create a
> stealth corruption in a delta base reference") in my MinGW build. I have
> yet to find out what exactly goes wrong and how it could be fixed.
Looks like calling _setmode in main is too late for something. :-/

I tried defining int _fmode in mingw.c (which sets msvcrt's _fmode early, without calling _setmode), and it didn't work either (i.e. the bug was still happening). So the culprit must be in _setmode. I also tried logging what index_obj_offset and index_obj_nr are showing, and here are results:

/* with _CRT_fmode = _O_BINARY */ index_obj_offset: 844032 index_obj_nr: 205

/* without _CRT_fmode = _O_BINARY */ index_obj_offset: 844235 index_obj_nr: 298

I then tried to see what git show-index actually returns there, and here are several top lines of the results:

/* with _CRT_fmode = _O_BINARY */ 850186 0106e17481932f5c223fafadc1d26abc6adf40d6 203652 01179d82b18c252824e20e190543e0e84950d820 15576 0246ff570c396c37ff08c0f5f9d88c84fc21a297 851536 035e7e54cee9eb197af435b6b6dcced489c233f6 376062 03a6f56dbbb556425ef8c43c31519b32eb5629a4 39452 0471b3b8ab8da19f3968dc238e9555f4e48ce858 8230 0483297992ed4cd5ab3b5790912b1f03598ea660 72292 0508b858e01f0367552fb14722388ba48dbd36f7

/* without _CRT_fmode = _O_BINARY */ 844235 01a8d3f6d063d48baf40ee656804aa58486a34b2 851754 035e7e54cee9eb197af435b6b6dcced489c233f6 851844 04ff7bd225fbb4842697af96c147a4ddecb6a657 848233 088ddcb945af72c47348b65a63992c71b6b9dbe8 849676 088e69e7ab273e35b4f63ecb1b915a3997f13dff 14825 09bd72201f82a0da14a52230e2ccd0e43529e779 9848 0a5916ad398380ba103d98bad6fa4f2b20b74e75 695905 0ae5469e687083bbf954262873ee8c0c7d017e75

As you can see the hashes are completely different! Unfortunately I also can't pinpoint where this actually happens... :-/

*several minutes later*

Searching which executables set _fmode and which don't I found the culprit. test-genrandom.c didn't include git-compat-util.h, so mingw.h was never included. This caused different random data to be generated, and as it seems more importantly, of different sizes. Can be fixed with this patch:

diff --git a/test-genrandom.c b/test-genrandom.c
index 8ad276d..b3c28d9 100644
--- a/test-genrandom.c
+++ b/test-genrandom.c
@@ -4,8 +4,7 @@
  * Copyright (C) 2007 by Nicolas Pitre, licensed under the GPL version 2.
  */

-#include <stdio.h>
-#include <stdlib.h>
+#include "git-compat-util.h"

 int main(int argc, char *argv[])
 {

Or maybe there's a hidden bug in git that gets uncovered with slightly
different random data, I don't know. I'm glad I could finally solve
this mindbending issue. :)
Previous: Johannes SixtNext: Johannes Sixt
Message 29 of 50 in “Build Git with MSVC”
  1. 00/15 Build Git with MSVCMarius Storm-Olsen, Sep 16, 2009
  2. 01/15 Avoid declaration after statementMarius Storm-Olsen, Sep 16, 2009
  3. 02/15 Add define guards to compat/win32.hMarius Storm-Olsen, Sep 16, 2009
  4. 03/15 Change regerror() declaration from K&R style to ANSI C (C89)Marius Storm-Olsen, Sep 16, 2009
  5. 04/15 Set _O_BINARY as default fmode for both MinGW and MSVCMarius Storm-Olsen, Sep 16, 2009
  6. 05/15 Fix __stdcall placement and function prototypeMarius Storm-Olsen, Sep 16, 2009
  7. 06/15 Test for WIN32 instead of __MINGW32_Marius Storm-Olsen, Sep 16, 2009
  8. 07/15 Add empty header files for MSVC portMarius Storm-Olsen, Sep 16, 2009
  9. 08/15 Add MinGW header files to build git with MSVCMarius Storm-Olsen, Sep 16, 2009
  10. 09/15 Add platform files for MSVC portingMarius Storm-Olsen, Sep 16, 2009
  11. 10/15 Make usage of windows.h lean and meanMarius Storm-Olsen, Sep 16, 2009
  12. 11/15 Define strncasecmp and ftruncate for MSVCMarius Storm-Olsen, Sep 16, 2009
  13. 12/15 Add MSVC to MakefileMarius Storm-Olsen, Sep 16, 2009
  14. 13/15 Add README for MSVC buildMarius Storm-Olsen, Sep 16, 2009
  15. 14/15 Add scripts to generate projects for other buildsystems (MSVC vcproj, QMake)Marius Storm-Olsen, Sep 16, 2009
  16. 15/15 Tag GIT_VERSION when Git is built with MSVCMarius Storm-Olsen, Sep 16, 2009
  17. Johannes SixtSep 17, 2009
  18. Marius Storm-OlsenSep 18, 2009
  19. Johannes SixtSep 17, 2009
  20. Marius Storm-OlsenSep 18, 2009
  21. Johannes SixtSep 18, 2009
  22. Sebastian SchuberthSep 23, 2009
  23. Johannes SchindelinSep 23, 2009
  24. Marius Storm-OlsenSep 24, 2009
  25. Sebastian SchuberthSep 23, 2009
  26. Marius Storm-OlsenSep 23, 2009
  27. Frank LiSep 25, 2009
  28. Johannes SixtSep 16, 2009
  29. Alexey BorzenkovSep 16, 2009
  30. Johannes SixtSep 17, 2009
  31. Junio C HamanoSep 17, 2009
  32. Marius Storm-OlsenSep 17, 2009
  33. Johannes SixtSep 17, 2009
  34. Marius Storm-OlsenSep 17, 2009
  35. Johannes SixtSep 17, 2009
  36. Marius Storm-OlsenSep 17, 2009
  37. Alexey BorzenkovSep 17, 2009
  38. Marius Storm-OlsenSep 17, 2009
  39. Alexey BorzenkovSep 17, 2009
  40. Johannes SixtSep 17, 2009
  41. Marius Storm-OlsenSep 17, 2009
  42. Alexey BorzenkovSep 17, 2009
  43. Johannes SixtSep 17, 2009
  44. 04/15 Set _O_BINARY as default fmode for both MinGW and MSVCMarius Storm-Olsen, Sep 17, 2009
  45. Johannes SixtSep 17, 2009
  46. Erik Faye-LundSep 16, 2009
  47. Marius Storm-OlsenSep 16, 2009
  48. Sebastian SchuberthSep 23, 2009
  49. Erik Faye-LundSep 25, 2009
  50. 04/15 Set _O_BINARY as default fmode for both MinGW and MSVCMarius Storm-Olsen, Sep 17, 2009

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.