Coverage Report

Created: 2025-12-31 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl33/include/internal/safe_math.h
Line
Count
Source
1
/*
2
 * Copyright 2021-2022 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
10
#ifndef OSSL_INTERNAL_SAFE_MATH_H
11
#define OSSL_INTERNAL_SAFE_MATH_H
12
#pragma once
13
14
#include <openssl/e_os2.h> /* For 'ossl_inline' */
15
16
#ifndef OPENSSL_NO_BUILTIN_OVERFLOW_CHECKING
17
#ifdef __has_builtin
18
#define has(func) __has_builtin(func)
19
#elif defined(__GNUC__)
20
#if __GNUC__ > 5
21
#define has(func) 1
22
#endif
23
#endif
24
#endif /* OPENSSL_NO_BUILTIN_OVERFLOW_CHECKING */
25
26
#ifndef has
27
#define has(func) 0
28
#endif
29
30
/*
31
 * Safe addition helpers
32
 */
33
#if has(__builtin_add_overflow)
34
#define OSSL_SAFE_MATH_ADDS(type_name, type, min, max)               \
35
    static ossl_inline ossl_unused type safe_add_##type_name(type a, \
36
        type b,                                                      \
37
        int *err)                                                    \
38
430
    {                                                                \
39
430
        type r;                                                      \
40
430
                                                                     \
41
430
        if (!__builtin_add_overflow(a, b, &r))                       \
42
430
            return r;                                                \
43
430
        *err |= 1;                                                   \
44
0
        return a < 0 ? min : max;                                    \
45
430
    }
Unexecuted instantiation: evp_enc.c:safe_add_int
Unexecuted instantiation: stack.c:safe_add_int
v3_ncons.c:safe_add_int
Line
Count
Source
38
430
    {                                                                \
39
430
        type r;                                                      \
40
430
                                                                     \
41
430
        if (!__builtin_add_overflow(a, b, &r))                       \
42
430
            return r;                                                \
43
430
        *err |= 1;                                                   \
44
0
        return a < 0 ? min : max;                                    \
45
430
    }
46
47
#define OSSL_SAFE_MATH_ADDU(type_name, type, max)                    \
48
    static ossl_inline ossl_unused type safe_add_##type_name(type a, \
49
        type b,                                                      \
50
        int *err)                                                    \
51
318M
    {                                                                \
52
318M
        type r;                                                      \
53
318M
                                                                     \
54
318M
        if (!__builtin_add_overflow(a, b, &r))                       \
55
318M
            return r;                                                \
56
318M
        *err |= 1;                                                   \
57
7.00k
        return a + b;                                                \
58
318M
    }
quic-client.c:safe_add_time
Line
Count
Source
51
129M
    {                                                                \
52
129M
        type r;                                                      \
53
129M
                                                                     \
54
129M
        if (!__builtin_add_overflow(a, b, &r))                       \
55
129M
            return r;                                                \
56
129M
        *err |= 1;                                                   \
57
0
        return a + b;                                                \
58
129M
    }
Unexecuted instantiation: ssl_cert.c:safe_add_time
Unexecuted instantiation: ssl_ciph.c:safe_add_time
Unexecuted instantiation: ssl_init.c:safe_add_time
Unexecuted instantiation: ssl_lib.c:safe_add_time
Unexecuted instantiation: ssl_mcnf.c:safe_add_time
ssl_sess.c:safe_add_time
Line
Count
Source
51
300k
    {                                                                \
52
300k
        type r;                                                      \
53
300k
                                                                     \
54
300k
        if (!__builtin_add_overflow(a, b, &r))                       \
55
300k
            return r;                                                \
56
300k
        *err |= 1;                                                   \
57
469
        return a + b;                                                \
58
300k
    }
Unexecuted instantiation: t1_lib.c:safe_add_time
Unexecuted instantiation: tls13_enc.c:safe_add_time
Unexecuted instantiation: tls_depr.c:safe_add_time
Unexecuted instantiation: tls_srp.c:safe_add_time
quic_impl.c:safe_add_time
Line
Count
Source
51
76.6M
    {                                                                \
52
76.6M
        type r;                                                      \
53
76.6M
                                                                     \
54
76.6M
        if (!__builtin_add_overflow(a, b, &r))                       \
55
76.6M
            return r;                                                \
56
76.6M
        *err |= 1;                                                   \
57
0
        return a + b;                                                \
58
76.6M
    }
Unexecuted instantiation: quic_method.c:safe_add_time
Unexecuted instantiation: quic_port.c:safe_add_time
Unexecuted instantiation: quic_reactor.c:safe_add_time
Unexecuted instantiation: quic_record_rx.c:safe_add_time
Unexecuted instantiation: quic_record_shared.c:safe_add_time
Unexecuted instantiation: quic_record_tx.c:safe_add_time
Unexecuted instantiation: quic_record_util.c:safe_add_time
Unexecuted instantiation: quic_rstream.c:safe_add_u64
Unexecuted instantiation: quic_rstream.c:safe_add_time
Unexecuted instantiation: quic_sf_list.c:safe_add_time
Unexecuted instantiation: quic_srtm.c:safe_add_time
Unexecuted instantiation: quic_sstream.c:safe_add_time
Unexecuted instantiation: quic_sstream.c:safe_add_u64
quic_statm.c:safe_add_time
Line
Count
Source
51
49.4k
    {                                                                \
52
49.4k
        type r;                                                      \
53
49.4k
                                                                     \
54
49.4k
        if (!__builtin_add_overflow(a, b, &r))                       \
55
49.4k
            return r;                                                \
56
49.4k
        *err |= 1;                                                   \
57
476
        return a + b;                                                \
58
49.4k
    }
Unexecuted instantiation: quic_stream_map.c:safe_add_time
Unexecuted instantiation: quic_thread_assist.c:safe_add_time
Unexecuted instantiation: rec_layer_s3.c:safe_add_time
Unexecuted instantiation: dtls_meth.c:safe_add_time
Unexecuted instantiation: tls1_meth.c:safe_add_time
Unexecuted instantiation: tls_common.c:safe_add_time
Unexecuted instantiation: tls_multib.c:safe_add_time
Unexecuted instantiation: tlsany_meth.c:safe_add_time
Unexecuted instantiation: extensions.c:safe_add_time
Unexecuted instantiation: extensions_clnt.c:safe_add_time
Unexecuted instantiation: extensions_cust.c:safe_add_time
extensions_srvr.c:safe_add_time
Line
Count
Source
51
552
    {                                                                \
52
552
        type r;                                                      \
53
552
                                                                     \
54
552
        if (!__builtin_add_overflow(a, b, &r))                       \
55
552
            return r;                                                \
56
552
        *err |= 1;                                                   \
57
0
        return a + b;                                                \
58
552
    }
Unexecuted instantiation: statem.c:safe_add_time
Unexecuted instantiation: statem_clnt.c:safe_add_time
Unexecuted instantiation: statem_dtls.c:safe_add_time
Unexecuted instantiation: statem_lib.c:safe_add_time
Unexecuted instantiation: statem_srvr.c:safe_add_time
d1_lib.c:safe_add_time
Line
Count
Source
51
175k
    {                                                                \
52
175k
        type r;                                                      \
53
175k
                                                                     \
54
175k
        if (!__builtin_add_overflow(a, b, &r))                       \
55
175k
            return r;                                                \
56
175k
        *err |= 1;                                                   \
57
0
        return a + b;                                                \
58
175k
    }
Unexecuted instantiation: d1_srtp.c:safe_add_time
Unexecuted instantiation: methods.c:safe_add_time
Unexecuted instantiation: pqueue.c:safe_add_time
Unexecuted instantiation: s3_enc.c:safe_add_time
Unexecuted instantiation: s3_lib.c:safe_add_time
Unexecuted instantiation: s3_msg.c:safe_add_time
Unexecuted instantiation: ssl_asn1.c:safe_add_time
Unexecuted instantiation: ssl_conf.c:safe_add_time
Unexecuted instantiation: ssl_rsa.c:safe_add_time
Unexecuted instantiation: t1_enc.c:safe_add_time
Unexecuted instantiation: qlog_event_helpers.c:safe_add_time
quic_channel.c:safe_add_time
Line
Count
Source
51
35.2M
    {                                                                \
52
35.2M
        type r;                                                      \
53
35.2M
                                                                     \
54
35.2M
        if (!__builtin_add_overflow(a, b, &r))                       \
55
35.2M
            return r;                                                \
56
35.2M
        *err |= 1;                                                   \
57
0
        return a + b;                                                \
58
35.2M
    }
Unexecuted instantiation: quic_demux.c:safe_add_time
Unexecuted instantiation: quic_engine.c:safe_add_time
Unexecuted instantiation: quic_fc.c:safe_add_uint64_t
Unexecuted instantiation: quic_fc.c:safe_add_time
Unexecuted instantiation: quic_lcidm.c:safe_add_time
Unexecuted instantiation: quic_rx_depack.c:safe_add_time
Unexecuted instantiation: quic_tls.c:safe_add_time
Unexecuted instantiation: quic_txp.c:safe_add_time
Unexecuted instantiation: quic_txpim.c:safe_add_time
Unexecuted instantiation: quic_wire.c:safe_add_time
Unexecuted instantiation: quic_wire.c:safe_add_uint64_t
Unexecuted instantiation: rec_layer_d1.c:safe_add_time
Unexecuted instantiation: ssl3_meth.c:safe_add_time
Unexecuted instantiation: tls13_meth.c:safe_add_time
Unexecuted instantiation: d1_msg.c:safe_add_time
Unexecuted instantiation: cc_newreno.c:safe_add_u64
Unexecuted instantiation: cc_newreno.c:safe_add_time
Unexecuted instantiation: qlog.c:safe_add_time
quic_ackm.c:safe_add_time
Line
Count
Source
51
76.6M
    {                                                                \
52
76.6M
        type r;                                                      \
53
76.6M
                                                                     \
54
76.6M
        if (!__builtin_add_overflow(a, b, &r))                       \
55
76.6M
            return r;                                                \
56
76.6M
        *err |= 1;                                                   \
57
6.05k
        return a + b;                                                \
58
76.6M
    }
Unexecuted instantiation: quic_fifd.c:safe_add_time
Unexecuted instantiation: bss_dgram.c:safe_add_time
Unexecuted instantiation: bss_dgram_pair.c:safe_add_size_t
Unexecuted instantiation: ct_policy.c:safe_add_time
Unexecuted instantiation: sleep.c:safe_add_time
Unexecuted instantiation: time.c:safe_add_time
Unexecuted instantiation: thread_posix.c:safe_add_time
Unexecuted instantiation: arch.c:safe_add_time
Unexecuted instantiation: internal.c:safe_add_time
Unexecuted instantiation: argon2.c:safe_add_time
tls1_prf.c:safe_add_size_t
Line
Count
Source
51
170k
    {                                                                \
52
170k
        type r;                                                      \
53
170k
                                                                     \
54
170k
        if (!__builtin_add_overflow(a, b, &r))                       \
55
170k
            return r;                                                \
56
170k
        *err |= 1;                                                   \
57
0
        return a + b;                                                \
58
170k
    }
Unexecuted instantiation: quic-srtm.c:safe_add_time
Unexecuted instantiation: quic-rcidm.c:safe_add_time
Unexecuted instantiation: quic_rcidm.c:safe_add_time
Unexecuted instantiation: priority_queue.c:safe_add_size_t
Unexecuted instantiation: ssl_txt.c:safe_add_time
Unexecuted instantiation: quic-lcidm.c:safe_add_time
59
60
#else /* has(__builtin_add_overflow) */
61
#define OSSL_SAFE_MATH_ADDS(type_name, type, min, max)               \
62
    static ossl_inline ossl_unused type safe_add_##type_name(type a, \
