Coverage Report

Created: 2026-08-31 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cjose/src/util.c
Line
Count
Source
1
/*!
2
 * Copyrights
3
 *
4
 * Portions created or assigned to Cisco Systems, Inc. are
5
 * Copyright (c) 2014-2016 Cisco Systems, Inc.  All Rights Reserved.
6
 */
7
8
#include "include/util_int.h"
9
10
#include <cjose/util.h>
11
12
#include <jansson.h>
13
#include <openssl/crypto.h>
14
#include <stdlib.h>
15
#include <string.h>
16
17
static cjose_alloc_fn_t _alloc;
18
static cjose_realloc_fn_t _realloc;
19
static cjose_dealloc_fn_t _dealloc;
20
static cjose_alloc3_fn_t _alloc3;
21
static cjose_realloc3_fn_t _realloc3;
22
static cjose_dealloc3_fn_t _dealloc3;
23
24
0
void *cjose_alloc_wrapped(size_t n) { return cjose_get_alloc3()(n, __FILE__, __LINE__); }
25
0
void *cjose_realloc_wrapped(void *p, size_t n) { return cjose_get_realloc3()(p, n, __FILE__, __LINE__); }
26
0
void cjose_dealloc_wrapped(void *p) { cjose_get_dealloc3()(p, __FILE__, __LINE__); }
27
28
void *cjose_alloc3_default(size_t n, const char *file, int line)
29
0
{
30
0
    CJOSE_UNUSED_PARAM(file);
31
0
    CJOSE_UNUSED_PARAM(line);
32
0
    return cjose_get_alloc()(n);
33
0
}
34
35
void *cjose_realloc3_default(void *p, size_t n, const char *file, int line)
36
0
{
37
0
    CJOSE_UNUSED_PARAM(file);
38
0
    CJOSE_UNUSED_PARAM(line);
39
0
    return cjose_get_realloc()(p, n);
40
0
}
41
42
void cjose_dealloc3_default(void *p, const char *file, int line)
43
0
{
44
0
    CJOSE_UNUSED_PARAM(file);
45
0
    CJOSE_UNUSED_PARAM(line);
46
0
    cjose_get_dealloc()(p);
47
0
}
48
49
static void cjose_apply_allocs(void)
50
0
{
51
    // set upstream
52
0
    json_set_alloc_funcs(cjose_get_alloc(), cjose_get_dealloc());
53
0
#if defined(CJOSE_OPENSSL_11X)
54
0
    CRYPTO_set_mem_functions(cjose_get_alloc3(), cjose_get_realloc3(), cjose_get_dealloc3());
55
#else
56
    CRYPTO_set_mem_functions(cjose_get_alloc(), cjose_get_realloc(), cjose_get_dealloc());
57
#endif
58
0
}
59
60
void cjose_set_alloc_funcs(cjose_alloc_fn_t alloc, cjose_realloc_fn_t realloc, cjose_dealloc_fn_t dealloc)
61
0
{
62
    // save "locally"
63
0
    _alloc = alloc;
64
0
    _realloc = realloc;
65
0
    _dealloc = dealloc;
66
0
    _alloc3 = cjose_alloc3_default;
67
0
    _realloc3 = cjose_realloc3_default;
68
0
    _dealloc3 = cjose_dealloc3_default;
69
70
0
    cjose_apply_allocs();
71
0
}
72
73
void cjose_set_alloc_ex_funcs(cjose_alloc3_fn_t alloc3, cjose_realloc3_fn_t realloc3, cjose_dealloc3_fn_t dealloc3)
74
0
{
75
    // save "locally"
76
0
    _alloc3 = alloc3;
77
0
    _realloc3 = realloc3;
78
0
    _dealloc3 = dealloc3;
79
0
    _alloc = (NULL != alloc3) ? cjose_alloc_wrapped : NULL;
80
0
    _realloc = (NULL != realloc3) ? cjose_realloc_wrapped : NULL;
81
0
    _dealloc = (NULL != dealloc3) ? cjose_dealloc_wrapped : NULL;
82
83
0
    cjose_apply_allocs();
84
0
}
85
86
99.2k
cjose_alloc_fn_t cjose_get_alloc(void) { return (!_alloc) ? malloc : _alloc; }
87
0
cjose_alloc3_fn_t cjose_get_alloc3(void) { return (!_alloc3) ? cjose_alloc3_default : _alloc3; }
88
89
0
cjose_realloc_fn_t cjose_get_realloc(void) { return (!_realloc) ? realloc : _realloc; }
90
0
cjose_realloc3_fn_t cjose_get_realloc3(void) { return (!_realloc3) ? cjose_realloc3_default : _realloc3; }
91
92
127k
cjose_dealloc_fn_t cjose_get_dealloc(void) { return (!_dealloc) ? free : _dealloc; }
93
0
cjose_dealloc3_fn_t cjose_get_dealloc3(void) { return (!_dealloc3) ? cjose_dealloc3_default : _dealloc3; }
94
95
void _cjose_cleanse(void *ptr, size_t len)
96
45.8k
{
97
45.8k
    if (NULL != ptr && 0 != len)
98
42.2k
    {
99
42.2k
        OPENSSL_cleanse(ptr, len);
100
42.2k
    }
101
45.8k
}
102
103
void _cjose_cleanse_dealloc(void *ptr, size_t len)
104
60.0k
{
105
60.0k
    if (NULL != ptr)
106
45.8k
    {
107
45.8k
        _cjose_cleanse(ptr, len);
108
45.8k
        cjose_get_dealloc()(ptr);
109
45.8k
    }
110
60.0k
}
111
112
0
int cjose_const_memcmp(const uint8_t *a, const uint8_t *b, const size_t size) { return CRYPTO_memcmp(a, b, size); }
113
114
char *_cjose_strndup(const char *str, ssize_t len, cjose_err *err)
115
23.1k
{
116
23.1k
    if (NULL == str)
117
0
    {
118
0
        CJOSE_ERROR(err, CJOSE_ERR_INVALID_ARG);
119
0
        return NULL;
120
0
    }
121
122
23.1k
    if (0 > len)
123
23.1k
    {
124
23.1k
        len = strlen(str);
125
23.1k
    }
126
127
23.1k
    char *result = cjose_get_alloc()(sizeof(char) * (len + 1));
128
23.1k
    if (!result)
129
0
    {
130
0
        CJOSE_ERROR(err, CJOSE_ERR_NO_MEMORY);
131
0
        return NULL;
132
0
    }
133
23.1k
    memcpy(result, str, len);
134
23.1k
    result[len] = 0;
135
136
23.1k
    return result;
137
23.1k
}
138
139
json_t *_cjose_json_stringn(const char *value, size_t len, cjose_err *err)
140
22.1k
{
141
22.1k
    json_t *result = NULL;
142
#if JANSSON_VERSION_HEX <= 0x020600
143
    char *s = _cjose_strndup(value, len, err);
144
    if (!s)
145
    {
146
        return NULL;
147
    }
148
    result = json_string(s);
149
    if (!result)
150
    {
151
        cjose_get_dealloc()(s);
152
        CJOSE_ERROR(err, CJOSE_ERR_NO_MEMORY);
153
        return NULL;
154
    }
155
    cjose_get_dealloc()(s);
156
#else
157
22.1k
    result = json_stringn(value, len);
158
22.1k
    if (!result)
159
0
    {
160
0
        CJOSE_ERROR(err, CJOSE_ERR_NO_MEMORY);
161
0
        return NULL;
162
0
    }
163
22.1k
#endif
164
22.1k
    return result;
165
22.1k
}