LCOV - code coverage report
Current view: top level - source4/heimdal/lib/krb5 - data.c (source / functions) Hit Total Coverage
Test: coverage report for abartlet/fix-coverage dd10fb34 Lines: 44 53 83.0 %
Date: 2021-09-23 10:06:22 Functions: 9 9 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 1997 - 2007 Kungliga Tekniska Högskolan
       3             :  * (Royal Institute of Technology, Stockholm, Sweden).
       4             :  * All rights reserved.
       5             :  *
       6             :  * Redistribution and use in source and binary forms, with or without
       7             :  * modification, are permitted provided that the following conditions
       8             :  * are met:
       9             :  *
      10             :  * 1. Redistributions of source code must retain the above copyright
      11             :  *    notice, this list of conditions and the following disclaimer.
      12             :  *
      13             :  * 2. Redistributions in binary form must reproduce the above copyright
      14             :  *    notice, this list of conditions and the following disclaimer in the
      15             :  *    documentation and/or other materials provided with the distribution.
      16             :  *
      17             :  * 3. Neither the name of the Institute nor the names of its contributors
      18             :  *    may be used to endorse or promote products derived from this software
      19             :  *    without specific prior written permission.
      20             :  *
      21             :  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
      22             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      23             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      24             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
      25             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      26             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      27             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      28             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      29             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      30             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      31             :  * SUCH DAMAGE.
      32             :  */
      33             : 
      34             : #include "krb5_locl.h"
      35             : 
      36             : /**
      37             :  * Reset the (potentially uninitalized) krb5_data structure.
      38             :  *
      39             :  * @param p krb5_data to reset.
      40             :  *
      41             :  * @ingroup krb5
      42             :  */
      43             : 
      44             : KRB5_LIB_FUNCTION void KRB5_LIB_CALL
      45    16246501 : krb5_data_zero(krb5_data *p)
      46             : {
      47    16246501 :     p->length = 0;
      48    16246501 :     p->data   = NULL;
      49    16246501 : }
      50             : 
      51             : /**
      52             :  * Free the content of krb5_data structure, its ok to free a zeroed
      53             :  * structure (with memset() or krb5_data_zero()). When done, the
      54             :  * structure will be zeroed. The same function is called
      55             :  * krb5_free_data_contents() in MIT Kerberos.
      56             :  *
      57             :  * @param p krb5_data to free.
      58             :  *
      59             :  * @ingroup krb5
      60             :  */
      61             : 
      62             : KRB5_LIB_FUNCTION void KRB5_LIB_CALL
      63    14954360 : krb5_data_free(krb5_data *p)
      64             : {
      65    14954360 :     if(p->data != NULL)
      66    13659833 :         free(p->data);
      67    14954360 :     krb5_data_zero(p);
      68    14954360 : }
      69             : 
      70             : /**
      71             :  * Free krb5_data (and its content).
      72             :  *
      73             :  * @param context Kerberos 5 context.
      74             :  * @param p krb5_data to free.
      75             :  *
      76             :  * @ingroup krb5
      77             :  */
      78             : 
      79             : KRB5_LIB_FUNCTION void KRB5_LIB_CALL
      80     3402259 : krb5_free_data(krb5_context context,
      81             :                krb5_data *p)
      82             : {
      83     3402259 :     krb5_data_free(p);
      84     3402259 :     free(p);
      85     3402259 : }
      86             : 
      87             : /**
      88             :  * Allocate data of and krb5_data.
      89             :  *
      90             :  * @param p krb5_data to allocate.
      91             :  * @param len size to allocate.
      92             :  *
      93             :  * @return Returns 0 to indicate success. Otherwise an kerberos et
      94             :  * error code is returned.
      95             :  *
      96             :  * @ingroup krb5
      97             :  */
      98             : 
      99             : KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
     100    11970360 : krb5_data_alloc(krb5_data *p, int len)
     101             : {
     102    11970360 :     p->data = malloc(len);
     103    11970360 :     if(len && p->data == NULL)
     104           0 :         return ENOMEM;
     105    11970360 :     p->length = len;
     106    11970360 :     return 0;
     107             : }
     108             : 
     109             : /**
     110             :  * Grow (or shrink) the content of krb5_data to a new size.
     111             :  *
     112             :  * @param p krb5_data to free.
     113             :  * @param len new size.
     114             :  *
     115             :  * @return Returns 0 to indicate success. Otherwise an kerberos et
     116             :  * error code is returned.
     117             :  *
     118             :  * @ingroup krb5
     119             :  */
     120             : 
     121             : KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
     122      280499 : krb5_data_realloc(krb5_data *p, int len)
     123             : {
     124             :     void *tmp;
     125      280499 :     tmp = realloc(p->data, len);
     126      280499 :     if(len && !tmp)
     127           0 :         return ENOMEM;
     128      280499 :     p->data = tmp;
     129      280499 :     p->length = len;
     130      280499 :     return 0;
     131             : }
     132             : 
     133             : /**
     134             :  * Copy the data of len into the krb5_data.
     135             :  *
     136             :  * @param p krb5_data to copy into.
     137             :  * @param data data to copy..
     138             :  * @param len new size.
     139             :  *
     140             :  * @return Returns 0 to indicate success. Otherwise an kerberos et
     141             :  * error code is returned.
     142             :  *
     143             :  * @ingroup krb5
     144             :  */
     145             : 
     146             : KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
     147     4455562 : krb5_data_copy(krb5_data *p, const void *data, size_t len)
     148             : {
     149     4455562 :     if (len) {
     150     3734717 :         if(krb5_data_alloc(p, len))
     151           0 :             return ENOMEM;
     152     3734717 :         memmove(p->data, data, len);
     153             :     } else
     154      720845 :         p->data = NULL;
     155     4455562 :     p->length = len;
     156     4455562 :     return 0;
     157             : }
     158             : 
     159             : /**
     160             :  * Copy the data into a newly allocated krb5_data.
     161             :  *
     162             :  * @param context Kerberos 5 context.
     163             :  * @param indata the krb5_data data to copy
     164             :  * @param outdata new krb5_date to copy too. Free with krb5_free_data().
     165             :  *
     166             :  * @return Returns 0 to indicate success. Otherwise an kerberos et
     167             :  * error code is returned.
     168             :  *
     169             :  * @ingroup krb5
     170             :  */
     171             : 
     172             : KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
     173       95463 : krb5_copy_data(krb5_context context,
     174             :                const krb5_data *indata,
     175             :                krb5_data **outdata)
     176             : {
     177             :     krb5_error_code ret;
     178       95463 :     ALLOC(*outdata, 1);
     179       95463 :     if(*outdata == NULL) {
     180           0 :         krb5_set_error_message(context, ENOMEM, "malloc: out of memory");
     181           0 :         return ENOMEM;
     182             :     }
     183       95463 :     ret = der_copy_octet_string(indata, *outdata);
     184       95463 :     if(ret) {
     185           0 :         krb5_clear_error_message (context);
     186           0 :         free(*outdata);
     187           0 :         *outdata = NULL;
     188             :     }
     189       93423 :     return ret;
     190             : }
     191             : 
     192             : /**
     193             :  * Compare to data.
     194             :  *
     195             :  * @param data1 krb5_data to compare
     196             :  * @param data2 krb5_data to compare
     197             :  *
     198             :  * @return return the same way as memcmp(), useful when sorting.
     199             :  *
     200             :  * @ingroup krb5
     201             :  */
     202             : 
     203             : KRB5_LIB_FUNCTION int KRB5_LIB_CALL
     204       17393 : krb5_data_cmp(const krb5_data *data1, const krb5_data *data2)
     205             : {
     206       17393 :     if (data1->length != data2->length)
     207        7021 :         return data1->length - data2->length;
     208       10372 :     return memcmp(data1->data, data2->data, data1->length);
     209             : }
     210             : 
     211             : /**
     212             :  * Compare to data not exposing timing information from the checksum data
     213             :  *
     214             :  * @param data1 krb5_data to compare
     215             :  * @param data2 krb5_data to compare
     216             :  *
     217             :  * @return returns zero for same data, otherwise non zero.
     218             :  *
     219             :  * @ingroup krb5
     220             :  */
     221             : 
     222             : KRB5_LIB_FUNCTION int KRB5_LIB_CALL
     223     1442432 : krb5_data_ct_cmp(const krb5_data *data1, const krb5_data *data2)
     224             : {
     225     1442432 :     if (data1->length != data2->length)
     226           0 :         return data1->length - data2->length;
     227     1442432 :     return ct_memcmp(data1->data, data2->data, data1->length);
     228             : }

Generated by: LCOV version 1.13