Commit e8423f9c authored by Jay Satiro's avatar Jay Satiro
Browse files

curl_setup: Add macros for FOPEN_READTEXT, FOPEN_WRITETEXT

- 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: https://github.com/bagder/curl/pull/258#issuecomment-107093055
Reported-by: Orgad Shaneh
parent 9f5dcab8
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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 */
  }
+20 −0
Original line number Diff line number Diff line
@@ -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 */
+1 −1
Original line number Diff line number Diff line
@@ -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
+1 −5
Original line number Diff line number Diff line
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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
Loading