diff options
Diffstat (limited to 'misc.c')
-rw-r--r-- | misc.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: misc.c,v 1.107 2016/11/30 00:28:31 dtucker Exp $ */ | 1 | /* $OpenBSD: misc.c,v 1.109 2017/03/14 00:55:37 dtucker Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2000 Markus Friedl. All rights reserved. | 3 | * Copyright (c) 2000 Markus Friedl. All rights reserved. |
4 | * Copyright (c) 2005,2006 Damien Miller. All rights reserved. | 4 | * Copyright (c) 2005,2006 Damien Miller. All rights reserved. |
@@ -308,7 +308,7 @@ a2tun(const char *s, int *remote) | |||
308 | long | 308 | long |
309 | convtime(const char *s) | 309 | convtime(const char *s) |
310 | { | 310 | { |
311 | long total, secs; | 311 | long total, secs, multiplier = 1; |
312 | const char *p; | 312 | const char *p; |
313 | char *endp; | 313 | char *endp; |
314 | 314 | ||
@@ -335,23 +335,28 @@ convtime(const char *s) | |||
335 | break; | 335 | break; |
336 | case 'm': | 336 | case 'm': |
337 | case 'M': | 337 | case 'M': |
338 | secs *= MINUTES; | 338 | multiplier = MINUTES; |
339 | break; | 339 | break; |
340 | case 'h': | 340 | case 'h': |
341 | case 'H': | 341 | case 'H': |
342 | secs *= HOURS; | 342 | multiplier = HOURS; |
343 | break; | 343 | break; |
344 | case 'd': | 344 | case 'd': |
345 | case 'D': | 345 | case 'D': |
346 | secs *= DAYS; | 346 | multiplier = DAYS; |
347 | break; | 347 | break; |
348 | case 'w': | 348 | case 'w': |
349 | case 'W': | 349 | case 'W': |
350 | secs *= WEEKS; | 350 | multiplier = WEEKS; |
351 | break; | 351 | break; |
352 | default: | 352 | default: |
353 | return -1; | 353 | return -1; |
354 | } | 354 | } |
355 | if (secs >= LONG_MAX / multiplier) | ||
356 | return -1; | ||
357 | secs *= multiplier; | ||
358 | if (total >= LONG_MAX - secs) | ||
359 | return -1; | ||
355 | total += secs; | 360 | total += secs; |
356 | if (total < 0) | 361 | if (total < 0) |
357 | return -1; | 362 | return -1; |