Reorganise parameters for OPENSSL_gmtime_diff.
Make ASN1_UTCTIME_cmp_time_t more robust by using the new time functions.
This commit is contained in:
parent
472af806ce
commit
46a6cec699
4 changed files with 23 additions and 34 deletions
|
@ -225,5 +225,5 @@ int ASN1_TIME_diff(int *pday, int *psec,
|
|||
return 0;
|
||||
if (!asn1_time_to_tm(&tm_to, to))
|
||||
return 0;
|
||||
return OPENSSL_gmtime_diff(&tm_from, &tm_to, pday, psec);
|
||||
return OPENSSL_gmtime_diff(pday, psec, &tm_from, &tm_to);
|
||||
}
|
||||
|
|
|
@ -287,39 +287,26 @@ ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t,
|
|||
|
||||
int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t)
|
||||
{
|
||||
struct tm *tm;
|
||||
struct tm data;
|
||||
int offset;
|
||||
int year;
|
||||
struct tm stm, ttm;
|
||||
int day, sec;
|
||||
|
||||
#define g2(p) (((p)[0]-'0')*10+(p)[1]-'0')
|
||||
if (!asn1_utctime_to_tm(&stm, s))
|
||||
return -2;
|
||||
|
||||
if (s->data[12] == 'Z')
|
||||
offset=0;
|
||||
else
|
||||
{
|
||||
offset = g2(s->data+13)*60+g2(s->data+15);
|
||||
if (s->data[12] == '-')
|
||||
offset = -offset;
|
||||
}
|
||||
if (!OPENSSL_gmtime(&t, &ttm))
|
||||
return -2;
|
||||
|
||||
t -= offset*60; /* FIXME: may overflow in extreme cases */
|
||||
|
||||
tm = OPENSSL_gmtime(&t, &data);
|
||||
|
||||
#define return_cmp(a,b) if ((a)<(b)) return -1; else if ((a)>(b)) return 1
|
||||
year = g2(s->data);
|
||||
if (year < 50)
|
||||
year += 100;
|
||||
return_cmp(year, tm->tm_year);
|
||||
return_cmp(g2(s->data+2) - 1, tm->tm_mon);
|
||||
return_cmp(g2(s->data+4), tm->tm_mday);
|
||||
return_cmp(g2(s->data+6), tm->tm_hour);
|
||||
return_cmp(g2(s->data+8), tm->tm_min);
|
||||
return_cmp(g2(s->data+10), tm->tm_sec);
|
||||
#undef g2
|
||||
#undef return_cmp
|
||||
if (!OPENSSL_gmtime_diff(&day, &sec, &stm, &ttm))
|
||||
return -2;
|
||||
|
||||
if (day > 0)
|
||||
return 1;
|
||||
if (day < 0)
|
||||
return -1;
|
||||
if (sec > 0)
|
||||
return 1;
|
||||
if (sec < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result)
|
|||
|
||||
static long date_to_julian(int y, int m, int d);
|
||||
static void julian_to_date(long jd, int *y, int *m, int *d);
|
||||
static int julian_adj(struct tm *tm, int off_day, long offset_sec,
|
||||
static int julian_adj(const struct tm *tm, int off_day, long offset_sec,
|
||||
long *pday, int *psec);
|
||||
|
||||
int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec)
|
||||
|
@ -267,7 +267,8 @@ int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec)
|
|||
|
||||
}
|
||||
|
||||
int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec)
|
||||
int OPENSSL_gmtime_diff(int *pday, int *psec,
|
||||
const struct tm *from, const struct tm *to)
|
||||
{
|
||||
int from_sec, to_sec, diff_sec;
|
||||
long from_jd, to_jd, diff_day;
|
||||
|
@ -300,7 +301,7 @@ int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec)
|
|||
|
||||
|
||||
/* Convert tm structure and offset into julian day and seconds */
|
||||
static int julian_adj(struct tm *tm, int off_day, long offset_sec,
|
||||
static int julian_adj(const struct tm *tm, int off_day, long offset_sec,
|
||||
long *pday, int *psec)
|
||||
{
|
||||
int offset_hms, offset_day;
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
|
||||
struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result);
|
||||
int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec);
|
||||
int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec);
|
||||
int OPENSSL_gmtime_diff(int *pday, int *psec,
|
||||
const struct tm *from, const struct tm *to);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue