summaryrefslogtreecommitdiff
path: root/libs/libcurl/src/parsedate.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/libcurl/src/parsedate.c')
-rw-r--r--libs/libcurl/src/parsedate.c56
1 files changed, 24 insertions, 32 deletions
diff --git a/libs/libcurl/src/parsedate.c b/libs/libcurl/src/parsedate.c
index 6438abebea..343fa9dcfe 100644
--- a/libs/libcurl/src/parsedate.c
+++ b/libs/libcurl/src/parsedate.c
@@ -81,8 +81,9 @@
#include <curl/curl.h>
#include "strcase.h"
-#include "warnless.h"
+#include "curlx/warnless.h"
#include "parsedate.h"
+#include "curlx/strparse.h"
/*
* parsedate()
@@ -100,10 +101,12 @@ static int parsedate(const char *date, time_t *output);
#define PARSEDATE_OK 0
#define PARSEDATE_FAIL -1
#define PARSEDATE_LATER 1
+#if defined(HAVE_TIME_T_UNSIGNED) || (SIZEOF_TIME_T < 5)
#define PARSEDATE_SOONER 2
+#endif
#if !defined(CURL_DISABLE_PARSEDATE) || !defined(CURL_DISABLE_FTP) || \
- !defined(CURL_DISABLE_FILE)
+ !defined(CURL_DISABLE_FILE) || defined(USE_GNUTLS)
/* These names are also used by FTP and FILE code */
const char * const Curl_wkday[] =
{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
@@ -253,7 +256,7 @@ static int checktz(const char *check, size_t len)
if(len > 4) /* longer than any valid timezone */
return -1;
- for(i = 0; i < sizeof(tz)/sizeof(tz[0]); i++) {
+ for(i = 0; i < CURL_ARRAYSIZE(tz); i++) {
size_t ilen = strlen(what->name);
if((ilen == len) &&
strncasecompare(check, what->name, len))
@@ -336,7 +339,7 @@ match:
*h = hh;
*m = mm;
*s = ss;
- *endp = (char *)p;
+ *endp = (char *)CURL_UNCONST(p);
return TRUE;
}
@@ -409,7 +412,7 @@ static int parsedate(const char *date, time_t *output)
}
else if(ISDIGIT(*date)) {
/* a digit */
- int val;
+ unsigned int val;
char *end;
if((secnum == -1) &&
match_time(date, &hournum, &minnum, &secnum, &end)) {
@@ -417,29 +420,18 @@ static int parsedate(const char *date, time_t *output)
date = end;
}
else {
- long lval;
- int error;
- int old_errno;
-
- old_errno = errno;
- errno = 0;
- lval = strtol(date, &end, 10);
- error = errno;
- if(errno != old_errno)
- errno = old_errno;
-
- if(error)
+ curl_off_t lval;
+ int num_digits = 0;
+ const char *p = date;
+ if(curlx_str_number(&p, &lval, 99999999))
return PARSEDATE_FAIL;
-#if LONG_MAX != INT_MAX
- if((lval > (long)INT_MAX) || (lval < (long)INT_MIN))
- return PARSEDATE_FAIL;
-#endif
-
- val = curlx_sltosi(lval);
+ /* we know num_digits cannot be larger than 8 */
+ num_digits = (int)(p - date);
+ val = (unsigned int)lval;
if((tzoff == -1) &&
- ((end - date) == 4) &&
+ (num_digits == 4) &&
(val <= 1400) &&
(indate < date) &&
((date[-1] == '+' || date[-1] == '-'))) {
@@ -459,10 +451,10 @@ static int parsedate(const char *date, time_t *output)
tzoff = date[-1]=='+' ? -tzoff : tzoff;
}
- if(((end - date) == 8) &&
- (yearnum == -1) &&
- (monnum == -1) &&
- (mdaynum == -1)) {
+ else if((num_digits == 8) &&
+ (yearnum == -1) &&
+ (monnum == -1) &&
+ (mdaynum == -1)) {
/* 8 digits, no year, month or day yet. This is YYYYMMDD */
found = TRUE;
yearnum = val/10000;
@@ -494,7 +486,7 @@ static int parsedate(const char *date, time_t *output)
if(!found)
return PARSEDATE_FAIL;
- date = end;
+ date = p;
}
}
@@ -558,7 +550,7 @@ static int parsedate(const char *date, time_t *output)
if(tzoff == -1)
tzoff = 0;
- if((tzoff > 0) && (t > TIME_T_MAX - tzoff)) {
+ if((tzoff > 0) && (t > (time_t)(TIME_T_MAX - tzoff))) {
*output = TIME_T_MAX;
return PARSEDATE_LATER; /* time_t overflow */
}
@@ -586,7 +578,7 @@ time_t curl_getdate(const char *p, const time_t *now)
(void)now; /* legacy argument from the past that we ignore */
if(rc == PARSEDATE_OK) {
- if(parsed == -1)
+ if(parsed == (time_t)-1)
/* avoid returning -1 for a working scenario */
parsed++;
return parsed;
@@ -606,7 +598,7 @@ time_t Curl_getdate_capped(const char *p)
switch(rc) {
case PARSEDATE_OK:
- if(parsed == -1)
+ if(parsed == (time_t)-1)
/* avoid returning -1 for a working scenario */
parsed++;
return parsed;