Home | History | Annotate | Line # | Download | only in internal
      1 /*
      2  * Copyright (c) 2014-2019 Pavel Kalvoda <me (at) pavelkalvoda.com>
      3  *
      4  * libcbor is free software; you can redistribute it and/or modify
      5  * it under the terms of the MIT license. See LICENSE for details.
      6  */
      7 
      8 #include "memory_utils.h"
      9 #include "cbor/common.h"
     10 
     11 // TODO: Consider builtins
     12 // (https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html)
     13 
     14 /** Highest on bit position */
     15 size_t _cbor_highest_bit(size_t number) {
     16   size_t bit = 0;
     17   while (number != 0) {
     18     bit++;
     19     number >>= 1;
     20   }
     21 
     22   return bit;
     23 }
     24 
     25 bool _cbor_safe_to_multiply(size_t a, size_t b) {
     26   return _cbor_highest_bit(a) + _cbor_highest_bit(b) <= sizeof(size_t) * 8;
     27 }
     28 
     29 void* _cbor_alloc_multiple(size_t item_size, size_t item_count) {
     30   if (_cbor_safe_to_multiply(item_size, item_count)) {
     31     return _CBOR_MALLOC(item_size * item_count);
     32   } else {
     33     return NULL;
     34   }
     35 }
     36 
     37 void* _cbor_realloc_multiple(void* pointer, size_t item_size,
     38                              size_t item_count) {
     39   if (_cbor_safe_to_multiply(item_size, item_count)) {
     40     return _CBOR_REALLOC(pointer, item_size * item_count);
     41   } else {
     42     return NULL;
     43   }
     44 }
     45