|  | @@ -49,6 +49,7 @@
 | 
	
		
			
				|  |  |  #define MAX_HSTS_HOSTLENSTR "256"
 | 
	
		
			
				|  |  |  #define MAX_HSTS_DATELEN 64
 | 
	
		
			
				|  |  |  #define MAX_HSTS_DATELENSTR "64"
 | 
	
		
			
				|  |  | +#define UNLIMITED "unlimited"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #ifdef DEBUGBUILD
 | 
	
		
			
				|  |  |  /* to play well with debug builds, we can *set* a fixed time this will
 | 
	
	
		
			
				|  | @@ -283,13 +284,17 @@ static CURLcode hsts_push(struct Curl_easy *data,
 | 
	
		
			
				|  |  |    e.namelen = strlen(sts->host);
 | 
	
		
			
				|  |  |    e.includeSubDomains = sts->includeSubDomains;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  result = Curl_gmtime((time_t)sts->expires, &stamp);
 | 
	
		
			
				|  |  | -  if(result)
 | 
	
		
			
				|  |  | -    return result;
 | 
	
		
			
				|  |  | +  if(sts->expires != TIME_T_MAX) {
 | 
	
		
			
				|  |  | +    result = Curl_gmtime((time_t)sts->expires, &stamp);
 | 
	
		
			
				|  |  | +    if(result)
 | 
	
		
			
				|  |  | +      return result;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  msnprintf(e.expire, sizeof(e.expire), "%d%02d%02d %02d:%02d:%02d",
 | 
	
		
			
				|  |  | -            stamp.tm_year + 1900, stamp.tm_mon + 1, stamp.tm_mday,
 | 
	
		
			
				|  |  | -            stamp.tm_hour, stamp.tm_min, stamp.tm_sec);
 | 
	
		
			
				|  |  | +    msnprintf(e.expire, sizeof(e.expire), "%d%02d%02d %02d:%02d:%02d",
 | 
	
		
			
				|  |  | +              stamp.tm_year + 1900, stamp.tm_mon + 1, stamp.tm_mday,
 | 
	
		
			
				|  |  | +              stamp.tm_hour, stamp.tm_min, stamp.tm_sec);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  else
 | 
	
		
			
				|  |  | +    strcpy(e.expire, UNLIMITED);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    sc = data->set.hsts_write(data, &e, i,
 | 
	
		
			
				|  |  |                              data->set.hsts_write_userp);
 | 
	
	
		
			
				|  | @@ -303,14 +308,18 @@ static CURLcode hsts_push(struct Curl_easy *data,
 | 
	
		
			
				|  |  |  static CURLcode hsts_out(struct stsentry *sts, FILE *fp)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |    struct tm stamp;
 | 
	
		
			
				|  |  | -  CURLcode result = Curl_gmtime((time_t)sts->expires, &stamp);
 | 
	
		
			
				|  |  | -  if(result)
 | 
	
		
			
				|  |  | -    return result;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  fprintf(fp, "%s%s \"%d%02d%02d %02d:%02d:%02d\"\n",
 | 
	
		
			
				|  |  | -          sts->includeSubDomains ? ".": "", sts->host,
 | 
	
		
			
				|  |  | -          stamp.tm_year + 1900, stamp.tm_mon + 1, stamp.tm_mday,
 | 
	
		
			
				|  |  | -          stamp.tm_hour, stamp.tm_min, stamp.tm_sec);
 | 
	
		
			
				|  |  | +  if(sts->expires != TIME_T_MAX) {
 | 
	
		
			
				|  |  | +    CURLcode result = Curl_gmtime((time_t)sts->expires, &stamp);
 | 
	
		
			
				|  |  | +    if(result)
 | 
	
		
			
				|  |  | +      return result;
 | 
	
		
			
				|  |  | +    fprintf(fp, "%s%s \"%d%02d%02d %02d:%02d:%02d\"\n",
 | 
	
		
			
				|  |  | +            sts->includeSubDomains ? ".": "", sts->host,
 | 
	
		
			
				|  |  | +            stamp.tm_year + 1900, stamp.tm_mon + 1, stamp.tm_mday,
 | 
	
		
			
				|  |  | +            stamp.tm_hour, stamp.tm_min, stamp.tm_sec);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  else
 | 
	
		
			
				|  |  | +    fprintf(fp, "%s%s \"%s\"\n",
 | 
	
		
			
				|  |  | +            sts->includeSubDomains ? ".": "", sts->host, UNLIMITED);
 | 
	
		
			
				|  |  |    return CURLE_OK;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -403,7 +412,8 @@ static CURLcode hsts_add(struct hsts *h, char *line)
 | 
	
		
			
				|  |  |                "%" MAX_HSTS_HOSTLENSTR "s \"%" MAX_HSTS_DATELENSTR "[^\"]\"",
 | 
	
		
			
				|  |  |                host, date);
 | 
	
		
			
				|  |  |    if(2 == rc) {
 | 
	
		
			
				|  |  | -    time_t expires = Curl_getdate_capped(date);
 | 
	
		
			
				|  |  | +    time_t expires = strcmp(date, UNLIMITED) ? Curl_getdate_capped(date) :
 | 
	
		
			
				|  |  | +      TIME_T_MAX;
 | 
	
		
			
				|  |  |      CURLcode result;
 | 
	
		
			
				|  |  |      char *p = host;
 | 
	
		
			
				|  |  |      bool subdomain = FALSE;
 | 
	
	
		
			
				|  | @@ -456,7 +466,7 @@ static CURLcode hsts_pull(struct Curl_easy *data, struct hsts *h)
 | 
	
		
			
				|  |  |            return result;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        else if(sc == CURLSTS_FAIL)
 | 
	
		
			
				|  |  | -        return CURLE_BAD_FUNCTION_ARGUMENT;
 | 
	
		
			
				|  |  | +        return CURLE_ABORTED_BY_CALLBACK;
 | 
	
		
			
				|  |  |      } while(sc == CURLSTS_OK);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    return CURLE_OK;
 |