| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | /* | 
| 2 |  |  * Copyright (c) 2021 Yubico AB. All rights reserved. | 
| 3 |  |  * Use of this source code is governed by a BSD-style | 
| 4 |  |  * license that can be found in the LICENSE file. | 
| 5 |  |  * SPDX-License-Identifier: BSD-2-Clause | 
| 6 |  |  */ | 
| 7 |  |  | 
| 8 |  | #include <errno.h> | 
| 9 |  | #include "fido.h" | 
| 10 |  |  | 
| 11 |  | static int | 
| 12 |  | timespec_to_ms(const struct timespec *ts) | 
| 13 | 621k | { | 
| 14 | 621k |         int64_t x, y; | 
| 15 |  |  | 
| 16 | 621k |         if (ts->tv_sec < 0 || ts->tv_nsec < 0 || | 
| 17 | 621k |             ts->tv_nsec >= 1000000000LL) | 
| 18 | 859 |                 return -1; | 
| 19 |  |  | 
| 20 | 620k |         if ((uint64_t)ts->tv_sec >= INT64_MAX / 1000LL) | 
| 21 | 0 |                 return -1; | 
| 22 |  |  | 
| 23 | 620k |         x = ts->tv_sec * 1000LL; | 
| 24 | 620k |         y = ts->tv_nsec / 1000000LL; | 
| 25 |  |  | 
| 26 | 620k |         if (INT64_MAX - x < y || x + y > INT_MAX) | 
| 27 | 0 |                 return -1; | 
| 28 |  |  | 
| 29 | 620k |         return (int)(x + y); | 
| 30 | 620k | } | 
| 31 |  |  | 
| 32 |  | int | 
| 33 |  | fido_time_now(struct timespec *ts_now) | 
| 34 | 704k | { | 
| 35 | 704k |         if (clock_gettime(CLOCK_MONOTONIC, ts_now) != 0) { | 
| 36 | 1.41k |                 fido_log_error(errno, "%s: clock_gettime", __func__); | 
| 37 | 1.41k |                 return -1; | 
| 38 | 1.41k |         } | 
| 39 |  |  | 
| 40 | 702k |         return 0; | 
| 41 | 704k | } | 
| 42 |  |  | 
| 43 |  | int | 
| 44 |  | fido_time_delta(const struct timespec *ts_start, int *ms_remain) | 
| 45 | 632k | { | 
| 46 | 632k |         struct timespec ts_end, ts_delta; | 
| 47 | 632k |         int ms; | 
| 48 |  |  | 
| 49 | 632k |         if (*ms_remain < 0) | 
| 50 | 9.96k |                 return 0; | 
| 51 |  |  | 
| 52 | 622k |         if (clock_gettime(CLOCK_MONOTONIC, &ts_end) != 0) { | 
| 53 | 812 |                 fido_log_error(errno, "%s: clock_gettime", __func__); | 
| 54 | 812 |                 return -1; | 
| 55 | 812 |         } | 
| 56 |  |  | 
| 57 | 621k |         if (timespeccmp(&ts_end, ts_start, <)) { | 
| 58 | 521 |                 fido_log_debug("%s: timespeccmp", __func__); | 
| 59 | 521 |                 return -1; | 
| 60 | 521 |         } | 
| 61 |  |  | 
| 62 | 621k |         timespecsub(&ts_end, ts_start, &ts_delta); | 
| 63 |  |  | 
| 64 | 621k |         if ((ms = timespec_to_ms(&ts_delta)) < 0) { | 
| 65 | 859 |                 fido_log_debug("%s: timespec_to_ms", __func__); | 
| 66 | 859 |                 return -1; | 
| 67 | 859 |         } | 
| 68 |  |  | 
| 69 | 620k |         if (ms > *ms_remain) | 
| 70 | 41.1k |                 ms = *ms_remain; | 
| 71 |  |  | 
| 72 | 620k |         *ms_remain -= ms; | 
| 73 |  |  | 
| 74 | 620k |         return 0; | 
| 75 | 621k | } |