63
        type b,                                                      \
64
        int *err)                                                    \
65
    {                                                                \
66
        if ((a < 0) ^ (b < 0)                                        \
67
            || (a > 0 && b <= max - a)                               \
68
            || (a < 0 && b >= min - a)                               \
69
            || a == 0)                                               \
70
            return a + b;                                            \
71
        *err |= 1;                                                   \
72
        return a < 0 ? min : max;                                    \
73
    }
74
75
#define OSSL_SAFE_MATH_ADDU(type_name, type, max)                    \
76
    static ossl_inline ossl_unused type safe_add_##type_name(type a, \
77
        type b,                                                      \
78
        int *err)                                                    \
79
    {                                                                \
80
        if (b > max - a)                                             \
81
            *err |= 1;                                               \
82
        return a + b;                                                \
83
    }
84
#endif /* has(__builtin_add_overflow) */
85
86
/*
87
 * Safe subtraction helpers
88
 */
89
#if has(__builtin_sub_overflow)
90
#define OSSL_SAFE_MATH_SUBS(type_name, type, min, max)               \
91
    static ossl_inline ossl_unused type safe_sub_##type_name(type a, \
92
        type b,                                                      \
93
        int *err)                                                    \
94
0
    {                                                                \
95
0
        type r;                                                      \
96
0
                                                                     \
97
0
        if (!__builtin_sub_overflow(a, b, &r))                       \
98
0
            return r;                                                \
99
0
        *err |= 1;                                                   \
100
0
        return a < 0 ? min : max;                                    \
101
0
    }
Unexecuted instantiation: evp_enc.c:safe_sub_int
Unexecuted instantiation: stack.c:safe_sub_int
Unexecuted instantiation: v3_ncons.c:safe_sub_int
102
103
#else /* has(__builtin_sub_overflow) */
104
#define OSSL_SAFE_MATH_SUBS(type_name, type, min, max)               \
105
    static ossl_inline ossl_unused type safe_sub_##type_name(type a, \
106
        type b,                                                      \
107
        int *err)                                                    \
108
    {                                                                \
109
        if (!((a < 0) ^ (b < 0))                                     \
110
            || (b > 0 && a >= min + b)                               \
111
            || (b < 0 && a <= max + b)                               \
112
            || b == 0)                                               \
113
            return a - b;                                            \
114
        *err |= 1;                                                   \
115
        return a < 0 ? min : max;                                    \
116
    }
117
118
#endif /* has(__builtin_sub_overflow) */
119
120
#define OSSL_SAFE_MATH_SUBU(type_name, type)                         \
121
    static ossl_inline ossl_unused type safe_sub_##type_name(type a, \
122
        type b,                                                      \
123
        int *err)                                                    \
124
77.4M
    {                                                                \
125
77.4M
        if (b > a)                                                   \
126
77.4M
            *err |= 1;                                               \
127
77.4M
        return a - b;                                                \
128
77.4M
    }
Unexecuted instantiation: quic-client.c:safe_sub_time
Unexecuted instantiation: ssl_cert.c:safe_sub_time
Unexecuted instantiation: ssl_ciph.c:safe_sub_time
Unexecuted instantiation: ssl_init.c:safe_sub_time
Unexecuted instantiation: ssl_lib.c:safe_sub_time
Unexecuted instantiation: ssl_mcnf.c:safe_sub_time
Unexecuted instantiation: ssl_sess.c:safe_sub_time
Unexecuted instantiation: t1_lib.c:safe_sub_time
Unexecuted instantiation: tls13_enc.c:safe_sub_time
Unexecuted instantiation: tls_depr.c:safe_sub_time
Unexecuted instantiation: tls_srp.c:safe_sub_time
quic_impl.c:safe_sub_time
Line
Count
Source
124
76.6M
    {                                                                \
125
76.6M
        if (b > a)                                                   \
126
76.6M
            *err |= 1;                                               \
127
76.6M
        return a - b;                                                \
128
76.6M
    }
Unexecuted instantiation: quic_method.c:safe_sub_time
Unexecuted instantiation: quic_port.c:safe_sub_time
Unexecuted instantiation: quic_reactor.c:safe_sub_time
Unexecuted instantiation: quic_record_rx.c:safe_sub_time
Unexecuted instantiation: quic_record_shared.c:safe_sub_time
Unexecuted instantiation: quic_record_tx.c:safe_sub_time
Unexecuted instantiation: quic_record_util.c:safe_sub_time
Unexecuted instantiation: quic_rstream.c:safe_sub_time
Unexecuted instantiation: quic_rstream.c:safe_sub_u64
Unexecuted instantiation: quic_sf_list.c:safe_sub_time
Unexecuted instantiation: quic_srtm.c:safe_sub_time
Unexecuted instantiation: quic_sstream.c:safe_sub_time
Unexecuted instantiation: quic_sstream.c:safe_sub_u64
quic_statm.c:safe_sub_time
Line
Count
Source
124
31.1k
    {                                                                \
125
31.1k
        if (b > a)                                                   \
126
31.1k
            *err |= 1;                                               \
127
31.1k
        return a - b;                                                \
128
31.1k
    }
Unexecuted instantiation: quic_stream_map.c:safe_sub_time
Unexecuted instantiation: quic_thread_assist.c:safe_sub_time
Unexecuted instantiation: rec_layer_s3.c:safe_sub_time
Unexecuted instantiation: dtls_meth.c:safe_sub_time
Unexecuted instantiation: tls1_meth.c:safe_sub_time
Unexecuted instantiation: tls_common.c:safe_sub_time
Unexecuted instantiation: tls_multib.c:safe_sub_time
Unexecuted instantiation: tlsany_meth.c:safe_sub_time
Unexecuted instantiation: extensions.c:safe_sub_time
Unexecuted instantiation: extensions_clnt.c:safe_sub_time
Unexecuted instantiation: extensions_cust.c:safe_sub_time
extensions_srvr.c:safe_sub_time
Line
Count
Source
124
858
    {                                                                \
125
858
        if (b > a)                                                   \
126
858
            *err |= 1;                                               \
127
858
        return a - b;                                                \
128
858
    }
Unexecuted instantiation: statem.c:safe_sub_time
Unexecuted instantiation: statem_clnt.c:safe_sub_time
Unexecuted instantiation: statem_dtls.c:safe_sub_time
Unexecuted instantiation: statem_lib.c:safe_sub_time
Unexecuted instantiation: statem_srvr.c:safe_sub_time
d1_lib.c:safe_sub_time
Line
Count
Source
124
219k
    {                                                                \
125
219k
        if (b > a)                                                   \
126
219k
            *err |= 1;                                               \
127
219k
        return a - b;                                                \
128
219k
    }
Unexecuted instantiation: d1_srtp.c:safe_sub_time
Unexecuted instantiation: methods.c:safe_sub_time
Unexecuted instantiation: pqueue.c:safe_sub_time
Unexecuted instantiation: s3_enc.c:safe_sub_time
Unexecuted instantiation: s3_lib.c:safe_sub_time
Unexecuted instantiation: s3_msg.c:safe_sub_time
Unexecuted instantiation: ssl_asn1.c:safe_sub_time
Unexecuted instantiation: ssl_conf.c:safe_sub_time
Unexecuted instantiation: ssl_rsa.c:safe_sub_time
Unexecuted instantiation: t1_enc.c:safe_sub_time
Unexecuted instantiation: qlog_event_helpers.c:safe_sub_time
Unexecuted instantiation: quic_channel.c:safe_sub_time
Unexecuted instantiation: quic_demux.c:safe_sub_time
Unexecuted instantiation: quic_engine.c:safe_sub_time
Unexecuted instantiation: quic_fc.c:safe_sub_time
Unexecuted instantiation: quic_fc.c:safe_sub_uint64_t
Unexecuted instantiation: quic_lcidm.c:safe_sub_time
Unexecuted instantiation: quic_rx_depack.c:safe_sub_time
Unexecuted instantiation: quic_tls.c:safe_sub_time
Unexecuted instantiation: quic_txp.c:safe_sub_time
Unexecuted instantiation: quic_txpim.c:safe_sub_time
Unexecuted instantiation: quic_wire.c:safe_sub_time
Unexecuted instantiation: quic_wire.c:safe_sub_uint64_t
Unexecuted instantiation: rec_layer_d1.c:safe_sub_time
Unexecuted instantiation: ssl3_meth.c:safe_sub_time
Unexecuted instantiation: tls13_meth.c:safe_sub_time
Unexecuted instantiation: d1_msg.c:safe_sub_time
Unexecuted instantiation: cc_newreno.c:safe_sub_time
Unexecuted instantiation: cc_newreno.c:safe_sub_u64
Unexecuted instantiation: qlog.c:safe_sub_time
quic_ackm.c:safe_sub_time
Line
Count
Source
124
526k
    {                                                                \
125
526k
        if (b > a)                                                   \
126
526k
            *err |= 1;                                               \
127
526k
        return a - b;                                                \
128
526k
    }
Unexecuted instantiation: quic_fifd.c:safe_sub_time
Unexecuted instantiation: bss_dgram.c:safe_sub_time
Unexecuted instantiation: bss_dgram_pair.c:safe_sub_size_t
Unexecuted instantiation: ct_policy.c:safe_sub_time
Unexecuted instantiation: sleep.c:safe_sub_time
Unexecuted instantiation: time.c:safe_sub_time
Unexecuted instantiation: thread_posix.c:safe_sub_time
Unexecuted instantiation: arch.c:safe_sub_time
Unexecuted instantiation: internal.c:safe_sub_time
Unexecuted instantiation: argon2.c:safe_sub_time
Unexecuted instantiation: tls1_prf.c:safe_sub_size_t
Unexecuted instantiation: quic-srtm.c:safe_sub_time
Unexecuted instantiation: quic-rcidm.c:safe_sub_time
Unexecuted instantiation: quic_rcidm.c:safe_sub_time
Unexecuted instantiation: priority_queue.c:safe_sub_size_t
Unexecuted instantiation: ssl_txt.c:safe_sub_time
Unexecuted instantiation: quic-lcidm.c:safe_sub_time
129
130
/*
131
 * Safe multiplication helpers
132
 */
133
#if has(__builtin_mul_overflow)
134
#define OSSL_SAFE_MATH_MULS(type_name, type, min, max)               \
135
    static ossl_inline ossl_unused type safe_mul_##type_name(type a, \
136
        type b,                                                      \
137
        int *err)                                                    \
138
5.04M
    {                                                                \
139
5.04M
        type r;                                                      \
140
5.04M
                                                                     \
141
5.04M
        if (!__builtin_mul_overflow(a, b, &r))                       \
142
5.04M
            return r;                                                \
143
5.04M
        *err |= 1;                                                   \
144
0
        return (a < 0) ^ (b < 0) ? min : max;                        \
145
5.04M
    }
Unexecuted instantiation: evp_enc.c:safe_mul_int
stack.c:safe_mul_int
Line
Count
Source
138
5.04M
    {                                                                \
139
5.04M
        type r;                                                      \
140
5.04M
                                                                     \
141
5.04M
        if (!__builtin_mul_overflow(a, b, &r))                       \
142
5.04M
            return r;                                                \
143
5.04M
        *err |= 1;                                                   \
144
0
        return (a < 0) ^ (b < 0) ? min : max;                        \
145
5.04M
    }
