Home | History | Annotate | Download | only in libavb
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Permission is hereby granted, free of charge, to any person
      5  * obtaining a copy of this software and associated documentation
      6  * files (the "Software"), to deal in the Software without
      7  * restriction, including without limitation the rights to use, copy,
      8  * modify, merge, publish, distribute, sublicense, and/or sell copies
      9  * of the Software, and to permit persons to whom the Software is
     10  * furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be
     13  * included in all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
     19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
     20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     22  * SOFTWARE.
     23  */
     24 
     25 #if !defined(AVB_INSIDE_LIBAVB_H) && !defined(AVB_COMPILATION)
     26 #error "Never include this file directly, include libavb.h instead."
     27 #endif
     28 
     29 #ifndef AVB_UTIL_H_
     30 #define AVB_UTIL_H_
     31 
     32 #include "avb_sysdeps.h"
     33 
     34 #ifdef __cplusplus
     35 extern "C" {
     36 #endif
     37 
     38 #define AVB_STRINGIFY(x) #x
     39 #define AVB_TO_STRING(x) AVB_STRINGIFY(x)
     40 
     41 #ifdef AVB_ENABLE_DEBUG
     42 /* Aborts the program if |expr| is false.
     43  *
     44  * This has no effect unless AVB_ENABLE_DEBUG is defined.
     45  */
     46 #define avb_assert(expr)                     \
     47   do {                                       \
     48     if (!(expr)) {                           \
     49       avb_fatal("assert fail: " #expr "\n"); \
     50     }                                        \
     51   } while (0)
     52 #else
     53 #define avb_assert(expr)
     54 #endif
     55 
     56 /* Aborts the program if reached.
     57  *
     58  * This has no effect unless AVB_ENABLE_DEBUG is defined.
     59  */
     60 #ifdef AVB_ENABLE_DEBUG
     61 #define avb_assert_not_reached()         \
     62   do {                                   \
     63     avb_fatal("assert_not_reached()\n"); \
     64   } while (0)
     65 #else
     66 #define avb_assert_not_reached()
     67 #endif
     68 
     69 /* Aborts the program if |addr| is not word-aligned.
     70  *
     71  * This has no effect unless AVB_ENABLE_DEBUG is defined.
     72  */
     73 #define avb_assert_aligned(addr) \
     74   avb_assert((((uintptr_t)addr) & (AVB_ALIGNMENT_SIZE - 1)) == 0)
     75 
     76 #ifdef AVB_ENABLE_DEBUG
     77 /* Print functions, used for diagnostics.
     78  *
     79  * These have no effect unless AVB_ENABLE_DEBUG is defined.
     80  */
     81 #define avb_debug(message)              \
     82   do {                                  \
     83     avb_printv(avb_basename(__FILE__),  \
     84                ":",                     \
     85                AVB_TO_STRING(__LINE__), \
     86                ": DEBUG: ",             \
     87                message,                 \
     88                NULL);                   \
     89   } while (0)
     90 #define avb_debugv(message, ...)        \
     91   do {                                  \
     92     avb_printv(avb_basename(__FILE__),  \
     93                ":",                     \
     94                AVB_TO_STRING(__LINE__), \
     95                ": DEBUG: ",             \
     96                message,                 \
     97                ##__VA_ARGS__);          \
     98   } while (0)
     99 #else
    100 #define avb_debug(message)
    101 #define avb_debugv(message, ...)
    102 #endif
    103 
    104 /* Prints out a message. This is typically used if a runtime-error
    105  * occurs.
    106  */
    107 #define avb_error(message)              \
    108   do {                                  \
    109     avb_printv(avb_basename(__FILE__),  \
    110                ":",                     \
    111                AVB_TO_STRING(__LINE__), \
    112                ": ERROR: ",             \
    113                message,                 \
    114                NULL);                   \
    115   } while (0)
    116 #define avb_errorv(message, ...)        \
    117   do {                                  \
    118     avb_printv(avb_basename(__FILE__),  \
    119                ":",                     \
    120                AVB_TO_STRING(__LINE__), \
    121                ": ERROR: ",             \
    122                message,                 \
    123                ##__VA_ARGS__);          \
    124   } while (0)
    125 
    126 /* Prints out a message and calls avb_abort().
    127  */
    128 #define avb_fatal(message)              \
    129   do {                                  \
    130     avb_printv(avb_basename(__FILE__),  \
    131                ":",                     \
    132                AVB_TO_STRING(__LINE__), \
    133                ": FATAL: ",             \
    134                message,                 \
    135                NULL);                   \
    136     avb_abort();                        \
    137   } while (0)
    138 #define avb_fatalv(message, ...)        \
    139   do {                                  \
    140     avb_printv(avb_basename(__FILE__),  \
    141                ":",                     \
    142                AVB_TO_STRING(__LINE__), \
    143                ": FATAL: ",             \
    144                message,                 \
    145                ##__VA_ARGS__);          \
    146     avb_abort();                        \
    147   } while (0)
    148 
    149 /* Converts a 32-bit unsigned integer from big-endian to host byte order. */
    150 uint32_t avb_be32toh(uint32_t in) AVB_ATTR_WARN_UNUSED_RESULT;
    151 
    152 /* Converts a 64-bit unsigned integer from big-endian to host byte order. */
    153 uint64_t avb_be64toh(uint64_t in) AVB_ATTR_WARN_UNUSED_RESULT;
    154 
    155 /* Converts a 32-bit unsigned integer from host to big-endian byte order. */
    156 uint32_t avb_htobe32(uint32_t in) AVB_ATTR_WARN_UNUSED_RESULT;
    157 
    158 /* Converts a 64-bit unsigned integer from host to big-endian byte order. */
    159 uint64_t avb_htobe64(uint64_t in) AVB_ATTR_WARN_UNUSED_RESULT;
    160 
    161 /* Compare |n| bytes starting at |s1| with |s2| and return 0 if they
    162  * match, 1 if they don't.  Returns 0 if |n|==0, since no bytes
    163  * mismatched.
    164  *
    165  * Time taken to perform the comparison is only dependent on |n| and
    166  * not on the relationship of the match between |s1| and |s2|.
    167  *
    168  * Note that unlike avb_memcmp(), this only indicates inequality, not
    169  * whether |s1| is less than or greater than |s2|.
    170  */
    171 int avb_safe_memcmp(const void* s1,
    172                     const void* s2,
    173                     size_t n) AVB_ATTR_WARN_UNUSED_RESULT;
    174 
    175 /* Adds |value_to_add| to |value| with overflow protection.
    176  *
    177  * Returns false if the addition overflows, true otherwise. In either
    178  * case, |value| is always modified.
    179  */
    180 bool avb_safe_add_to(uint64_t* value,
    181                      uint64_t value_to_add) AVB_ATTR_WARN_UNUSED_RESULT;
    182 
    183 /* Adds |a| and |b| with overflow protection, returning the value in
    184  * |out_result|.
    185  *
    186  * It's permissible to pass NULL for |out_result| if you just want to
    187  * check that the addition would not overflow.
    188  *
    189  * Returns false if the addition overflows, true otherwise.
    190  */
    191 bool avb_safe_add(uint64_t* out_result,
    192                   uint64_t a,
    193                   uint64_t b) AVB_ATTR_WARN_UNUSED_RESULT;
    194 
    195 /* Checks if |num_bytes| data at |data| is a valid UTF-8
    196  * string. Returns true if valid UTF-8, false otherwise.
    197  */
    198 bool avb_validate_utf8(const uint8_t* data,
    199                        size_t num_bytes) AVB_ATTR_WARN_UNUSED_RESULT;
    200 
    201 /* Concatenates |str1| (of |str1_len| bytes) and |str2| (of |str2_len|
    202  * bytes) and puts the result in |buf| which holds |buf_size|
    203  * bytes. The result is also guaranteed to be NUL terminated. Fail if
    204  * there is not enough room in |buf| for the resulting string plus
    205  * terminating NUL byte.
    206  *
    207  * Returns true if the operation succeeds, false otherwise.
    208  */
    209 bool avb_str_concat(char* buf,
    210                     size_t buf_size,
    211                     const char* str1,
    212                     size_t str1_len,
    213                     const char* str2,
    214                     size_t str2_len);
    215 
    216 /* Like avb_malloc_() but prints a error using avb_error() if memory
    217  * allocation fails.
    218  */
    219 void* avb_malloc(size_t size) AVB_ATTR_WARN_UNUSED_RESULT;
    220 
    221 /* Like avb_malloc() but sets the memory with zeroes. */
    222 void* avb_calloc(size_t size) AVB_ATTR_WARN_UNUSED_RESULT;
    223 
    224 /* Duplicates a NUL-terminated string. Returns NULL on OOM. */
    225 char* avb_strdup(const char* str) AVB_ATTR_WARN_UNUSED_RESULT;
    226 
    227 /* Duplicates a NULL-terminated array of NUL-terminated strings by
    228  * concatenating them. The returned string will be
    229  * NUL-terminated. Returns NULL on OOM.
    230  */
    231 char* avb_strdupv(const char* str,
    232                   ...) AVB_ATTR_WARN_UNUSED_RESULT AVB_ATTR_SENTINEL;
    233 
    234 /* Finds the first occurrence of |needle| in the string |haystack|
    235  * where both strings are NUL-terminated strings. The terminating NUL
    236  * bytes are not compared.
    237  *
    238  * Returns NULL if not found, otherwise points into |haystack| for the
    239  * first occurrence of |needle|.
    240  */
    241 const char* avb_strstr(const char* haystack,
    242                        const char* needle) AVB_ATTR_WARN_UNUSED_RESULT;
    243 
    244 /* Finds the first occurrence of |str| in the NULL-terminated string
    245  * array |strings|. Each element in |strings| must be
    246  * NUL-terminated. The string given by |str| need not be
    247  * NUL-terminated but its size must be given in |str_size|.
    248  *
    249  * Returns NULL if not found, otherwise points into |strings| for the
    250  * first occurrence of |str|.
    251  */
    252 const char* avb_strv_find_str(const char* const* strings,
    253                               const char* str,
    254                               size_t str_size);
    255 
    256 /* Replaces all occurrences of |search| with |replace| in |str|.
    257  *
    258  * Returns a newly allocated string or NULL if out of memory.
    259  */
    260 char* avb_replace(const char* str,
    261                   const char* search,
    262                   const char* replace) AVB_ATTR_WARN_UNUSED_RESULT;
    263 
    264 /* Calculates the CRC-32 for data in |buf| of size |buf_size|. */
    265 uint32_t avb_crc32(const uint8_t* buf, size_t buf_size);
    266 
    267 /* Returns the basename of |str|. This is defined as the last path
    268  * component, assuming the normal POSIX separator '/'. If there are no
    269  * separators, returns |str|.
    270  */
    271 const char* avb_basename(const char* str);
    272 
    273 /* Converts any ascii lowercase characters in |str| to uppercase in-place.
    274  * |str| must be NUL-terminated and valid UTF-8.
    275  */
    276 void avb_uppercase(char* str);
    277 
    278 /* Converts |data_len| bytes of |data| to hex and returns the result. Returns
    279  * NULL on OOM. Caller must free the returned string with avb_free.
    280  */
    281 char* avb_bin2hex(const uint8_t* data, size_t data_len);
    282 
    283 #ifdef __cplusplus
    284 }
    285 #endif
    286 
    287 #endif /* AVB_UTIL_H_ */
    288