Coverage Report

Created: 2025-07-01 06:25

/src/nss/lib/base/item.c
Line
Count
Source (jump to first uncovered line)
1
/* This Source Code Form is subject to the terms of the Mozilla Public
2
 * License, v. 2.0. If a copy of the MPL was not distributed with this
3
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5
/*
6
 * item.c
7
 *
8
 * This contains some item-manipulation code.
9
 */
10
11
#ifndef BASE_H
12
#include "base.h"
13
#endif /* BASE_H */
14
15
/*
16
 * nssItem_Create
17
 *
18
 * -- fgmr comments --
19
 *
20
 * The error may be one of the following values:
21
 *  NSS_ERROR_INVALID_ARENA
22
 *  NSS_ERROR_NO_MEMORY
23
 *  NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD
24
 *  NSS_ERROR_INVALID_POINTER
25
 *
26
 * Return value:
27
 *  A pointer to an NSSItem upon success
28
 *  NULL upon failure
29
 */
30
31
NSS_IMPLEMENT NSSItem *
32
nssItem_Create(NSSArena *arenaOpt, NSSItem *rvOpt, PRUint32 length,
33
               const void *data)
34
0
{
35
0
    NSSItem *rv = (NSSItem *)NULL;
36
37
0
#ifdef DEBUG
38
0
    if ((NSSArena *)NULL != arenaOpt) {
39
0
        if (PR_SUCCESS != nssArena_verifyPointer(arenaOpt)) {
40
0
            return (NSSItem *)NULL;
41
0
        }
42
0
    }
43
44
0
    if ((const void *)NULL == data) {
45
0
        if (length > 0) {
46
0
            nss_SetError(NSS_ERROR_INVALID_POINTER);
47
0
            return (NSSItem *)NULL;
48
0
        }
49
0
    }
50
0
#endif /* DEBUG */
51
52
0
    if ((NSSItem *)NULL == rvOpt) {
53
0
        rv = (NSSItem *)nss_ZNEW(arenaOpt, NSSItem);
54
0
        if ((NSSItem *)NULL == rv) {
55
0
            goto loser;
56
0
        }
57
0
    } else {
58
0
        rv = rvOpt;
59
0
    }
60
61
0
    rv->size = length;
62
0
    rv->data = nss_ZAlloc(arenaOpt, length);
63
0
    if ((void *)NULL == rv->data) {
64
0
        goto loser;
65
0
    }
66
67
0
    if (length > 0) {
68
0
        (void)nsslibc_memcpy(rv->data, data, length);
69
0
    }
70
71
0
    return rv;
72
73
0
loser:
74
0
    if (rv != rvOpt) {
75
0
        nss_ZFreeIf(rv);
76
0
    }
77
78
0
    return (NSSItem *)NULL;
79
0
}
80
81
NSS_IMPLEMENT void
82
nssItem_Destroy(NSSItem *item)
83
0
{
84
0
    nss_ClearErrorStack();
85
86
0
    nss_ZFreeIf(item->data);
87
0
    nss_ZFreeIf(item);
88
0
}
89
90
/*
91
 * nssItem_Duplicate
92
 *
93
 * -- fgmr comments --
94
 *
95
 * The error may be one of the following values:
96
 *  NSS_ERROR_INVALID_ARENA
97
 *  NSS_ERROR_NO_MEMORY
98
 *  NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD
99
 *  NSS_ERROR_INVALID_ITEM
100
 *
101
 * Return value:
102
 *  A pointer to an NSSItem upon success
103
 *  NULL upon failure
104
 */
105
106
NSS_IMPLEMENT NSSItem *
107
nssItem_Duplicate(NSSItem *obj, NSSArena *arenaOpt, NSSItem *rvOpt)
108
0
{
109
0
#ifdef DEBUG
110
0
    if ((NSSArena *)NULL != arenaOpt) {
111
0
        if (PR_SUCCESS != nssArena_verifyPointer(arenaOpt)) {
112
0
            return (NSSItem *)NULL;
113
0
        }
114
0
    }
115
116
0
    if ((NSSItem *)NULL == obj) {
117
0
        nss_SetError(NSS_ERROR_INVALID_ITEM);
118
0
        return (NSSItem *)NULL;
119
0
    }
120
0
#endif /* DEBUG */
121
122
0
    return nssItem_Create(arenaOpt, rvOpt, obj->size, obj->data);
123
0
}
124
125
#ifdef DEBUG
126
/*
127
 * nssItem_verifyPointer
128
 *
129
 * -- fgmr comments --
130
 *
131
 * The error may be one of the following values:
132
 *  NSS_ERROR_INVALID_ITEM
133
 *
134
 * Return value:
135
 *  PR_SUCCESS upon success
136
 *  PR_FAILURE upon failure
137
 */
138
139
NSS_IMPLEMENT PRStatus
140
nssItem_verifyPointer(const NSSItem *item)
141
0
{
142
0
    if (((const NSSItem *)NULL == item) ||
143
0
        (((void *)NULL == item->data) && (item->size > 0))) {
144
0
        nss_SetError(NSS_ERROR_INVALID_ITEM);
145
0
        return PR_FAILURE;
146
0
    }
147
148
0
    return PR_SUCCESS;
149
0
}
150
#endif /* DEBUG */
151
152
/*
153
 * nssItem_Equal
154
 *
155
 * -- fgmr comments --
156
 *
157
 * The error may be one of the following values:
158
 *  NSS_ERROR_INVALID_ITEM
159
 *
160
 * Return value:
161
 *  PR_TRUE if the items are identical
162
 *  PR_FALSE if they aren't
163
 *  PR_FALSE upon error
164
 */
165
166
NSS_IMPLEMENT PRBool
167
nssItem_Equal(const NSSItem *one, const NSSItem *two, PRStatus *statusOpt)
168
0
{
169
0
    if ((PRStatus *)NULL != statusOpt) {
170
0
        *statusOpt = PR_SUCCESS;
171
0
    }
172
173
0
    if (((const NSSItem *)NULL == one) && ((const NSSItem *)NULL == two)) {
174
0
        return PR_TRUE;
175
0
    }
176
177
0
    if (((const NSSItem *)NULL == one) || ((const NSSItem *)NULL == two)) {
178
0
        return PR_FALSE;
179
0
    }
180
181
0
    if (one->size != two->size) {
182
0
        return PR_FALSE;
183
0
    }
184
185
0
    return nsslibc_memequal(one->data, two->data, one->size, statusOpt);
186
0
}