Unexecuted instantiation: v3_ncons.c:safe_mul_int
146
147
#define OSSL_SAFE_MATH_MULU(type_name, type, max)                    \
148
    static ossl_inline ossl_unused type safe_mul_##type_name(type a, \
149
        type b,                                                      \
150
        int *err)                                                    \
151
77.3M
    {                                                                \
152
77.3M
        type r;                                                      \
153
77.3M
                                                                     \
154
77.3M
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
77.3M
            return r;                                                \
156
77.3M
        *err |= 1;                                                   \
157
18.2k
        return a * b;                                                \
158
77.3M
    }
Unexecuted instantiation: quic-client.c:safe_mul_time
Unexecuted instantiation: ssl_cert.c:safe_mul_time
Unexecuted instantiation: ssl_ciph.c:safe_mul_time
Unexecuted instantiation: ssl_init.c:safe_mul_time
Unexecuted instantiation: ssl_lib.c:safe_mul_time
Unexecuted instantiation: ssl_mcnf.c:safe_mul_time
Unexecuted instantiation: ssl_sess.c:safe_mul_time
Unexecuted instantiation: t1_lib.c:safe_mul_time
Unexecuted instantiation: tls13_enc.c:safe_mul_time
Unexecuted instantiation: tls_depr.c:safe_mul_time
Unexecuted instantiation: tls_srp.c:safe_mul_time
Unexecuted instantiation: quic_impl.c:safe_mul_time
Unexecuted instantiation: quic_method.c:safe_mul_time
Unexecuted instantiation: quic_port.c:safe_mul_time
Unexecuted instantiation: quic_reactor.c:safe_mul_time
Unexecuted instantiation: quic_record_rx.c:safe_mul_time
Unexecuted instantiation: quic_record_shared.c:safe_mul_time
Unexecuted instantiation: quic_record_tx.c:safe_mul_time
Unexecuted instantiation: quic_record_util.c:safe_mul_time
Unexecuted instantiation: quic_rstream.c:safe_mul_time
Unexecuted instantiation: quic_rstream.c:safe_mul_u64
Unexecuted instantiation: quic_sf_list.c:safe_mul_time
Unexecuted instantiation: quic_srtm.c:safe_mul_time
Unexecuted instantiation: quic_sstream.c:safe_mul_time
Unexecuted instantiation: quic_sstream.c:safe_mul_u64
quic_statm.c:safe_mul_time
Line
Count
Source
151
32.9k
    {                                                                \
152
32.9k
        type r;                                                      \
153
32.9k
                                                                     \
154
32.9k
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
32.9k
            return r;                                                \
156
32.9k
        *err |= 1;                                                   \
157
0
        return a * b;                                                \
158
32.9k
    }
Unexecuted instantiation: quic_stream_map.c:safe_mul_time
Unexecuted instantiation: quic_thread_assist.c:safe_mul_time
Unexecuted instantiation: rec_layer_s3.c:safe_mul_time
Unexecuted instantiation: dtls_meth.c:safe_mul_time
Unexecuted instantiation: tls1_meth.c:safe_mul_time
Unexecuted instantiation: tls_common.c:safe_mul_time
Unexecuted instantiation: tls_multib.c:safe_mul_time
Unexecuted instantiation: tlsany_meth.c:safe_mul_time
Unexecuted instantiation: extensions.c:safe_mul_time
Unexecuted instantiation: extensions_clnt.c:safe_mul_time
Unexecuted instantiation: extensions_cust.c:safe_mul_time
Unexecuted instantiation: extensions_srvr.c:safe_mul_time
Unexecuted instantiation: statem.c:safe_mul_time
Unexecuted instantiation: statem_clnt.c:safe_mul_time
Unexecuted instantiation: statem_dtls.c:safe_mul_time
Unexecuted instantiation: statem_lib.c:safe_mul_time
Unexecuted instantiation: statem_srvr.c:safe_mul_time
Unexecuted instantiation: d1_lib.c:safe_mul_time
Unexecuted instantiation: d1_srtp.c:safe_mul_time
Unexecuted instantiation: methods.c:safe_mul_time
Unexecuted instantiation: pqueue.c:safe_mul_time
Unexecuted instantiation: s3_enc.c:safe_mul_time
Unexecuted instantiation: s3_lib.c:safe_mul_time
Unexecuted instantiation: s3_msg.c:safe_mul_time
Unexecuted instantiation: ssl_asn1.c:safe_mul_time
Unexecuted instantiation: ssl_conf.c:safe_mul_time
Unexecuted instantiation: ssl_rsa.c:safe_mul_time
Unexecuted instantiation: t1_enc.c:safe_mul_time
Unexecuted instantiation: qlog_event_helpers.c:safe_mul_time
quic_channel.c:safe_mul_time
Line
Count
Source
151
35.2M
    {                                                                \
152
35.2M
        type r;                                                      \
153
35.2M
                                                                     \
154
35.2M
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
35.2M
            return r;                                                \
156
35.2M
        *err |= 1;                                                   \
157
0
        return a * b;                                                \
158
35.2M
    }
Unexecuted instantiation: quic_demux.c:safe_mul_time
Unexecuted instantiation: quic_engine.c:safe_mul_time
quic_fc.c:safe_mul_uint64_t
Line
Count
Source
151
90.5k
    {                                                                \
152
90.5k
        type r;                                                      \
153
90.5k
                                                                     \
154
90.5k
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
90.5k
            return r;                                                \
156
90.5k
        *err |= 1;                                                   \
157
0
        return a * b;                                                \
158
90.5k
    }
Unexecuted instantiation: quic_fc.c:safe_mul_time
Unexecuted instantiation: quic_lcidm.c:safe_mul_time
Unexecuted instantiation: quic_rx_depack.c:safe_mul_time
Unexecuted instantiation: quic_tls.c:safe_mul_time
Unexecuted instantiation: quic_txp.c:safe_mul_time
Unexecuted instantiation: quic_txpim.c:safe_mul_time
quic_wire.c:safe_mul_time
Line
Count
Source
151
265k
    {                                                                \
152
265k
        type r;                                                      \
153
265k
                                                                     \
154
265k
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
265k
            return r;                                                \
156
265k
        *err |= 1;                                                   \
157
6.18k
        return a * b;                                                \
158
265k
    }
quic_wire.c:safe_mul_uint64_t
Line
Count
Source
151
265k
    {                                                                \
152
265k
        type r;                                                      \
153
265k
                                                                     \
154
265k
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
265k
            return r;                                                \
156
265k
        *err |= 1;                                                   \
157
6.10k
        return a * b;                                                \
158
265k
    }
Unexecuted instantiation: rec_layer_d1.c:safe_mul_time
Unexecuted instantiation: ssl3_meth.c:safe_mul_time
Unexecuted instantiation: tls13_meth.c:safe_mul_time
Unexecuted instantiation: d1_msg.c:safe_mul_time
cc_newreno.c:safe_mul_u64
Line
Count
Source
151
11.7k
    {                                                                \
152
11.7k
        type r;                                                      \
153
11.7k
                                                                     \
154
11.7k
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
11.7k
            return r;                                                \
156
11.7k
        *err |= 1;                                                   \
157
0
        return a * b;                                                \
158
11.7k
    }
Unexecuted instantiation: cc_newreno.c:safe_mul_time
Unexecuted instantiation: qlog.c:safe_mul_time
quic_ackm.c:safe_mul_time
Line
Count
Source
151
41.3M
    {                                                                \
152
41.3M
        type r;                                                      \
153
41.3M
                                                                     \
154
41.3M
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
41.3M
            return r;                                                \
156
41.3M
        *err |= 1;                                                   \
157
6.00k
        return a * b;                                                \
158
41.3M
    }
Unexecuted instantiation: quic_fifd.c:safe_mul_time
Unexecuted instantiation: bss_dgram.c:safe_mul_time
bss_dgram_pair.c:safe_mul_size_t
Line
Count
Source
151
41.1k
    {                                                                \
152
41.1k
        type r;                                                      \
153
41.1k
                                                                     \
154
41.1k
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
41.1k
            return r;                                                \
156
41.1k
        *err |= 1;                                                   \
157
0
        return a * b;                                                \
158
41.1k
    }
Unexecuted instantiation: ct_policy.c:safe_mul_time
Unexecuted instantiation: sleep.c:safe_mul_time
Unexecuted instantiation: time.c:safe_mul_time
Unexecuted instantiation: thread_posix.c:safe_mul_time
Unexecuted instantiation: arch.c:safe_mul_time
Unexecuted instantiation: internal.c:safe_mul_time
Unexecuted instantiation: argon2.c:safe_mul_time
Unexecuted instantiation: tls1_prf.c:safe_mul_size_t
Unexecuted instantiation: quic-srtm.c:safe_mul_time
Unexecuted instantiation: quic-rcidm.c:safe_mul_time
Unexecuted instantiation: quic_rcidm.c:safe_mul_time
priority_queue.c:safe_mul_size_t
Line
Count
Source
151
76.9k
    {                                                                \
152
76.9k
        type r;                                                      \
153
76.9k
                                                                     \
154
76.9k
        if (!__builtin_mul_overflow(a, b, &r))                       \
155
76.9k
            return r;                                                \
156
76.9k
        *err |= 1;                                                   \
157
0
        return a * b;                                                \
158
76.9k
    }
Unexecuted instantiation: ssl_txt.c:safe_mul_time
Unexecuted instantiation: quic-lcidm.c:safe_mul_time
159
160
#else /* has(__builtin_mul_overflow) */
161
#define OSSL_SAFE_MATH_MULS(type_name, type, min, max)               \
162
    static ossl_inline ossl_unused type safe_mul_##type_name(type a, \
163
        type b,                                                      \
164
        int *err)                                                    \
165
    {                                                                \
166
        if (a == 0 || b == 0)                                        \
167
            return 0;                                                \
168
        if (a == 1)                                                  \
169
            return b;                                                \
170
        if (b == 1)                                                  \
171
            return a;                                                \
172
        if (a != min && b != min) {                                  \
173
            const type x = a < 0 ? -a : a;                           \
174
            const type y = b < 0 ? -b : b;                           \
175
                                                                     \
176
            if (x <= max / y)                                        \
177
                return a * b;                                        \
178
        }                                                            \
179
        *err |= 1;                                                   \
180
        return (a < 0) ^ (b < 0) ? min : max;                        \
181
    }
182
183
#define OSSL_SAFE_MATH_MULU(type_name, type, max)                    \
184
    static ossl_inline ossl_unused type safe_mul_##type_name(type a, \
185
        type b,                                                      \
186
        int *err)                                                    \
187
    {                                                                \
188
        if (b != 0 && a > max / b)                                   \
189
            *err |= 1;                                               \
190
        return a * b;                                                \
191
    }
192
#endif /* has(__builtin_mul_overflow) */
193
194
/*
195
 * Safe division helpers
196
 */
197
#define OSSL_SAFE_MATH_DIVS(type_name, type, min, max)               \
198
    static ossl_inline ossl_unused type safe_div_##type_name(type a, \
199
        type b,                                                      \
200
        int *err)                                                    \
201
5.04M
    {                                                                \
202
5.04M
        if (b == 0) {                                                \
203
0
            *err |= 1;                                               \
204
0
            return a < 0 ? min : max;                                \
205
0
        }                                                            \
206
5.04M
        if (b == -1 && a == min) {                                   \
207
0
            *err |= 1;                                               \
208
0
            return max;                                              \
209
0
        }                                                            \
210
5.04M
        return a / b;                                                \
211
5.04M
    }
