On Tue, Sep 18, 2018 at 09:11:43AM +0900, Michael Paquier wrote: > What I think I broke is that CreateFile ignores what _fmode uses, which > has caused the breakage, while calling directly open() or fopen() does > the work. There are also other things assuming that binary mode is > used, you can grep for "setmode" and see how miscinit.c or pg_basebackup > do the job.
I have been playing with this stuff, and hacked the attached. Now, while TAP tests of initdb and pgbench are happy (I can actually see the past failure as well), pg_dump complains at authentication time when using plain-text mode when using databases with all ASCII characters. That's not something I expected first, but _get_fmode also influences operations like pipe(), which is something that pg_dump uses, and setmode is enforced to binary mode only when adapted. I am getting to wonder if what's present on HEAD represents actually the best deal we could get. Attached is the patch I used for reference. Thoughts? -- Michael
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index b53d6eb9cc..cb8c7450d9 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -491,15 +491,7 @@ readfile(const char *path) char *buffer; int c; -#ifdef WIN32 - /* - * On Windows, we have to open the file in text mode so that carriage - * returns are stripped. - */ - if ((infile = fopen(path, "rt")) == NULL) -#else if ((infile = fopen(path, "r")) == NULL) -#endif { fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), progname, path, strerror(errno)); diff --git a/src/port/open.c b/src/port/open.c index a3ad946a60..f7a296ef28 100644 --- a/src/port/open.c +++ b/src/port/open.c @@ -71,6 +71,28 @@ pgwin32_open(const char *fileName, int fileFlags,...) _O_SHORT_LIVED | O_DSYNC | O_DIRECT | (O_CREAT | O_TRUNC | O_EXCL) | (O_TEXT | O_BINARY))) == fileFlags); + /* + * If caller has set neither O_BINARY nor O_TEXT, then look for what + * the default mode is for this process, then enforce it. + */ + if ((fileFlags & (O_BINARY | O_TEXT)) == 0) + { + int pmode = 0; + + /* only MSVC newer than 2015 support _get_fmode */ +#if (_MSC_VER >= 1900) + if (_get_fmode(&pmode) < 0) + { + /* get_fmode sets errno */ + return -1; + } +#else + pmode = _fmode; +#endif + + fileFlags |= pmode; + } + sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL;
signature.asc
Description: PGP signature