diff options
Diffstat (limited to 'src/lib/libcrypto/o_time.c')
-rw-r--r-- | src/lib/libcrypto/o_time.c | 79 |
1 files changed, 40 insertions, 39 deletions
diff --git a/src/lib/libcrypto/o_time.c b/src/lib/libcrypto/o_time.c index 5fb5d4e6d7..44f7ba3b8c 100644 --- a/src/lib/libcrypto/o_time.c +++ b/src/lib/libcrypto/o_time.c | |||
@@ -63,14 +63,14 @@ | |||
63 | #include <string.h> | 63 | #include <string.h> |
64 | #include "o_time.h" | 64 | #include "o_time.h" |
65 | 65 | ||
66 | struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result) | 66 | struct tm |
67 | { | 67 | *OPENSSL_gmtime(const time_t *timer, struct tm *result) { |
68 | struct tm *ts = NULL; | 68 | struct tm *ts = NULL; |
69 | 69 | ||
70 | #if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_OS2) && (!defined(OPENSSL_SYS_VMS) || defined(gmtime_r)) && !defined(OPENSSL_SYS_MACOSX) && !defined(OPENSSL_SYS_SUNOS) | 70 | #if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_OS2) && (!defined(OPENSSL_SYS_VMS) || defined(gmtime_r)) && !defined(OPENSSL_SYS_MACOSX) && !defined(OPENSSL_SYS_SUNOS) |
71 | /* should return &data, but doesn't on some systems, | 71 | /* should return &data, but doesn't on some systems, |
72 | so we don't even look at the return value */ | 72 | so we don't even look at the return value */ |
73 | gmtime_r(timer,result); | 73 | gmtime_r(timer, result); |
74 | ts = result; | 74 | ts = result; |
75 | #else | 75 | #else |
76 | ts = gmtime(timer); | 76 | ts = gmtime(timer); |
@@ -81,7 +81,7 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result) | |||
81 | ts = result; | 81 | ts = result; |
82 | #endif | 82 | #endif |
83 | return ts; | 83 | return ts; |
84 | } | 84 | } |
85 | 85 | ||
86 | /* Take a tm structure and add an offset to it. This avoids any OS issues | 86 | /* Take a tm structure and add an offset to it. This avoids any OS issues |
87 | * with restricted date types and overflows which cause the year 2038 | 87 | * with restricted date types and overflows which cause the year 2038 |
@@ -93,29 +93,27 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result) | |||
93 | static long date_to_julian(int y, int m, int d); | 93 | static long date_to_julian(int y, int m, int d); |
94 | static void julian_to_date(long jd, int *y, int *m, int *d); | 94 | static void julian_to_date(long jd, int *y, int *m, int *d); |
95 | 95 | ||
96 | int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) | 96 | int |
97 | { | 97 | OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) |
98 | { | ||
98 | int offset_hms, offset_day; | 99 | int offset_hms, offset_day; |
99 | long time_jd; | 100 | long time_jd; |
100 | int time_year, time_month, time_day; | 101 | int time_year, time_month, time_day; |
101 | /* split offset into days and day seconds */ | 102 | /* split offset into days and day seconds */ |
102 | offset_day = offset_sec / SECS_PER_DAY; | 103 | offset_day = offset_sec / SECS_PER_DAY; |
103 | /* Avoid sign issues with % operator */ | 104 | /* Avoid sign issues with % operator */ |
104 | offset_hms = offset_sec - (offset_day * SECS_PER_DAY); | 105 | offset_hms = offset_sec - (offset_day * SECS_PER_DAY); |
105 | offset_day += off_day; | 106 | offset_day += off_day; |
106 | /* Add current time seconds to offset */ | 107 | /* Add current time seconds to offset */ |
107 | offset_hms += tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec; | 108 | offset_hms += tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec; |
108 | /* Adjust day seconds if overflow */ | 109 | /* Adjust day seconds if overflow */ |
109 | if (offset_hms >= SECS_PER_DAY) | 110 | if (offset_hms >= SECS_PER_DAY) { |
110 | { | ||
111 | offset_day++; | 111 | offset_day++; |
112 | offset_hms -= SECS_PER_DAY; | 112 | offset_hms -= SECS_PER_DAY; |
113 | } | 113 | } else if (offset_hms < 0) { |
114 | else if (offset_hms < 0) | ||
115 | { | ||
116 | offset_day--; | 114 | offset_day--; |
117 | offset_hms += SECS_PER_DAY; | 115 | offset_hms += SECS_PER_DAY; |
118 | } | 116 | } |
119 | 117 | ||
120 | /* Convert date of time structure into a Julian day number. | 118 | /* Convert date of time structure into a Julian day number. |
121 | */ | 119 | */ |
@@ -150,22 +148,24 @@ int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) | |||
150 | tm->tm_sec = offset_hms % 60; | 148 | tm->tm_sec = offset_hms % 60; |
151 | 149 | ||
152 | return 1; | 150 | return 1; |
153 | 151 | ||
154 | } | 152 | } |
155 | 153 | ||
156 | /* Convert date to and from julian day | 154 | /* Convert date to and from julian day |
157 | * Uses Fliegel & Van Flandern algorithm | 155 | * Uses Fliegel & Van Flandern algorithm |
158 | */ | 156 | */ |
159 | static long date_to_julian(int y, int m, int d) | 157 | static long |
158 | date_to_julian(int y, int m, int d) | ||
160 | { | 159 | { |
161 | return (1461 * (y + 4800 + (m - 14) / 12)) / 4 + | 160 | return (1461 * (y + 4800 + (m - 14) / 12)) / 4 + |
162 | (367 * (m - 2 - 12 * ((m - 14) / 12))) / 12 - | 161 | (367 * (m - 2 - 12 * ((m - 14) / 12))) / 12 - |
163 | (3 * ((y + 4900 + (m - 14) / 12) / 100)) / 4 + | 162 | (3 * ((y + 4900 + (m - 14) / 12) / 100)) / 4 + |
164 | d - 32075; | 163 | d - 32075; |
165 | } | 164 | } |
166 | 165 | ||
167 | static void julian_to_date(long jd, int *y, int *m, int *d) | 166 | static void |
168 | { | 167 | julian_to_date(long jd, int *y, int *m, int *d) |
168 | { | ||
169 | long L = jd + 68569; | 169 | long L = jd + 68569; |
170 | long n = (4 * L) / 146097; | 170 | long n = (4 * L) / 146097; |
171 | long i, j; | 171 | long i, j; |
@@ -178,7 +178,7 @@ static void julian_to_date(long jd, int *y, int *m, int *d) | |||
178 | L = j / 11; | 178 | L = j / 11; |
179 | *m = j + 2 - (12 * L); | 179 | *m = j + 2 - (12 * L); |
180 | *y = 100 * (n - 49) + i + L; | 180 | *y = 100 * (n - 49) + i + L; |
181 | } | 181 | } |
182 | 182 | ||
183 | #ifdef OPENSSL_TIME_TEST | 183 | #ifdef OPENSSL_TIME_TEST |
184 | 184 | ||
@@ -189,20 +189,21 @@ static void julian_to_date(long jd, int *y, int *m, int *d) | |||
189 | * trigger the very errors the routines fix. | 189 | * trigger the very errors the routines fix. |
190 | */ | 190 | */ |
191 | 191 | ||
192 | int main(int argc, char **argv) | 192 | int |
193 | { | 193 | main(int argc, char **argv) |
194 | { | ||
194 | long offset; | 195 | long offset; |
195 | for (offset = 0; offset < 1000000; offset++) | 196 | for (offset = 0; offset < 1000000; offset++) { |
196 | { | ||
197 | check_time(offset); | 197 | check_time(offset); |
198 | check_time(-offset); | 198 | check_time(-offset); |
199 | check_time(offset * 1000); | 199 | check_time(offset * 1000); |
200 | check_time(-offset * 1000); | 200 | check_time(-offset * 1000); |
201 | } | ||
202 | } | 201 | } |
202 | } | ||
203 | 203 | ||
204 | int check_time(long offset) | 204 | int |
205 | { | 205 | check_time(long offset) |
206 | { | ||
206 | struct tm tm1, tm2; | 207 | struct tm tm1, tm2; |
207 | time_t t1, t2; | 208 | time_t t1, t2; |
208 | time(&t1); | 209 | time(&t1); |
@@ -211,20 +212,20 @@ int check_time(long offset) | |||
211 | OPENSSL_gmtime(&t1, &tm1); | 212 | OPENSSL_gmtime(&t1, &tm1); |
212 | OPENSSL_gmtime_adj(&tm1, 0, offset); | 213 | OPENSSL_gmtime_adj(&tm1, 0, offset); |
213 | if ((tm1.tm_year == tm2.tm_year) && | 214 | if ((tm1.tm_year == tm2.tm_year) && |
214 | (tm1.tm_mon == tm2.tm_mon) && | 215 | (tm1.tm_mon == tm2.tm_mon) && |
215 | (tm1.tm_mday == tm2.tm_mday) && | 216 | (tm1.tm_mday == tm2.tm_mday) && |
216 | (tm1.tm_hour == tm2.tm_hour) && | 217 | (tm1.tm_hour == tm2.tm_hour) && |
217 | (tm1.tm_min == tm2.tm_min) && | 218 | (tm1.tm_min == tm2.tm_min) && |
218 | (tm1.tm_sec == tm2.tm_sec)) | 219 | (tm1.tm_sec == tm2.tm_sec)) |
219 | return 1; | 220 | return 1; |
220 | fprintf(stderr, "TIME ERROR!!\n"); | 221 | fprintf(stderr, "TIME ERROR!!\n"); |
221 | fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n", | 222 | fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n", |
222 | tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900, | 223 | tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900, |
223 | tm2.tm_hour, tm2.tm_min, tm2.tm_sec); | 224 | tm2.tm_hour, tm2.tm_min, tm2.tm_sec); |
224 | fprintf(stderr, "Time2: %d/%d/%d, %d:%02d:%02d\n", | 225 | fprintf(stderr, "Time2: %d/%d/%d, %d:%02d:%02d\n", |
225 | tm1.tm_mday, tm1.tm_mon + 1, tm1.tm_year + 1900, | 226 | tm1.tm_mday, tm1.tm_mon + 1, tm1.tm_year + 1900, |
226 | tm1.tm_hour, tm1.tm_min, tm1.tm_sec); | 227 | tm1.tm_hour, tm1.tm_min, tm1.tm_sec); |
227 | return 0; | 228 | return 0; |
228 | } | 229 | } |
229 | 230 | ||
230 | #endif | 231 | #endif |