tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

item.c (3903B)


      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 {
     35    NSSItem *rv = (NSSItem *)NULL;
     36 
     37 #ifdef DEBUG
     38    if ((NSSArena *)NULL != arenaOpt) {
     39        if (PR_SUCCESS != nssArena_verifyPointer(arenaOpt)) {
     40            return (NSSItem *)NULL;
     41        }
     42    }
     43 
     44    if ((const void *)NULL == data) {
     45        if (length > 0) {
     46            nss_SetError(NSS_ERROR_INVALID_POINTER);
     47            return (NSSItem *)NULL;
     48        }
     49    }
     50 #endif /* DEBUG */
     51 
     52    if ((NSSItem *)NULL == rvOpt) {
     53        rv = (NSSItem *)nss_ZNEW(arenaOpt, NSSItem);
     54        if ((NSSItem *)NULL == rv) {
     55            goto loser;
     56        }
     57    } else {
     58        rv = rvOpt;
     59    }
     60 
     61    rv->size = length;
     62    rv->data = nss_ZAlloc(arenaOpt, length);
     63    if ((void *)NULL == rv->data) {
     64        goto loser;
     65    }
     66 
     67    if (length > 0) {
     68        (void)nsslibc_memcpy(rv->data, data, length);
     69    }
     70 
     71    return rv;
     72 
     73 loser:
     74    if (rv != rvOpt) {
     75        nss_ZFreeIf(rv);
     76    }
     77 
     78    return (NSSItem *)NULL;
     79 }
     80 
     81 NSS_IMPLEMENT void
     82 nssItem_Destroy(NSSItem *item)
     83 {
     84    nss_ClearErrorStack();
     85 
     86    nss_ZFreeIf(item->data);
     87    nss_ZFreeIf(item);
     88 }
     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 {
    109 #ifdef DEBUG
    110    if ((NSSArena *)NULL != arenaOpt) {
    111        if (PR_SUCCESS != nssArena_verifyPointer(arenaOpt)) {
    112            return (NSSItem *)NULL;
    113        }
    114    }
    115 
    116    if ((NSSItem *)NULL == obj) {
    117        nss_SetError(NSS_ERROR_INVALID_ITEM);
    118        return (NSSItem *)NULL;
    119    }
    120 #endif /* DEBUG */
    121 
    122    return nssItem_Create(arenaOpt, rvOpt, obj->size, obj->data);
    123 }
    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 {
    142    if (((const NSSItem *)NULL == item) ||
    143        (((void *)NULL == item->data) && (item->size > 0))) {
    144        nss_SetError(NSS_ERROR_INVALID_ITEM);
    145        return PR_FAILURE;
    146    }
    147 
    148    return PR_SUCCESS;
    149 }
    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 {
    169    if ((PRStatus *)NULL != statusOpt) {
    170        *statusOpt = PR_SUCCESS;
    171    }
    172 
    173    if (((const NSSItem *)NULL == one) && ((const NSSItem *)NULL == two)) {
    174        return PR_TRUE;
    175    }
    176 
    177    if (((const NSSItem *)NULL == one) || ((const NSSItem *)NULL == two)) {
    178        return PR_FALSE;
    179    }
    180 
    181    if (one->size != two->size) {
    182        return PR_FALSE;
    183    }
    184 
    185    return nsslibc_memequal(one->data, two->data, one->size, statusOpt);
    186 }