Unexecuted instantiation: evp_enc.c:safe_div_int
stack.c:safe_div_int
Line
Count
Source
201
5.04M
    {                                                                \
202
5.04M
        if (b == 0) {                                                \
203
0
            *err |= 1;                                               \
204
0
            return a < 0 ? min : max;                                \
205
0
        }                                                            \
206
5.04M
        if (b == -1 && a == min) {                                   \
207
0
            *err |= 1;                                               \
208
0
            return max;                                              \
209
0
        }                                                            \
210
5.04M
        return a / b;                                                \
211
5.04M
    }
Unexecuted instantiation: v3_ncons.c:safe_div_int
212
213
#define OSSL_SAFE_MATH_DIVU(type_name, type, max)                    \
214
    static ossl_inline ossl_unused type safe_div_##type_name(type a, \
215
        type b,                                                      \
216
        int *err)                                                    \
217
42.3M
    {                                                                \
218
42.3M
        if (b != 0)                                                  \
219
42.3M
            return a / b;                                            \
220
42.3M
        *err |= 1;                                                   \
221
0
        return max;                                                  \
222
42.3M
    }
Unexecuted instantiation: quic-client.c:safe_div_time
Unexecuted instantiation: ssl_cert.c:safe_div_time
Unexecuted instantiation: ssl_ciph.c:safe_div_time
Unexecuted instantiation: ssl_init.c:safe_div_time
Unexecuted instantiation: ssl_lib.c:safe_div_time
Unexecuted instantiation: ssl_mcnf.c:safe_div_time
Unexecuted instantiation: ssl_sess.c:safe_div_time
Unexecuted instantiation: t1_lib.c:safe_div_time
Unexecuted instantiation: tls13_enc.c:safe_div_time
Unexecuted instantiation: tls_depr.c:safe_div_time
Unexecuted instantiation: tls_srp.c:safe_div_time
Unexecuted instantiation: quic_impl.c:safe_div_time
Unexecuted instantiation: quic_method.c:safe_div_time
Unexecuted instantiation: quic_port.c:safe_div_time
Unexecuted instantiation: quic_reactor.c:safe_div_time
Unexecuted instantiation: quic_record_rx.c:safe_div_time
Unexecuted instantiation: quic_record_shared.c:safe_div_time
Unexecuted instantiation: quic_record_tx.c:safe_div_time
Unexecuted instantiation: quic_record_util.c:safe_div_time
Unexecuted instantiation: quic_rstream.c:safe_div_time
Unexecuted instantiation: quic_rstream.c:safe_div_u64
Unexecuted instantiation: quic_sf_list.c:safe_div_time
Unexecuted instantiation: quic_srtm.c:safe_div_time
Unexecuted instantiation: quic_sstream.c:safe_div_time
Unexecuted instantiation: quic_sstream.c:safe_div_u64
quic_statm.c:safe_div_time
Line
Count
Source
217
116k
    {                                                                \
218
116k
        if (b != 0)                                                  \
219
116k
            return a / b;                                            \
220
116k
        *err |= 1;                                                   \
221
0
        return max;                                                  \
222
116k
    }
Unexecuted instantiation: quic_stream_map.c:safe_div_time
Unexecuted instantiation: quic_thread_assist.c:safe_div_time
Unexecuted instantiation: rec_layer_s3.c:safe_div_time
Unexecuted instantiation: dtls_meth.c:safe_div_time
Unexecuted instantiation: tls1_meth.c:safe_div_time
Unexecuted instantiation: tls_common.c:safe_div_time
Unexecuted instantiation: tls_multib.c:safe_div_time
Unexecuted instantiation: tlsany_meth.c:safe_div_time
Unexecuted instantiation: extensions.c:safe_div_time
Unexecuted instantiation: extensions_clnt.c:safe_div_time
Unexecuted instantiation: extensions_cust.c:safe_div_time
Unexecuted instantiation: extensions_srvr.c:safe_div_time
Unexecuted instantiation: statem.c:safe_div_time
Unexecuted instantiation: statem_clnt.c:safe_div_time
Unexecuted instantiation: statem_dtls.c:safe_div_time
Unexecuted instantiation: statem_lib.c:safe_div_time
Unexecuted instantiation: statem_srvr.c:safe_div_time
Unexecuted instantiation: d1_lib.c:safe_div_time
Unexecuted instantiation: d1_srtp.c:safe_div_time
Unexecuted instantiation: methods.c:safe_div_time
Unexecuted instantiation: pqueue.c:safe_div_time
Unexecuted instantiation: s3_enc.c:safe_div_time
Unexecuted instantiation: s3_lib.c:safe_div_time
Unexecuted instantiation: s3_msg.c:safe_div_time
Unexecuted instantiation: ssl_asn1.c:safe_div_time
Unexecuted instantiation: ssl_conf.c:safe_div_time
Unexecuted instantiation: ssl_rsa.c:safe_div_time
Unexecuted instantiation: t1_enc.c:safe_div_time
Unexecuted instantiation: qlog_event_helpers.c:safe_div_time
quic_channel.c:safe_div_time
Line
Count
Source
217
29.8M
    {                                                                \
218
29.8M
        if (b != 0)                                                  \
219
29.8M
            return a / b;                                            \
220
29.8M
        *err |= 1;                                                   \
221
0
        return max;                                                  \
222
29.8M
    }
Unexecuted instantiation: quic_demux.c:safe_div_time
Unexecuted instantiation: quic_engine.c:safe_div_time
Unexecuted instantiation: quic_fc.c:safe_div_time
Unexecuted instantiation: quic_fc.c:safe_div_uint64_t
Unexecuted instantiation: quic_lcidm.c:safe_div_time
Unexecuted instantiation: quic_rx_depack.c:safe_div_time
Unexecuted instantiation: quic_tls.c:safe_div_time
Unexecuted instantiation: quic_txp.c:safe_div_time
Unexecuted instantiation: quic_txpim.c:safe_div_time
quic_wire.c:safe_div_time
Line
Count
Source
217
12.2M
    {                                                                \
218
12.2M
        if (b != 0)                                                  \
219
12.2M
            return a / b;                                            \
220
12.2M
        *err |= 1;                                                   \
221
0
        return max;                                                  \
222
12.2M
    }
Unexecuted instantiation: quic_wire.c:safe_div_uint64_t
Unexecuted instantiation: rec_layer_d1.c:safe_div_time
Unexecuted instantiation: ssl3_meth.c:safe_div_time
Unexecuted instantiation: tls13_meth.c:safe_div_time
Unexecuted instantiation: d1_msg.c:safe_div_time
Unexecuted instantiation: cc_newreno.c:safe_div_time
Unexecuted instantiation: cc_newreno.c:safe_div_u64
Unexecuted instantiation: qlog.c:safe_div_time
quic_ackm.c:safe_div_time
Line
Count
Source
217
81.7k
    {                                                                \
218
81.7k
        if (b != 0)                                                  \
219
81.7k
            return a / b;                                            \
220
81.7k
        *err |= 1;                                                   \
221
0
        return max;                                                  \
222
81.7k
    }
Unexecuted instantiation: quic_fifd.c:safe_div_time
Unexecuted instantiation: bss_dgram.c:safe_div_time
Unexecuted instantiation: bss_dgram_pair.c:safe_div_size_t
Unexecuted instantiation: ct_policy.c:safe_div_time
Unexecuted instantiation: sleep.c:safe_div_time
Unexecuted instantiation: time.c:safe_div_time
Unexecuted instantiation: thread_posix.c:safe_div_time
Unexecuted instantiation: arch.c:safe_div_time
Unexecuted instantiation: internal.c:safe_div_time
Unexecuted instantiation: argon2.c:safe_div_time
Unexecuted instantiation: tls1_prf.c:safe_div_size_t
Unexecuted instantiation: quic-srtm.c:safe_div_time
Unexecuted instantiation: quic-rcidm.c:safe_div_time
Unexecuted instantiation: quic_rcidm.c:safe_div_time
Unexecuted instantiation: priority_queue.c:safe_div_size_t
Unexecuted instantiation: ssl_txt.c:safe_div_time
Unexecuted instantiation: quic-lcidm.c:safe_div_time
223
224
/*
225
 * Safe modulus helpers
226
 */
227
#define OSSL_SAFE_MATH_MODS(type_name, type, min, max)               \
228
    static ossl_inline ossl_unused type safe_mod_##type_name(type a, \
229
        type b,                                                      \
230
        int *err)                                                    \
231
0
    {                                                                \
232
0
        if (b == 0) {                                                \
233
0
            *err |= 1;                                               \
234
0
            return 0;                                                \
235
0
        }                                                            \
236
0
        if (b == -1 && a == min) {                                   \
237
0
            *err |= 1;                                               \
238
0
            return max;                                              \
239
0
        }                                                            \
240
0
        return a % b;                                                \
241
0
    }
Unexecuted instantiation: evp_enc.c:safe_mod_int
Unexecuted instantiation: stack.c:safe_mod_int
Unexecuted instantiation: v3_ncons.c:safe_mod_int
242
243
#define OSSL_SAFE_MATH_MODU(type_name, type)                         \
244
    static ossl_inline ossl_unused type safe_mod_##type_name(type a, \
245
        type b,                                                      \
246
        int *err)                                                    \
247
0
    {                                                                \
248
0
        if (b != 0)                                                  \
249
0
            return a % b;                                            \
250
0
        *err |= 1;                                                   \
251
0
        return 0;                                                    \
252
0
    }
