summaryrefslogtreecommitdiff
path: root/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc.c')
-rw-r--r--misc.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/misc.c b/misc.c
index bf9153a61..6e972f563 100644
--- a/misc.c
+++ b/misc.c
@@ -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)
308long 308long
309convtime(const char *s) 309convtime(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;