## Coverage Report

#### Created: 2025-03-01 02:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)

    /libfido2/src/time.c

    Line
    Count
    Source
    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
    3.50M
    {
    14
    3.50M
            int64_t x, y;
    15
    16
    3.50M
            if (ts->tv_sec < 0 || ts->tv_nsec < 0 ||
    17
    3.50M
                ts->tv_nsec >= 1000000000LL)
    18
    3.83k
                    return -1;
    19
    20
    3.49M
            if ((uint64_t)ts->tv_sec >= INT64_MAX / 1000LL)
    21
    0
                    return -1;
    22
    23
    3.49M
            x = ts->tv_sec * 1000LL;
    24
    3.49M
            y = ts->tv_nsec / 1000000LL;
    25
    26
    3.49M
            if (INT64_MAX - x < y || x + y > INT_MAX)
    27
    0
                    return -1;
    28
    29
    3.49M
            return (int)(x + y);
    30
    3.49M
    }
    31
    32
    int
    33
    fido_time_now(struct timespec *ts_now)
    34
    4.13M
    {
    35
    4.13M
            if (clock_gettime(CLOCK_MONOTONIC, ts_now) != 0) {
    36
    8.50k
                    fido_log_error(errno, "%s: clock_gettime", __func__);
    37
    8.50k
                    return -1;
    38
    8.50k
            }
    39
    40
    4.12M
            return 0;
    41
    4.13M
    }
    42
    43
    int
    44
    fido_time_delta(const struct timespec *ts_start, int *ms_remain)
    45
    3.57M
    {
    46
    3.57M
            struct timespec ts_end, ts_delta;
    47
    3.57M
            int ms;
    48
    49
    3.57M
            if (*ms_remain < 0)
    50
    61.6k
                    return 0;
    51
    52
    3.51M
            if (clock_gettime(CLOCK_MONOTONIC, &ts_end) != 0) {
    53
    9.38k
                    fido_log_error(errno, "%s: clock_gettime", __func__);
    54
    9.38k
                    return -1;
    55
    9.38k
            }
    56
    57
    3.50M
            if (timespeccmp(&ts_end, ts_start, <)) {
    58
    2.00k
                    fido_log_debug("%s: timespeccmp", __func__);
    59
    2.00k
                    return -1;
    60
    2.00k
            }
    61
    62
    3.50M
            timespecsub(&ts_end, ts_start, &ts_delta);
    63
    64
    3.50M
            if ((ms = timespec_to_ms(&ts_delta)) < 0) {
    65
    3.83k
                    fido_log_debug("%s: timespec_to_ms", __func__);
    66
    3.83k
                    return -1;
    67
    3.83k
            }
    68
    69
    3.49M
            if (ms > *ms_remain)
    70
    123k
                    ms = *ms_remain;
    71
    72
    3.49M
            *ms_remain -= ms;
    73
    74
    3.49M
            return 0;
    75
    3.50M
    }