Unexecuted instantiation: quic-client.c:safe_mod_time
Unexecuted instantiation: ssl_cert.c:safe_mod_time
Unexecuted instantiation: ssl_ciph.c:safe_mod_time
Unexecuted instantiation: ssl_init.c:safe_mod_time
Unexecuted instantiation: ssl_lib.c:safe_mod_time
Unexecuted instantiation: ssl_mcnf.c:safe_mod_time
Unexecuted instantiation: ssl_sess.c:safe_mod_time
Unexecuted instantiation: t1_lib.c:safe_mod_time
Unexecuted instantiation: tls13_enc.c:safe_mod_time
Unexecuted instantiation: tls_depr.c:safe_mod_time
Unexecuted instantiation: tls_srp.c:safe_mod_time
Unexecuted instantiation: quic_impl.c:safe_mod_time
Unexecuted instantiation: quic_method.c:safe_mod_time
Unexecuted instantiation: quic_port.c:safe_mod_time
Unexecuted instantiation: quic_reactor.c:safe_mod_time
Unexecuted instantiation: quic_record_rx.c:safe_mod_time
Unexecuted instantiation: quic_record_shared.c:safe_mod_time
Unexecuted instantiation: quic_record_tx.c:safe_mod_time
Unexecuted instantiation: quic_record_util.c:safe_mod_time
Unexecuted instantiation: quic_rstream.c:safe_mod_time
Unexecuted instantiation: quic_rstream.c:safe_mod_u64
Unexecuted instantiation: quic_sf_list.c:safe_mod_time
Unexecuted instantiation: quic_srtm.c:safe_mod_time
Unexecuted instantiation: quic_sstream.c:safe_mod_time
Unexecuted instantiation: quic_sstream.c:safe_mod_u64
Unexecuted instantiation: quic_statm.c:safe_mod_time
Unexecuted instantiation: quic_stream_map.c:safe_mod_time
Unexecuted instantiation: quic_thread_assist.c:safe_mod_time
Unexecuted instantiation: rec_layer_s3.c:safe_mod_time
Unexecuted instantiation: dtls_meth.c:safe_mod_time
Unexecuted instantiation: tls1_meth.c:safe_mod_time
Unexecuted instantiation: tls_common.c:safe_mod_time
Unexecuted instantiation: tls_multib.c:safe_mod_time
Unexecuted instantiation: tlsany_meth.c:safe_mod_time
Unexecuted instantiation: extensions.c:safe_mod_time
Unexecuted instantiation: extensions_clnt.c:safe_mod_time
Unexecuted instantiation: extensions_cust.c:safe_mod_time
Unexecuted instantiation: extensions_srvr.c:safe_mod_time
Unexecuted instantiation: statem.c:safe_mod_time
Unexecuted instantiation: statem_clnt.c:safe_mod_time
Unexecuted instantiation: statem_dtls.c:safe_mod_time
Unexecuted instantiation: statem_lib.c:safe_mod_time
Unexecuted instantiation: statem_srvr.c:safe_mod_time
Unexecuted instantiation: d1_lib.c:safe_mod_time
Unexecuted instantiation: d1_srtp.c:safe_mod_time
Unexecuted instantiation: methods.c:safe_mod_time
Unexecuted instantiation: pqueue.c:safe_mod_time
Unexecuted instantiation: s3_enc.c:safe_mod_time
Unexecuted instantiation: s3_lib.c:safe_mod_time
Unexecuted instantiation: s3_msg.c:safe_mod_time
Unexecuted instantiation: ssl_asn1.c:safe_mod_time
Unexecuted instantiation: ssl_conf.c:safe_mod_time
Unexecuted instantiation: ssl_rsa.c:safe_mod_time
Unexecuted instantiation: t1_enc.c:safe_mod_time
Unexecuted instantiation: qlog_event_helpers.c:safe_mod_time
Unexecuted instantiation: quic_channel.c:safe_mod_time
Unexecuted instantiation: quic_demux.c:safe_mod_time
Unexecuted instantiation: quic_engine.c:safe_mod_time
Unexecuted instantiation: quic_fc.c:safe_mod_time
Unexecuted instantiation: quic_fc.c:safe_mod_uint64_t
Unexecuted instantiation: quic_lcidm.c:safe_mod_time
Unexecuted instantiation: quic_rx_depack.c:safe_mod_time
Unexecuted instantiation: quic_tls.c:safe_mod_time
Unexecuted instantiation: quic_txp.c:safe_mod_time
Unexecuted instantiation: quic_txpim.c:safe_mod_time
Unexecuted instantiation: quic_wire.c:safe_mod_time
Unexecuted instantiation: quic_wire.c:safe_mod_uint64_t
Unexecuted instantiation: rec_layer_d1.c:safe_mod_time
Unexecuted instantiation: ssl3_meth.c:safe_mod_time
Unexecuted instantiation: tls13_meth.c:safe_mod_time
Unexecuted instantiation: d1_msg.c:safe_mod_time
Unexecuted instantiation: cc_newreno.c:safe_mod_time
Unexecuted instantiation: cc_newreno.c:safe_mod_u64
Unexecuted instantiation: qlog.c:safe_mod_time
Unexecuted instantiation: quic_ackm.c:safe_mod_time
Unexecuted instantiation: quic_fifd.c:safe_mod_time
Unexecuted instantiation: bss_dgram.c:safe_mod_time
Unexecuted instantiation: bss_dgram_pair.c:safe_mod_size_t
Unexecuted instantiation: ct_policy.c:safe_mod_time
Unexecuted instantiation: sleep.c:safe_mod_time
Unexecuted instantiation: time.c:safe_mod_time
Unexecuted instantiation: thread_posix.c:safe_mod_time
Unexecuted instantiation: arch.c:safe_mod_time
Unexecuted instantiation: internal.c:safe_mod_time
Unexecuted instantiation: argon2.c:safe_mod_time
Unexecuted instantiation: tls1_prf.c:safe_mod_size_t
Unexecuted instantiation: quic-srtm.c:safe_mod_time
Unexecuted instantiation: quic-rcidm.c:safe_mod_time
Unexecuted instantiation: quic_rcidm.c:safe_mod_time
Unexecuted instantiation: priority_queue.c:safe_mod_size_t
Unexecuted instantiation: ssl_txt.c:safe_mod_time
Unexecuted instantiation: quic-lcidm.c:safe_mod_time
253
254
/*
255
 * Safe negation helpers
256
 */
257
#define OSSL_SAFE_MATH_NEGS(type_name, type, min)                    \
258
    static ossl_inline ossl_unused type safe_neg_##type_name(type a, \
259
        int *err)                                                    \
260
0
    {                                                                \
261
0
        if (a != min)                                                \
262
0
            return -a;                                               \
263
0
        *err |= 1;                                                   \
264
0
        return min;                                                  \
265
0
    }
Unexecuted instantiation: evp_enc.c:safe_neg_int
Unexecuted instantiation: stack.c:safe_neg_int
Unexecuted instantiation: v3_ncons.c:safe_neg_int
266
267
#define OSSL_SAFE_MATH_NEGU(type_name, type)                         \
268
    static ossl_inline ossl_unused type safe_neg_##type_name(type a, \
269
        int *err)                                                    \
270
0
    {                                                                \
271
0
        if (a == 0)                                                  \
272
0
            return a;                                                \
273
0
        *err |= 1;                                                   \
274
0
        return 1 + ~a;                                               \
275
0
    }
Unexecuted instantiation: quic-client.c:safe_neg_time
Unexecuted instantiation: ssl_cert.c:safe_neg_time
Unexecuted instantiation: ssl_ciph.c:safe_neg_time
Unexecuted instantiation: ssl_init.c:safe_neg_time
Unexecuted instantiation: ssl_lib.c:safe_neg_time
Unexecuted instantiation: ssl_mcnf.c:safe_neg_time
Unexecuted instantiation: ssl_sess.c:safe_neg_time
Unexecuted instantiation: t1_lib.c:safe_neg_time
Unexecuted instantiation: tls13_enc.c:safe_neg_time
Unexecuted instantiation: tls_depr.c:safe_neg_time
Unexecuted instantiation: tls_srp.c:safe_neg_time
Unexecuted instantiation: quic_impl.c:safe_neg_time
Unexecuted instantiation: quic_method.c:safe_neg_time
Unexecuted instantiation: quic_port.c:safe_neg_time
Unexecuted instantiation: quic_reactor.c:safe_neg_time
Unexecuted instantiation: quic_record_rx.c:safe_neg_time
Unexecuted instantiation: quic_record_shared.c:safe_neg_time
Unexecuted instantiation: quic_record_tx.c:safe_neg_time
Unexecuted instantiation: quic_record_util.c:safe_neg_time
Unexecuted instantiation: quic_rstream.c:safe_neg_time
Unexecuted instantiation: quic_rstream.c:safe_neg_u64
Unexecuted instantiation: quic_sf_list.c:safe_neg_time
Unexecuted instantiation: quic_srtm.c:safe_neg_time
Unexecuted instantiation: quic_sstream.c:safe_neg_time
Unexecuted instantiation: quic_sstream.c:safe_neg_u64
Unexecuted instantiation: quic_statm.c:safe_neg_time
Unexecuted instantiation: quic_stream_map.c:safe_neg_time
Unexecuted instantiation: quic_thread_assist.c:safe_neg_time
Unexecuted instantiation: rec_layer_s3.c:safe_neg_time
Unexecuted instantiation: dtls_meth.c:safe_neg_time
Unexecuted instantiation: tls1_meth.c:safe_neg_time
Unexecuted instantiation: tls_common.c:safe_neg_time
Unexecuted instantiation: tls_multib.c:safe_neg_time
Unexecuted instantiation: tlsany_meth.c:safe_neg_time
Unexecuted instantiation: extensions.c:safe_neg_time
Unexecuted instantiation: extensions_clnt.c:safe_neg_time
Unexecuted instantiation: extensions_cust.c:safe_neg_time
Unexecuted instantiation: extensions_srvr.c:safe_neg_time
Unexecuted instantiation: statem.c:safe_neg_time
Unexecuted instantiation: statem_clnt.c:safe_neg_time
Unexecuted instantiation: statem_dtls.c:safe_neg_time
Unexecuted instantiation: statem_lib.c:safe_neg_time
Unexecuted instantiation: statem_srvr.c:safe_neg_time
Unexecuted instantiation: d1_lib.c:safe_neg_time
Unexecuted instantiation: d1_srtp.c:safe_neg_time
Unexecuted instantiation: methods.c:safe_neg_time
Unexecuted instantiation: pqueue.c:safe_neg_time
Unexecuted instantiation: s3_enc.c:safe_neg_time
Unexecuted instantiation: s3_lib.c:safe_neg_time
Unexecuted instantiation: s3_msg.c:safe_neg_time
Unexecuted instantiation: ssl_asn1.c:safe_neg_time
Unexecuted instantiation: ssl_conf.c:safe_neg_time
Unexecuted instantiation: ssl_rsa.c:safe_neg_time
Unexecuted instantiation: t1_enc.c:safe_neg_time
Unexecuted instantiation: qlog_event_helpers.c:safe_neg_time
Unexecuted instantiation: quic_channel.c:safe_neg_time
Unexecuted instantiation: quic_demux.c:safe_neg_time
Unexecuted instantiation: quic_engine.c:safe_neg_time
Unexecuted instantiation: quic_fc.c:safe_neg_time
Unexecuted instantiation: quic_fc.c:safe_neg_uint64_t
Unexecuted instantiation: quic_lcidm.c:safe_neg_time
Unexecuted instantiation: quic_rx_depack.c:safe_neg_time
Unexecuted instantiation: quic_tls.c:safe_neg_time
Unexecuted instantiation: quic_txp.c:safe_neg_time
Unexecuted instantiation: quic_txpim.c:safe_neg_time
Unexecuted instantiation: quic_wire.c:safe_neg_time
Unexecuted instantiation: quic_wire.c:safe_neg_uint64_t
Unexecuted instantiation: rec_layer_d1.c:safe_neg_time
Unexecuted instantiation: ssl3_meth.c:safe_neg_time
Unexecuted instantiation: tls13_meth.c:safe_neg_time
Unexecuted instantiation: d1_msg.c:safe_neg_time
Unexecuted instantiation: cc_newreno.c:safe_neg_time
Unexecuted instantiation: cc_newreno.c:safe_neg_u64
Unexecuted instantiation: qlog.c:safe_neg_time
Unexecuted instantiation: quic_ackm.c:safe_neg_time
Unexecuted instantiation: quic_fifd.c:safe_neg_time
Unexecuted instantiation: bss_dgram.c:safe_neg_time
Unexecuted instantiation: bss_dgram_pair.c:safe_neg_size_t
Unexecuted instantiation: ct_policy.c:safe_neg_time
Unexecuted instantiation: sleep.c:safe_neg_time
Unexecuted instantiation: time.c:safe_neg_time
Unexecuted instantiation: thread_posix.c:safe_neg_time
Unexecuted instantiation: arch.c:safe_neg_time
Unexecuted instantiation: internal.c:safe_neg_time
Unexecuted instantiation: argon2.c:safe_neg_time
Unexecuted instantiation: tls1_prf.c:safe_neg_size_t
Unexecuted instantiation: quic-srtm.c:safe_neg_time
Unexecuted instantiation: quic-rcidm.c:safe_neg_time
Unexecuted instantiation: quic_rcidm.c:safe_neg_time
Unexecuted instantiation: priority_queue.c:safe_neg_size_t
Unexecuted instantiation: ssl_txt.c:safe_neg_time
Unexecuted instantiation: quic-lcidm.c:safe_neg_time
276
277
/*
278
 * Safe absolute value helpers
279
 */
280
#define OSSL_SAFE_MATH_ABSS(type_name, type, min)                    \
281
    static ossl_inline ossl_unused type safe_abs_##type_name(type a, \
