Skip to content

Commit

Permalink
curl_setup: Add macros for FOPEN_READTEXT, FOPEN_WRITETEXT
Browse files Browse the repository at this point in the history
- Change fopen calls to use FOPEN_READTEXT instead of "r" or "rt"
- Change fopen calls to use FOPEN_WRITETEXT instead of "w" or "wt"

This change is to explicitly specify when we need to read/write text.
Unfortunately 't' is not part of POSIX fopen so we can't specify it
directly. Instead we now have FOPEN_READTEXT, FOPEN_WRITETEXT.

Prior to this change we had an issue on Windows if an application that
uses libcurl overrides the default file mode to binary. The default file
mode in Windows is normally text mode (translation mode) and that's what
libcurl expects.

Bug: curl#258 (comment)
Reported-by: Orgad Shaneh
  • Loading branch information
jay authored and jgsogo committed Oct 19, 2015
1 parent 453fb98 commit f3e016e
Show file tree
Hide file tree
Showing 10 changed files with 32 additions and 16 deletions.
4 changes: 2 additions & 2 deletions lib/cookie.c
Expand Up @@ -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? */

Expand Down Expand Up @@ -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 */
}
Expand Down
20 changes: 20 additions & 0 deletions lib/curl_setup.h
Expand Up @@ -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 */
2 changes: 1 addition & 1 deletion lib/memdebug.c
Expand Up @@ -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
Expand Down
6 changes: 1 addition & 5 deletions lib/netrc.c
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion lib/vtls/gtls.c
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion lib/vtls/openssl.c
Expand Up @@ -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)",
Expand Down
2 changes: 1 addition & 1 deletion src/tool_cb_dbg.c
Expand Up @@ -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;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/tool_easysrc.c
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions src/tool_getparam.c
Expand Up @@ -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 {
Expand Down Expand Up @@ -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))
Expand Down
4 changes: 2 additions & 2 deletions src/tool_parsecfg.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit f3e016e

Please sign in to comment.