diff --git a/lib/cookie.c b/lib/cookie.c index 012792605a20c0..fd7ed4168f9c0b 100644 --- a/lib/cookie.c +++ b/lib/cookie.c @@ -914,7 +914,7 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data, fp = NULL; } else - fp = file?fopen(file, "r"):NULL; + fp = file?fopen(file, FOPEN_READTEXT):NULL; c->newsession = newsession; /* new session? */ @@ -1262,7 +1262,7 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere) use_stdout=TRUE; } else { - out = fopen(dumphere, "w"); + out = fopen(dumphere, FOPEN_WRITETEXT); if(!out) return 1; /* failure */ } diff --git a/lib/curl_setup.h b/lib/curl_setup.h index 9c7cc07ebef42a..cbec34f26f9089 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -707,4 +707,24 @@ int netware_init(void); #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif +/* In Windows the default file mode is text but an application can override it. +Therefore we specify it explicitly. https://github.com/bagder/curl/pull/258 +*/ +#if defined(WIN32) +#define FOPEN_READTEXT "rt" +#define FOPEN_WRITETEXT "wt" +#elif defined(__CYGWIN__) +/* Cygwin has specific behavior we need to address when WIN32 is not defined. +https://cygwin.com/cygwin-ug-net/using-textbinary.html +For write we want our output to have line endings of LF and be compatible with +other Cygwin utilities. For read we want to handle input that may have line +endings either CRLF or LF so 't' is appropriate. +*/ +#define FOPEN_READTEXT "rt" +#define FOPEN_WRITETEXT "w" +#else +#define FOPEN_READTEXT "r" +#define FOPEN_WRITETEXT "w" +#endif + #endif /* HEADER_CURL_SETUP_H */ diff --git a/lib/memdebug.c b/lib/memdebug.c index 3b38a749259ed6..dd8889b2db13ff 100644 --- a/lib/memdebug.c +++ b/lib/memdebug.c @@ -112,7 +112,7 @@ void curl_memdebug(const char *logname) { if(!logfile) { if(logname && *logname) - logfile = fopen(logname, "w"); + logfile = fopen(logname, FOPEN_WRITETEXT); else logfile = stderr; #ifdef MEMDEBUG_LOG_SYNC diff --git a/lib/netrc.c b/lib/netrc.c index 97a07b88e2da8d..06f8ea15a41ac6 100644 --- a/lib/netrc.c +++ b/lib/netrc.c @@ -109,11 +109,7 @@ int Curl_parsenetrc(const char *host, netrc_alloc = TRUE; } -#ifdef __CYGWIN__ - file = fopen(netrcfile, "rt"); -#else - file = fopen(netrcfile, "r"); -#endif + file = fopen(netrcfile, FOPEN_READTEXT); if(netrc_alloc) free(netrcfile); if(file) { diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c index d6eb6c445e0f9b..1db31e40c253c8 100644 --- a/lib/vtls/gtls.c +++ b/lib/vtls/gtls.c @@ -231,7 +231,7 @@ static gnutls_datum_t load_file (const char *file) long filelen; void *ptr; - if(!(f = fopen(file, "r"))) + if(!(f = fopen(file, "rb"))) return loaded_file; if(fseek(f, 0, SEEK_END) != 0 || (filelen = ftell(f)) < 0 diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c index 96a7d6e89c5c1c..eb2cf5bf57b3c7 100644 --- a/lib/vtls/openssl.c +++ b/lib/vtls/openssl.c @@ -2725,7 +2725,7 @@ static CURLcode servercert(struct connectdata *conn, /* e.g. match issuer name with provided issuer certificate */ if(data->set.str[STRING_SSL_ISSUERCERT]) { - fp = fopen(data->set.str[STRING_SSL_ISSUERCERT], "r"); + fp = fopen(data->set.str[STRING_SSL_ISSUERCERT], FOPEN_READTEXT); if(!fp) { if(strict) failf(data, "SSL: Unable to open issuer cert (%s)", diff --git a/src/tool_cb_dbg.c b/src/tool_cb_dbg.c index 0fe0f13475e2f0..f52714683c5cb3 100644 --- a/src/tool_cb_dbg.c +++ b/src/tool_cb_dbg.c @@ -79,7 +79,7 @@ int tool_debug_cb(CURL *handle, curl_infotype type, /* Ok, this is somewhat hackish but we do it undocumented for now */ config->trace_stream = config->errors; /* aka stderr */ else { - config->trace_stream = fopen(config->trace_dump, "w"); + config->trace_stream = fopen(config->trace_dump, FOPEN_WRITETEXT); config->trace_fopened = TRUE; } } diff --git a/src/tool_easysrc.c b/src/tool_easysrc.c index e1336c3d9dad53..0482ef6ae95bf2 100644 --- a/src/tool_easysrc.c +++ b/src/tool_easysrc.c @@ -176,7 +176,7 @@ void dumpeasysrc(struct GlobalConfig *config) FILE *out; bool fopened = FALSE; if(strcmp(o, "-")) { - out = fopen(o, "w"); + out = fopen(o, FOPEN_WRITETEXT); fopened = TRUE; } else diff --git a/src/tool_getparam.c b/src/tool_getparam.c index 62283a5dd3d4a1..c86e6b4b11df4e 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -681,7 +681,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ case 'v': /* --stderr */ if(strcmp(nextarg, "-")) { - FILE *newfile = fopen(nextarg, "wt"); + FILE *newfile = fopen(nextarg, FOPEN_WRITETEXT); if(!newfile) warnf(global, "Failed to open %s!\n", nextarg); else { @@ -1748,7 +1748,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */ } else { fname = nextarg; - file = fopen(nextarg, "r"); + file = fopen(nextarg, FOPEN_READTEXT); } err = file2string(&config->writeout, file); if(file && (file != stdin)) diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c index 4c25ddbd511a1e..39b43eef43e944 100644 --- a/src/tool_parsecfg.c +++ b/src/tool_parsecfg.c @@ -69,7 +69,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global) /* Check if the file exists - if not, try CURLRC in the same * directory as our executable */ - file = fopen(filebuffer, "r"); + file = fopen(filebuffer, FOPEN_READTEXT); if(file != NULL) { fclose(file); filename = filebuffer; @@ -115,7 +115,7 @@ int parseconfig(const char *filename, struct GlobalConfig *global) } if(strcmp(filename, "-")) - file = fopen(filename, "r"); + file = fopen(filename, FOPEN_READTEXT); else file = stdin;