282
        int *err)                                                    \
283
0
    {                                                                \
284
0
        if (a != min)                                                \
285
0
            return a < 0 ? -a : a;                                   \
286
0
        *err |= 1;                                                   \
287
0
        return min;                                                  \
288
0
    }
Unexecuted instantiation: evp_enc.c:safe_abs_int
Unexecuted instantiation: stack.c:safe_abs_int
Unexecuted instantiation: v3_ncons.c:safe_abs_int
289
290
#define OSSL_SAFE_MATH_ABSU(type_name, type)                         \
291
    static ossl_inline ossl_unused type safe_abs_##type_name(type a, \
292
        int *err)                                                    \
293
0
    {                                                                \
294
0
        return a;                                                    \
295
0
    }
Unexecuted instantiation: quic-client.c:safe_abs_time
Unexecuted instantiation: ssl_cert.c:safe_abs_time
Unexecuted instantiation: ssl_ciph.c:safe_abs_time
Unexecuted instantiation: ssl_init.c:safe_abs_time
Unexecuted instantiation: ssl_lib.c:safe_abs_time
Unexecuted instantiation: ssl_mcnf.c:safe_abs_time
Unexecuted instantiation: ssl_sess.c:safe_abs_time
Unexecuted instantiation: t1_lib.c:safe_abs_time
Unexecuted instantiation: tls13_enc.c:safe_abs_time
Unexecuted instantiation: tls_depr.c:safe_abs_time
Unexecuted instantiation: tls_srp.c:safe_abs_time
Unexecuted instantiation: quic_impl.c:safe_abs_time
Unexecuted instantiation: quic_method.c:safe_abs_time
Unexecuted instantiation: quic_port.c:safe_abs_time
Unexecuted instantiation: quic_reactor.c:safe_abs_time
Unexecuted instantiation: quic_record_rx.c:safe_abs_time
Unexecuted instantiation: quic_record_shared.c:safe_abs_time
Unexecuted instantiation: quic_record_tx.c:safe_abs_time
Unexecuted instantiation: quic_record_util.c:safe_abs_time
Unexecuted instantiation: quic_rstream.c:safe_abs_time
Unexecuted instantiation: quic_rstream.c:safe_abs_u64
Unexecuted instantiation: quic_sf_list.c:safe_abs_time
Unexecuted instantiation: quic_srtm.c:safe_abs_time
Unexecuted instantiation: quic_sstream.c:safe_abs_time
Unexecuted instantiation: quic_sstream.c:safe_abs_u64
Unexecuted instantiation: quic_statm.c:safe_abs_time
Unexecuted instantiation: quic_stream_map.c:safe_abs_time
Unexecuted instantiation: quic_thread_assist.c:safe_abs_time
Unexecuted instantiation: rec_layer_s3.c:safe_abs_time
Unexecuted instantiation: dtls_meth.c:safe_abs_time
Unexecuted instantiation: tls1_meth.c:safe_abs_time
Unexecuted instantiation: tls_common.c:safe_abs_time
Unexecuted instantiation: tls_multib.c:safe_abs_time
Unexecuted instantiation: tlsany_meth.c:safe_abs_time
Unexecuted instantiation: extensions.c:safe_abs_time
Unexecuted instantiation: extensions_clnt.c:safe_abs_time
Unexecuted instantiation: extensions_cust.c:safe_abs_time
Unexecuted instantiation: extensions_srvr.c:safe_abs_time
Unexecuted instantiation: statem.c:safe_abs_time
Unexecuted instantiation: statem_clnt.c:safe_abs_time
Unexecuted instantiation: statem_dtls.c:safe_abs_time
Unexecuted instantiation: statem_lib.c:safe_abs_time
Unexecuted instantiation: statem_srvr.c:safe_abs_time
Unexecuted instantiation: d1_lib.c:safe_abs_time
Unexecuted instantiation: d1_srtp.c:safe_abs_time
Unexecuted instantiation: methods.c:safe_abs_time
Unexecuted instantiation: pqueue.c:safe_abs_time
Unexecuted instantiation: s3_enc.c:safe_abs_time
Unexecuted instantiation: s3_lib.c:safe_abs_time
Unexecuted instantiation: s3_msg.c:safe_abs_time
Unexecuted instantiation: ssl_asn1.c:safe_abs_time
Unexecuted instantiation: ssl_conf.c:safe_abs_time
Unexecuted instantiation: ssl_rsa.c:safe_abs_time
Unexecuted instantiation: t1_enc.c:safe_abs_time
Unexecuted instantiation: qlog_event_helpers.c:safe_abs_time
Unexecuted instantiation: quic_channel.c:safe_abs_time
Unexecuted instantiation: quic_demux.c:safe_abs_time
Unexecuted instantiation: quic_engine.c:safe_abs_time
Unexecuted instantiation: quic_fc.c:safe_abs_time
Unexecuted instantiation: quic_fc.c:safe_abs_uint64_t
Unexecuted instantiation: quic_lcidm.c:safe_abs_time
Unexecuted instantiation: quic_rx_depack.c:safe_abs_time
Unexecuted instantiation: quic_tls.c:safe_abs_time
Unexecuted instantiation: quic_txp.c:safe_abs_time
Unexecuted instantiation: quic_txpim.c:safe_abs_time
Unexecuted instantiation: quic_wire.c:safe_abs_time
Unexecuted instantiation: quic_wire.c:safe_abs_uint64_t
Unexecuted instantiation: rec_layer_d1.c:safe_abs_time
Unexecuted instantiation: ssl3_meth.c:safe_abs_time
Unexecuted instantiation: tls13_meth.c:safe_abs_time
Unexecuted instantiation: d1_msg.c:safe_abs_time
Unexecuted instantiation: cc_newreno.c:safe_abs_time
Unexecuted instantiation: cc_newreno.c:safe_abs_u64
Unexecuted instantiation: qlog.c:safe_abs_time
Unexecuted instantiation: quic_ackm.c:safe_abs_time
Unexecuted instantiation: quic_fifd.c:safe_abs_time
Unexecuted instantiation: bss_dgram.c:safe_abs_time
Unexecuted instantiation: bss_dgram_pair.c:safe_abs_size_t
Unexecuted instantiation: ct_policy.c:safe_abs_time
Unexecuted instantiation: sleep.c:safe_abs_time
Unexecuted instantiation: time.c:safe_abs_time
Unexecuted instantiation: thread_posix.c:safe_abs_time
Unexecuted instantiation: arch.c:safe_abs_time
Unexecuted instantiation: internal.c:safe_abs_time
Unexecuted instantiation: argon2.c:safe_abs_time
Unexecuted instantiation: tls1_prf.c:safe_abs_size_t
Unexecuted instantiation: quic-srtm.c:safe_abs_time
Unexecuted instantiation: quic-rcidm.c:safe_abs_time
Unexecuted instantiation: quic_rcidm.c:safe_abs_time
Unexecuted instantiation: priority_queue.c:safe_abs_size_t
Unexecuted instantiation: ssl_txt.c:safe_abs_time
Unexecuted instantiation: quic-lcidm.c:safe_abs_time
296
297
/*
298
 * Safe fused multiply divide helpers
299
 *
300
 * These are a bit obscure:
301
 *    . They begin by checking the denominator for zero and getting rid of this
302
 *      corner case.
303
 *
304
 *    . Second is an attempt to do the multiplication directly, if it doesn't
305
 *      overflow, the quotient is returned (for signed values there is a
306
 *      potential problem here which isn't present for unsigned).
307
 *
308
 *    . Finally, the multiplication/division is transformed so that the larger
309
 *      of the numerators is divided first.  This requires a remainder
310
 *      correction:
311
 *
312
 *          a b / c = (a / c) b + (a mod c) b / c, where a > b
313
 *
314
 *      The individual operations need to be overflow checked (again signed
315
 *      being more problematic).
316
 *
317
 * The algorithm used is not perfect but it should be "good enough".
318
 */
319
#define OSSL_SAFE_MATH_MULDIVS(type_name, type, max)                    \
320
    static ossl_inline ossl_unused type safe_muldiv_##type_name(type a, \
321
        type b,                                                         \
322
        type c,                                                         \
323
        int *err)                                                       \
324
5.04M
    {                                                                   \
325
5.04M
        int e2 = 0;                                                     \
326
5.04M
        type q, r, x, y;                                                \
327
5.04M
                                                                        \
328
5.04M
        if (c == 0) {                                                   \
329
0
            *err |= 1;                                                  \
330
0
            return a == 0 || b == 0 ? 0 : max;                          \
331
0
        }                                                               \
332
5.04M
        x = safe_mul_##type_name(a, b, &e2);                            \
333
5.04M
        if (!e2)                                                        \
334
5.04M
            return safe_div_##type_name(x, c, err);                     \
335
5.04M
        if (b > a) {                                                    \
336
0
            x = b;                                                      \
337
0
            b = a;                                                      \
338
0
            a = x;                                                      \
339
0
        }                                                               \
340
0
        q = safe_div_##type_name(a, c, err);                            \
341
0
        r = safe_mod_##type_name(a, c, err);                            \
342
0
        x = safe_mul_##type_name(r, b, err);                            \
343
0
        y = safe_mul_##type_name(q, b, err);                            \
344
0
        q = safe_div_##type_name(x, c, err);                            \
345
0
        return safe_add_##type_name(y, q, err);                         \
346
5.04M
    }
Unexecuted instantiation: evp_enc.c:safe_muldiv_int
stack.c:safe_muldiv_int
Line
Count
Source
324
5.04M
    {                                                                   \
325
5.04M
        int e2 = 0;                                                     \
326
5.04M
        type q, r, x, y;                                                \
327
5.04M
                                                                        \
328
5.04M
        if (c == 0) {                                                   \
329
0
            *err |= 1;                                                  \
330
0
            return a == 0 || b == 0 ? 0 : max;                          \
331
0
        }                                                               \
332
5.04M
        x = safe_mul_##type_name(a, b, &e2);                            \
333
5.04M
        if (!e2)                                                        \
334
5.04M
            return safe_div_##type_name(x, c, err);                     \
335
5.04M
        if (b > a) {                                                    \
336
0
            x = b;                                                      \
337
0
            b = a;                                                      \
338
0
            a = x;                                                      \
339
0
        }                                                               \
340
0
        q = safe_div_##type_name(a, c, err);                            \
341
0
        r = safe_mod_##type_name(a, c, err);                            \
342
0
        x = safe_mul_##type_name(r, b, err);                            \
343
0
        y = safe_mul_##type_name(q, b, err);                            \
344
0
        q = safe_div_##type_name(x, c, err);                            \
345
0
        return safe_add_##type_name(y, q, err);                         \
346
5.04M
    }
Unexecuted instantiation: v3_ncons.c:safe_muldiv_int
347
348
#define OSSL_SAFE_MATH_MULDIVU(type_name, type, max)                    \
349
    static ossl_inline ossl_unused type safe_muldiv_##type_name(type a, \
350
        type b,                                                         \
351
        type c,                                                         \
352
        int *err)                                                       \
353
220k
    {                                                                   \
354
220k
        int e2 = 0;                                                     \
355
220k
        type x, y;                                                      \
356
220k
                                                                        \
357
220k
        if (c == 0) {                                                   \
358
0
            *err |= 1;                                                  \
359
0
            return a == 0 || b == 0 ? 0 : max;                          \
360
0
        }                                                               \
361
220k
        x = safe_mul_##type_name(a, b, &e2);                            \
362
220k
        if (!e2)                                                        \
363
220k
            return x / c;                                               \
364
220k
        if (b > a) {                                                    \
365
0
            x = b;                                                      \
366
0
            b = a;                                                      \
367
0
            a = x;                                                      \
368
0
        }                                                               \
369
0
        x = safe_mul_##type_name(a % c, b, err);                        \
370
0
        y = safe_mul_##type_name(a / c, b, err);                        \
371
0
        return safe_add_##type_name(y, x / c, err);                     \
372
220k
    }
