LCOV - code coverage report
Current view: top level - third_party/openssl/crypto/buffer - buffer.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 53 72 73.6 %
Date: 2015-10-10 Functions: 4 5 80.0 %

          Line data    Source code
       1             : /* crypto/buffer/buffer.c */
       2             : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       3             :  * All rights reserved.
       4             :  *
       5             :  * This package is an SSL implementation written
       6             :  * by Eric Young (eay@cryptsoft.com).
       7             :  * The implementation was written so as to conform with Netscapes SSL.
       8             :  *
       9             :  * This library is free for commercial and non-commercial use as long as
      10             :  * the following conditions are aheared to.  The following conditions
      11             :  * apply to all code found in this distribution, be it the RC4, RSA,
      12             :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      13             :  * included with this distribution is covered by the same copyright terms
      14             :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      15             :  *
      16             :  * Copyright remains Eric Young's, and as such any Copyright notices in
      17             :  * the code are not to be removed.
      18             :  * If this package is used in a product, Eric Young should be given attribution
      19             :  * as the author of the parts of the library used.
      20             :  * This can be in the form of a textual message at program startup or
      21             :  * in documentation (online or textual) provided with the package.
      22             :  *
      23             :  * Redistribution and use in source and binary forms, with or without
      24             :  * modification, are permitted provided that the following conditions
      25             :  * are met:
      26             :  * 1. Redistributions of source code must retain the copyright
      27             :  *    notice, this list of conditions and the following disclaimer.
      28             :  * 2. Redistributions in binary form must reproduce the above copyright
      29             :  *    notice, this list of conditions and the following disclaimer in the
      30             :  *    documentation and/or other materials provided with the distribution.
      31             :  * 3. All advertising materials mentioning features or use of this software
      32             :  *    must display the following acknowledgement:
      33             :  *    "This product includes cryptographic software written by
      34             :  *     Eric Young (eay@cryptsoft.com)"
      35             :  *    The word 'cryptographic' can be left out if the rouines from the library
      36             :  *    being used are not cryptographic related :-).
      37             :  * 4. If you include any Windows specific code (or a derivative thereof) from
      38             :  *    the apps directory (application code) you must include an acknowledgement:
      39             :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      40             :  *
      41             :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      42             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      43             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      44             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      45             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      46             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      47             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      49             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      50             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      51             :  * SUCH DAMAGE.
      52             :  *
      53             :  * The licence and distribution terms for any publically available version or
      54             :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
      55             :  * copied and put under another distribution licence
      56             :  * [including the GNU Public Licence.]
      57             :  */
      58             : 
      59             : #include <stdio.h>
      60             : #include "cryptlib.h"
      61             : #include <openssl/buffer.h>
      62             : 
      63             : /*
      64             :  * LIMIT_BEFORE_EXPANSION is the maximum n such that (n+3)/3*4 < 2**31. That
      65             :  * function is applied in several functions in this file and this limit
      66             :  * ensures that the result fits in an int.
      67             :  */
      68             : #define LIMIT_BEFORE_EXPANSION 0x5ffffffc
      69             : 
      70       21057 : BUF_MEM *BUF_MEM_new(void)
      71             : {
      72             :     BUF_MEM *ret;
      73             : 
      74       21057 :     ret = OPENSSL_malloc(sizeof(BUF_MEM));
      75       21057 :     if (ret == NULL) {
      76           0 :         BUFerr(BUF_F_BUF_MEM_NEW, ERR_R_MALLOC_FAILURE);
      77           0 :         return (NULL);
      78             :     }
      79       21057 :     ret->length = 0;
      80       21057 :     ret->max = 0;
      81       21057 :     ret->data = NULL;
      82       21057 :     return (ret);
      83             : }
      84             : 
      85       14093 : void BUF_MEM_free(BUF_MEM *a)
      86             : {
      87       14093 :     if (a == NULL)
      88       14093 :         return;
      89             : 
      90       14093 :     if (a->data != NULL) {
      91        6356 :         OPENSSL_cleanse(a->data, a->max);
      92        6356 :         OPENSSL_free(a->data);
      93             :     }
      94       14093 :     OPENSSL_free(a);
      95             : }
      96             : 
      97       44514 : int BUF_MEM_grow(BUF_MEM *str, size_t len)
      98             : {
      99             :     char *ret;
     100             :     size_t n;
     101             : 
     102       44514 :     if (str->length >= len) {
     103        3442 :         str->length = len;
     104        3442 :         return (len);
     105             :     }
     106       41072 :     if (str->max >= len) {
     107       25152 :         memset(&str->data[str->length], 0, len - str->length);
     108       25152 :         str->length = len;
     109       25152 :         return (len);
     110             :     }
     111             :     /* This limit is sufficient to ensure (len+3)/3*4 < 2**31 */
     112       15920 :     if (len > LIMIT_BEFORE_EXPANSION) {
     113           0 :         BUFerr(BUF_F_BUF_MEM_GROW, ERR_R_MALLOC_FAILURE);
     114           0 :         return 0;
     115             :     }
     116       15920 :     n = (len + 3) / 3 * 4;
     117       15920 :     if (str->data == NULL)
     118       11072 :         ret = OPENSSL_malloc(n);
     119             :     else
     120        4848 :         ret = OPENSSL_realloc(str->data, n);
     121       15920 :     if (ret == NULL) {
     122           0 :         BUFerr(BUF_F_BUF_MEM_GROW, ERR_R_MALLOC_FAILURE);
     123             :         len = 0;
     124             :     } else {
     125       15920 :         str->data = ret;
     126       15920 :         str->max = n;
     127       15920 :         memset(&str->data[str->length], 0, len - str->length);
     128       15920 :         str->length = len;
     129             :     }
     130       15920 :     return (len);
     131             : }
     132             : 
     133       24884 : int BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
     134             : {
     135             :     char *ret;
     136             :     size_t n;
     137             : 
     138       24884 :     if (str->length >= len) {
     139        8771 :         memset(&str->data[len], 0, str->length - len);
     140        8771 :         str->length = len;
     141        8771 :         return (len);
     142             :     }
     143       16113 :     if (str->max >= len) {
     144       12386 :         memset(&str->data[str->length], 0, len - str->length);
     145       12386 :         str->length = len;
     146       12386 :         return (len);
     147             :     }
     148             :     /* This limit is sufficient to ensure (len+3)/3*4 < 2**31 */
     149        3727 :     if (len > LIMIT_BEFORE_EXPANSION) {
     150           0 :         BUFerr(BUF_F_BUF_MEM_GROW_CLEAN, ERR_R_MALLOC_FAILURE);
     151           0 :         return 0;
     152             :     }
     153        3727 :     n = (len + 3) / 3 * 4;
     154        3727 :     if (str->data == NULL)
     155        2248 :         ret = OPENSSL_malloc(n);
     156             :     else
     157        1479 :         ret = OPENSSL_realloc_clean(str->data, str->max, n);
     158        3727 :     if (ret == NULL) {
     159           0 :         BUFerr(BUF_F_BUF_MEM_GROW_CLEAN, ERR_R_MALLOC_FAILURE);
     160             :         len = 0;
     161             :     } else {
     162        3727 :         str->data = ret;
     163        3727 :         str->max = n;
     164        3727 :         memset(&str->data[str->length], 0, len - str->length);
     165        3727 :         str->length = len;
     166             :     }
     167        3727 :     return (len);
     168             : }
     169             : 
     170           0 : void BUF_reverse(unsigned char *out, const unsigned char *in, size_t size)
     171             : {
     172             :     size_t i;
     173           0 :     if (in) {
     174           0 :         out += size - 1;
     175           0 :         for (i = 0; i < size; i++)
     176           0 :             *out-- = *in++;
     177             :     } else {
     178             :         unsigned char *q;
     179             :         char c;
     180           0 :         q = out + size - 1;
     181           0 :         for (i = 0; i < size / 2; i++) {
     182           0 :             c = *q;
     183           0 :             *q-- = *out;
     184           0 :             *out++ = c;
     185             :         }
     186             :     }
     187           0 : }

Generated by: LCOV version 1.10