Unexecuted instantiation: quic-client.c:safe_muldiv_time
Unexecuted instantiation: ssl_cert.c:safe_muldiv_time
Unexecuted instantiation: ssl_ciph.c:safe_muldiv_time
Unexecuted instantiation: ssl_init.c:safe_muldiv_time
Unexecuted instantiation: ssl_lib.c:safe_muldiv_time
Unexecuted instantiation: ssl_mcnf.c:safe_muldiv_time
Unexecuted instantiation: ssl_sess.c:safe_muldiv_time
Unexecuted instantiation: t1_lib.c:safe_muldiv_time
Unexecuted instantiation: tls13_enc.c:safe_muldiv_time
Unexecuted instantiation: tls_depr.c:safe_muldiv_time
Unexecuted instantiation: tls_srp.c:safe_muldiv_time
Unexecuted instantiation: quic_impl.c:safe_muldiv_time
Unexecuted instantiation: quic_method.c:safe_muldiv_time
Unexecuted instantiation: quic_port.c:safe_muldiv_time
Unexecuted instantiation: quic_reactor.c:safe_muldiv_time
Unexecuted instantiation: quic_record_rx.c:safe_muldiv_time
Unexecuted instantiation: quic_record_shared.c:safe_muldiv_time
Unexecuted instantiation: quic_record_tx.c:safe_muldiv_time
Unexecuted instantiation: quic_record_util.c:safe_muldiv_time
Unexecuted instantiation: quic_rstream.c:safe_muldiv_time
Unexecuted instantiation: quic_rstream.c:safe_muldiv_u64
Unexecuted instantiation: quic_sf_list.c:safe_muldiv_time
Unexecuted instantiation: quic_srtm.c:safe_muldiv_time
Unexecuted instantiation: quic_sstream.c:safe_muldiv_time
Unexecuted instantiation: quic_sstream.c:safe_muldiv_u64
Unexecuted instantiation: quic_statm.c:safe_muldiv_time
Unexecuted instantiation: quic_stream_map.c:safe_muldiv_time
Unexecuted instantiation: quic_thread_assist.c:safe_muldiv_time
Unexecuted instantiation: rec_layer_s3.c:safe_muldiv_time
Unexecuted instantiation: dtls_meth.c:safe_muldiv_time
Unexecuted instantiation: tls1_meth.c:safe_muldiv_time
Unexecuted instantiation: tls_common.c:safe_muldiv_time
Unexecuted instantiation: tls_multib.c:safe_muldiv_time
Unexecuted instantiation: tlsany_meth.c:safe_muldiv_time
Unexecuted instantiation: extensions.c:safe_muldiv_time
Unexecuted instantiation: extensions_clnt.c:safe_muldiv_time
Unexecuted instantiation: extensions_cust.c:safe_muldiv_time
Unexecuted instantiation: extensions_srvr.c:safe_muldiv_time
Unexecuted instantiation: statem.c:safe_muldiv_time
Unexecuted instantiation: statem_clnt.c:safe_muldiv_time
Unexecuted instantiation: statem_dtls.c:safe_muldiv_time
Unexecuted instantiation: statem_lib.c:safe_muldiv_time
Unexecuted instantiation: statem_srvr.c:safe_muldiv_time
Unexecuted instantiation: d1_lib.c:safe_muldiv_time
Unexecuted instantiation: d1_srtp.c:safe_muldiv_time
Unexecuted instantiation: methods.c:safe_muldiv_time
Unexecuted instantiation: pqueue.c:safe_muldiv_time
Unexecuted instantiation: s3_enc.c:safe_muldiv_time
Unexecuted instantiation: s3_lib.c:safe_muldiv_time
Unexecuted instantiation: s3_msg.c:safe_muldiv_time
Unexecuted instantiation: ssl_asn1.c:safe_muldiv_time
Unexecuted instantiation: ssl_conf.c:safe_muldiv_time
Unexecuted instantiation: ssl_rsa.c:safe_muldiv_time
Unexecuted instantiation: t1_enc.c:safe_muldiv_time
Unexecuted instantiation: qlog_event_helpers.c:safe_muldiv_time
Unexecuted instantiation: quic_channel.c:safe_muldiv_time
Unexecuted instantiation: quic_demux.c:safe_muldiv_time
Unexecuted instantiation: quic_engine.c:safe_muldiv_time
quic_fc.c:safe_muldiv_uint64_t
Line
Count
Source
353
90.5k
    {                                                                   \
354
90.5k
        int e2 = 0;                                                     \
355
90.5k
        type x, y;                                                      \
356
90.5k
                                                                        \
357
90.5k
        if (c == 0) {                                                   \
358
0
            *err |= 1;                                                  \
359
0
            return a == 0 || b == 0 ? 0 : max;                          \
360
0
        }                                                               \
361
90.5k
        x = safe_mul_##type_name(a, b, &e2);                            \
362
90.5k
        if (!e2)                                                        \
363
90.5k
            return x / c;                                               \
364
90.5k
        if (b > a) {                                                    \
365
0
            x = b;                                                      \
366
0
            b = a;                                                      \
367
0
            a = x;                                                      \
368
0
        }                                                               \
369
0
        x = safe_mul_##type_name(a % c, b, err);                        \
370
0
        y = safe_mul_##type_name(a / c, b, err);                        \
371
0
        return safe_add_##type_name(y, x / c, err);                     \
372
90.5k
    }
Unexecuted instantiation: quic_fc.c:safe_muldiv_time
Unexecuted instantiation: quic_lcidm.c:safe_muldiv_time
Unexecuted instantiation: quic_rx_depack.c:safe_muldiv_time
Unexecuted instantiation: quic_tls.c:safe_muldiv_time
Unexecuted instantiation: quic_txp.c:safe_muldiv_time
Unexecuted instantiation: quic_txpim.c:safe_muldiv_time
Unexecuted instantiation: quic_wire.c:safe_muldiv_time
Unexecuted instantiation: quic_wire.c:safe_muldiv_uint64_t
Unexecuted instantiation: rec_layer_d1.c:safe_muldiv_time
Unexecuted instantiation: ssl3_meth.c:safe_muldiv_time
Unexecuted instantiation: tls13_meth.c:safe_muldiv_time
Unexecuted instantiation: d1_msg.c:safe_muldiv_time
cc_newreno.c:safe_muldiv_u64
Line
Count
Source
353
11.7k
    {                                                                   \
354
11.7k
        int e2 = 0;                                                     \
355
11.7k
        type x, y;                                                      \
356
11.7k
                                                                        \
357
11.7k
        if (c == 0) {                                                   \
358
0
            *err |= 1;                                                  \
359
0
            return a == 0 || b == 0 ? 0 : max;                          \
360
0
        }                                                               \
361
11.7k
        x = safe_mul_##type_name(a, b, &e2);                            \
362
11.7k
        if (!e2)                                                        \
363
11.7k
            return x / c;                                               \
364
11.7k
        if (b > a) {                                                    \
365
0
            x = b;                                                      \
366
0
            b = a;                                                      \
367
0
            a = x;                                                      \
368
0
        }                                                               \
369
0
        x = safe_mul_##type_name(a % c, b, err);                        \
370
0
        y = safe_mul_##type_name(a / c, b, err);                        \
371
0
        return safe_add_##type_name(y, x / c, err);                     \
372
11.7k
    }
Unexecuted instantiation: cc_newreno.c:safe_muldiv_time
Unexecuted instantiation: qlog.c:safe_muldiv_time
Unexecuted instantiation: quic_ackm.c:safe_muldiv_time
Unexecuted instantiation: quic_fifd.c:safe_muldiv_time
Unexecuted instantiation: bss_dgram.c:safe_muldiv_time
bss_dgram_pair.c:safe_muldiv_size_t
Line
Count
Source
353
41.1k
    {                                                                   \
354
41.1k
        int e2 = 0;                                                     \
355
41.1k
        type x, y;                                                      \
356
41.1k
                                                                        \
357
41.1k
        if (c == 0) {                                                   \
358
0
            *err |= 1;                                                  \
359
0
            return a == 0 || b == 0 ? 0 : max;                          \
360
0
        }                                                               \
361
41.1k
        x = safe_mul_##type_name(a, b, &e2);                            \
362
41.1k
        if (!e2)                                                        \
363
41.1k
            return x / c;                                               \
364
41.1k
        if (b > a) {                                                    \
365
0
            x = b;                                                      \
366
0
            b = a;                                                      \
367
0
            a = x;                                                      \
368
0
        }                                                               \
369
0
        x = safe_mul_##type_name(a % c, b, err);                        \
370
0
        y = safe_mul_##type_name(a / c, b, err);                        \
371
0
        return safe_add_##type_name(y, x / c, err);                     \
372
41.1k
    }
Unexecuted instantiation: ct_policy.c:safe_muldiv_time
Unexecuted instantiation: sleep.c:safe_muldiv_time
Unexecuted instantiation: time.c:safe_muldiv_time
Unexecuted instantiation: thread_posix.c:safe_muldiv_time
Unexecuted instantiation: arch.c:safe_muldiv_time
Unexecuted instantiation: internal.c:safe_muldiv_time
Unexecuted instantiation: argon2.c:safe_muldiv_time
Unexecuted instantiation: tls1_prf.c:safe_muldiv_size_t
Unexecuted instantiation: quic-srtm.c:safe_muldiv_time
Unexecuted instantiation: quic-rcidm.c:safe_muldiv_time
Unexecuted instantiation: quic_rcidm.c:safe_muldiv_time
priority_queue.c:safe_muldiv_size_t
Line
Count
Source
353
76.9k
    {                                                                   \
354
76.9k
        int e2 = 0;                                                     \
355
76.9k
        type x, y;                                                      \
356
76.9k
                                                                        \
357
76.9k
        if (c == 0) {                                                   \
358
0
            *err |= 1;                                                  \
359
0
            return a == 0 || b == 0 ? 0 : max;                          \
360
0
        }                                                               \
361
76.9k
        x = safe_mul_##type_name(a, b, &e2);                            \
362
76.9k
        if (!e2)                                                        \
363
76.9k
            return x / c;                                               \
364
76.9k
        if (b > a) {                                                    \
365
0
            x = b;                                                      \
366
0
            b = a;                                                      \
367
0
            a = x;                                                      \
368
0
        }                                                               \
369
0
        x = safe_mul_##type_name(a % c, b, err);                        \
370
0
        y = safe_mul_##type_name(a / c, b, err);                        \
371
0
        return safe_add_##type_name(y, x / c, err);                     \
372
76.9k
    }
Unexecuted instantiation: ssl_txt.c:safe_muldiv_time
Unexecuted instantiation: quic-lcidm.c:safe_muldiv_time
373
374
/*
375
 * Calculate a / b rounding up:
376
 *     i.e. a / b + (a % b != 0)
377
 * Which is usually (less safely) converted to (a + b - 1) / b
378
 * If you *know* that b != 0, then it's safe to ignore err.
379
 */
380
#define OSSL_SAFE_MATH_DIV_ROUND_UP(type_name, type, max)                                        \
381
    static ossl_inline ossl_unused type safe_div_round_up_##type_name(type a, type b, int *errp) \
382
0
    {                                                                                            \
383
0
        type x;                                                                                  \
384
0
        int *err, err_local = 0;                                                                 \
385
0
                                                                                                 \
386
0
        /* Allow errors to be ignored by callers */                                              \
387
0
        err = errp != NULL ? errp : &err_local;                                                  \
388
0
        /* Fast path, both positive */                                                           \
389
0
        if (b > 0 && a > 0) {                                                                    \
390
0
            /* Faster path: no overflow concerns */                                              \
391
0
            if (a < max - b)                                                                     \
392
0
                return (a + b - 1) / b;                                                          \
393
0
            return a / b + (a % b != 0);                                                         \
394
0
        }                                                                                        \
395
0
        if (b == 0) {                                                                            \
396
0
            *err |= 1;                                                                           \
397
0
            return a == 0 ? 0 : max;                                                             \
398
0
        }                                                                                        \
399
0
        if (a == 0)                                                                              \
400
0
            return 0;                                                                            \
401
0
        /* Rather slow path because there are negatives involved */                              \
402
0
        x = safe_mod_##type_name(a, b, err);                                                     \
403
0
        return safe_add_##type_name(safe_div_##type_name(a, b, err),                             \
404
0
            x != 0, err);                                                                        \
405
0
    }
Unexecuted instantiation: quic-client.c:safe_div_round_up_time
Unexecuted instantiation: ssl_cert.c:safe_div_round_up_time
Unexecuted instantiation: ssl_ciph.c:safe_div_round_up_time
Unexecuted instantiation: ssl_init.c:safe_div_round_up_time
Unexecuted instantiation: ssl_lib.c:safe_div_round_up_time
Unexecuted instantiation: ssl_mcnf.c:safe_div_round_up_time
Unexecuted instantiation: ssl_sess.c:safe_div_round_up_time
Unexecuted instantiation: t1_lib.c:safe_div_round_up_time
Unexecuted instantiation: tls13_enc.c:safe_div_round_up_time
Unexecuted instantiation: tls_depr.c:safe_div_round_up_time
Unexecuted instantiation: tls_srp.c:safe_div_round_up_time
Unexecuted instantiation: quic_impl.c:safe_div_round_up_time
Unexecuted instantiation: quic_method.c:safe_div_round_up_time
Unexecuted instantiation: quic_port.c:safe_div_round_up_time
Unexecuted instantiation: quic_reactor.c:safe_div_round_up_time
Unexecuted instantiation: quic_record_rx.c:safe_div_round_up_time
Unexecuted instantiation: quic_record_shared.c:safe_div_round_up_time
Unexecuted instantiation: quic_record_tx.c:safe_div_round_up_time
Unexecuted instantiation: quic_record_util.c:safe_div_round_up_time
Unexecuted instantiation: quic_rstream.c:safe_div_round_up_time
Unexecuted instantiation: quic_rstream.c:safe_div_round_up_u64
Unexecuted instantiation: quic_sf_list.c:safe_div_round_up_time
Unexecuted instantiation: quic_srtm.c:safe_div_round_up_time
Unexecuted instantiation: quic_sstream.c:safe_div_round_up_time
Unexecuted instantiation: quic_sstream.c:safe_div_round_up_u64
Unexecuted instantiation: quic_statm.c:safe_div_round_up_time
Unexecuted instantiation: quic_stream_map.c:safe_div_round_up_time
Unexecuted instantiation: quic_thread_assist.c:safe_div_round_up_time
Unexecuted instantiation: rec_layer_s3.c:safe_div_round_up_time
Unexecuted instantiation: dtls_meth.c:safe_div_round_up_time
Unexecuted instantiation: tls1_meth.c:safe_div_round_up_time
Unexecuted instantiation: tls_common.c:safe_div_round_up_time
Unexecuted instantiation: tls_multib.c:safe_div_round_up_time
Unexecuted instantiation: tlsany_meth.c:safe_div_round_up_time
Unexecuted instantiation: extensions.c:safe_div_round_up_time
Unexecuted instantiation: extensions_clnt.c:safe_div_round_up_time
Unexecuted instantiation: extensions_cust.c:safe_div_round_up_time
Unexecuted instantiation: extensions_srvr.c:safe_div_round_up_time
Unexecuted instantiation: statem.c:safe_div_round_up_time
Unexecuted instantiation: statem_clnt.c:safe_div_round_up_time
Unexecuted instantiation: statem_dtls.c:safe_div_round_up_time
Unexecuted instantiation: statem_lib.c:safe_div_round_up_time
Unexecuted instantiation: statem_srvr.c:safe_div_round_up_time
Unexecuted instantiation: d1_lib.c:safe_div_round_up_time
Unexecuted instantiation: d1_srtp.c:safe_div_round_up_time
Unexecuted instantiation: methods.c:safe_div_round_up_time
Unexecuted instantiation: pqueue.c:safe_div_round_up_time
Unexecuted instantiation: s3_enc.c:safe_div_round_up_time
Unexecuted instantiation: s3_lib.c:safe_div_round_up_time
Unexecuted instantiation: s3_msg.c:safe_div_round_up_time
Unexecuted instantiation: ssl_asn1.c:safe_div_round_up_time
Unexecuted instantiation: ssl_conf.c:safe_div_round_up_time
Unexecuted instantiation: ssl_rsa.c:safe_div_round_up_time
Unexecuted instantiation: t1_enc.c:safe_div_round_up_time
Unexecuted instantiation: qlog_event_helpers.c:safe_div_round_up_time
Unexecuted instantiation: quic_channel.c:safe_div_round_up_time
Unexecuted instantiation: quic_demux.c:safe_div_round_up_time
Unexecuted instantiation: quic_engine.c:safe_div_round_up_time
Unexecuted instantiation: quic_fc.c:safe_div_round_up_time
Unexecuted instantiation: quic_fc.c:safe_div_round_up_uint64_t
Unexecuted instantiation: quic_lcidm.c:safe_div_round_up_time
Unexecuted instantiation: quic_rx_depack.c:safe_div_round_up_time
Unexecuted instantiation: quic_tls.c:safe_div_round_up_time
Unexecuted instantiation: quic_txp.c:safe_div_round_up_time
Unexecuted instantiation: quic_txpim.c:safe_div_round_up_time
Unexecuted instantiation: quic_wire.c:safe_div_round_up_time
Unexecuted instantiation: quic_wire.c:safe_div_round_up_uint64_t
Unexecuted instantiation: rec_layer_d1.c:safe_div_round_up_time
Unexecuted instantiation: ssl3_meth.c:safe_div_round_up_time
Unexecuted instantiation: tls13_meth.c:safe_div_round_up_time
Unexecuted instantiation: d1_msg.c:safe_div_round_up_time
Unexecuted instantiation: cc_newreno.c:safe_div_round_up_time
Unexecuted instantiation: cc_newreno.c:safe_div_round_up_u64
Unexecuted instantiation: qlog.c:safe_div_round_up_time
Unexecuted instantiation: quic_ackm.c:safe_div_round_up_time
Unexecuted instantiation: quic_fifd.c:safe_div_round_up_time
Unexecuted instantiation: bss_dgram.c:safe_div_round_up_time
Unexecuted instantiation: bss_dgram_pair.c:safe_div_round_up_size_t
Unexecuted instantiation: ct_policy.c:safe_div_round_up_time
Unexecuted instantiation: sleep.c:safe_div_round_up_time
Unexecuted instantiation: time.c:safe_div_round_up_time
Unexecuted instantiation: stack.c:safe_div_round_up_int
Unexecuted instantiation: thread_posix.c:safe_div_round_up_time
Unexecuted instantiation: arch.c:safe_div_round_up_time
Unexecuted instantiation: internal.c:safe_div_round_up_time
Unexecuted instantiation: v3_ncons.c:safe_div_round_up_int
Unexecuted instantiation: argon2.c:safe_div_round_up_time
Unexecuted instantiation: tls1_prf.c:safe_div_round_up_size_t
Unexecuted instantiation: quic-srtm.c:safe_div_round_up_time
Unexecuted instantiation: quic-rcidm.c:safe_div_round_up_time
Unexecuted instantiation: quic_rcidm.c:safe_div_round_up_time
Unexecuted instantiation: priority_queue.c:safe_div_round_up_size_t
Unexecuted instantiation: ssl_txt.c:safe_div_round_up_time
Unexecuted instantiation: quic-lcidm.c:safe_div_round_up_time
406
407
/* Calculate ranges of types */
408
#define OSSL_SAFE_MATH_MINS(type) ((type)1 << (sizeof(type) * 8 - 1))
409
#define OSSL_SAFE_MATH_MAXS(type) (~OSSL_SAFE_MATH_MINS(type))
410
#define OSSL_SAFE_MATH_MAXU(type) (~(type)0)
411
412
/*
413
 * Wrapper macros to create all the functions of a given type
414
 */
415
#define OSSL_SAFE_MATH_SIGNED(type_name, type)                         \
416
    OSSL_SAFE_MATH_ADDS(type_name, type, OSSL_SAFE_MATH_MINS(type),    \
417
        OSSL_SAFE_MATH_MAXS(type))                                     \
418
    OSSL_SAFE_MATH_SUBS(type_name, type, OSSL_SAFE_MATH_MINS(type),    \
419
        OSSL_SAFE_MATH_MAXS(type))                                     \
420
    OSSL_SAFE_MATH_MULS(type_name, type, OSSL_SAFE_MATH_MINS(type),    \
421
        OSSL_SAFE_MATH_MAXS(type))                                     \
422
    OSSL_SAFE_MATH_DIVS(type_name, type, OSSL_SAFE_MATH_MINS(type),    \
423
        OSSL_SAFE_MATH_MAXS(type))                                     \
424
    OSSL_SAFE_MATH_MODS(type_name, type, OSSL_SAFE_MATH_MINS(type),    \
425
        OSSL_SAFE_MATH_MAXS(type))                                     \
426
    OSSL_SAFE_MATH_DIV_ROUND_UP(type_name, type,                       \
427
        OSSL_SAFE_MATH_MAXS(type))                                     \
428
    OSSL_SAFE_MATH_MULDIVS(type_name, type, OSSL_SAFE_MATH_MAXS(type)) \
429
    OSSL_SAFE_MATH_NEGS(type_name, type, OSSL_SAFE_MATH_MINS(type))    \
430
    OSSL_SAFE_MATH_ABSS(type_name, type, OSSL_SAFE_MATH_MINS(type))
431
432
#define OSSL_SAFE_MATH_UNSIGNED(type_name, type)                       \
433
    OSSL_SAFE_MATH_ADDU(type_name, type, OSSL_SAFE_MATH_MAXU(type))    \
434
    OSSL_SAFE_MATH_SUBU(type_name, type)                               \
435
    OSSL_SAFE_MATH_MULU(type_name, type, OSSL_SAFE_MATH_MAXU(type))    \
436
    OSSL_SAFE_MATH_DIVU(type_name, type, OSSL_SAFE_MATH_MAXU(type))    \
437
    OSSL_SAFE_MATH_MODU(type_name, type)                               \
438
    OSSL_SAFE_MATH_DIV_ROUND_UP(type_name, type,                       \
439
        OSSL_SAFE_MATH_MAXU(type))                                     \
440
    OSSL_SAFE_MATH_MULDIVU(type_name, type, OSSL_SAFE_MATH_MAXU(type)) \
441
    OSSL_SAFE_MATH_NEGU(type_name, type)                               \
442
    OSSL_SAFE_MATH_ABSU(type_name, type)
443
444
#endif /* OSSL_INTERNAL_SAFE_MATH_H */