LCOV - code coverage report
Current view: top level - utils - s2n_safety_macros.h (source / functions) Hit Total Coverage
Test: unit_test_coverage.info Lines: 62 62 100.0 %
Date: 2025-08-15 07:28:39 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : 
       2                 :            : /*
       3                 :            :  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
       4                 :            :  *
       5                 :            :  * Licensed under the Apache License, Version 2.0 (the "License").
       6                 :            :  * You may not use this file except in compliance with the License.
       7                 :            :  * A copy of the License is located at
       8                 :            :  *
       9                 :            :  *  http://aws.amazon.com/apache2.0
      10                 :            :  *
      11                 :            :  * or in the "license" file accompanying this file. This file is distributed
      12                 :            :  * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
      13                 :            :  * express or implied. See the License for the specific language governing
      14                 :            :  * permissions and limitations under the License.
      15                 :            :  */
      16                 :            : 
      17                 :            : #pragma once
      18                 :            : 
      19                 :            : /**
      20                 :            :  * DO NOT DIRECTLY MODIFY THIS FILE:
      21                 :            :  *
      22                 :            :  * The code in this file is generated from scripts/s2n_safety_macros.py and any modifications
      23                 :            :  * should be in there.
      24                 :            :  */
      25                 :            : 
      26                 :            : /* clang-format off */
      27                 :            : 
      28                 :            : #include "error/s2n_errno.h"
      29                 :            : #include "utils/s2n_ensure.h"
      30                 :            : #include "utils/s2n_result.h"
      31                 :            : 
      32                 :            : /**
      33                 :            :  * The goal of s2n_safety is to provide helpers to perform common
      34                 :            :  * checks, which help with code readability.
      35                 :            :  */
      36                 :            : 
      37                 :            : /* Success signal value for OpenSSL functions */
      38                 :            : #define _OSSL_SUCCESS 1
      39                 :            : 
      40                 :            : /**
      41                 :            :  * Sets the global `s2n_errno` to `error` and returns with an `S2N_RESULT_ERROR`
      42                 :            :  */
      43                 :     643744 : #define RESULT_BAIL(error)                                     do { _S2N_ERROR((error)); __S2N_ENSURE_CHECKED_RETURN(S2N_RESULT_ERROR); } while (0)
      44                 :            : 
      45                 :            : /**
      46                 :            :  * Ensures the `condition` is `true`, otherwise the function will `RESULT_BAIL` with `error`
      47                 :            :  */
      48                 :   30696613 : #define RESULT_ENSURE(condition, error)                        __S2N_ENSURE((condition), RESULT_BAIL(error))
      49                 :            : 
      50                 :            : /**
      51                 :            :  * Ensures the `condition` is `true`, otherwise the function will `RESULT_BAIL` with `error`
      52                 :            :  *
      53                 :            :  * NOTE: The condition will _only_ be checked when the code is compiled in debug mode.
      54                 :            :  *       In release mode, the check is removed.
      55                 :            :  */
      56                 : 8984464210 : #define RESULT_DEBUG_ENSURE(condition, error)                  __S2N_ENSURE_DEBUG((condition), RESULT_BAIL(error))
      57                 :            : 
      58                 :            : /**
      59                 :            :  * Ensures `s2n_result_is_ok(result)`, otherwise the function will `RESULT_BAIL` with `error`
      60                 :            :  *
      61                 :            :  * This can be useful for overriding the global `s2n_errno`
      62                 :            :  */
      63                 :         82 : #define RESULT_ENSURE_OK(result, error)                        __S2N_ENSURE(s2n_result_is_ok(result), RESULT_BAIL(error))
      64                 :            : 
      65                 :            : /**
      66                 :            :  * Ensures `a` is greater than or equal to `b`, otherwise the function will `RESULT_BAIL` with a `S2N_ERR_SAFETY` error
      67                 :            :  */
      68                 :   17097396 : #define RESULT_ENSURE_GTE(a, b)                                __S2N_ENSURE((a) >= (b), RESULT_BAIL(S2N_ERR_SAFETY))
      69                 :            : 
      70                 :            : /**
      71                 :            :  * Ensures `a` is less than or equal to `b`, otherwise the function will `RESULT_BAIL` with a `S2N_ERR_SAFETY` error
      72                 :            :  */
      73                 :   16709476 : #define RESULT_ENSURE_LTE(a, b)                                __S2N_ENSURE((a) <= (b), RESULT_BAIL(S2N_ERR_SAFETY))
      74                 :            : 
      75                 :            : /**
      76                 :            :  * Ensures `a` is greater than `b`, otherwise the function will `RESULT_BAIL` with a `S2N_ERR_SAFETY` error
      77                 :            :  */
      78                 :     395170 : #define RESULT_ENSURE_GT(a, b)                                 __S2N_ENSURE((a) > (b), RESULT_BAIL(S2N_ERR_SAFETY))
      79                 :            : 
      80                 :            : /**
      81                 :            :  * Ensures `a` is less than `b`, otherwise the function will `RESULT_BAIL` with a `S2N_ERR_SAFETY` error
      82                 :            :  */
      83                 :      92177 : #define RESULT_ENSURE_LT(a, b)                                 __S2N_ENSURE((a) < (b), RESULT_BAIL(S2N_ERR_SAFETY))
      84                 :            : 
      85                 :            : /**
      86                 :            :  * Ensures `a` is equal to `b`, otherwise the function will `RESULT_BAIL` with a `S2N_ERR_SAFETY` error
      87                 :            :  */
      88                 :  159663943 : #define RESULT_ENSURE_EQ(a, b)                                 __S2N_ENSURE((a) == (b), RESULT_BAIL(S2N_ERR_SAFETY))
      89                 :            : 
      90                 :            : /**
      91                 :            :  * Ensures `a` is not equal to `b`, otherwise the function will `RESULT_BAIL` with a `S2N_ERR_SAFETY` error
      92                 :            :  */
      93                 :    8109302 : #define RESULT_ENSURE_NE(a, b)                                 __S2N_ENSURE((a) != (b), RESULT_BAIL(S2N_ERR_SAFETY))
      94                 :            : 
      95                 :            : /**
      96                 :            :  * Ensures `min <= n <= max`, otherwise the function will `RESULT_BAIL` with `S2N_ERR_SAFETY`
      97                 :            :  */
      98                 :            : #define RESULT_ENSURE_INCLUSIVE_RANGE(min, n, max)              \
      99                 :        386 :         do { \
     100                 :        386 :             __typeof(n) __tmp_n = ( n ); \
     101                 :        386 :             __typeof(n) __tmp_min = ( min ); \
     102                 :        386 :             __typeof(n) __tmp_max = ( max ); \
     103                 :        386 :             RESULT_ENSURE_GTE(__tmp_n, __tmp_min); \
     104                 :        386 :             RESULT_ENSURE_LTE(__tmp_n, __tmp_max); \
     105                 :        386 :         } while(0)
     106                 :            : 
     107                 :            : /**
     108                 :            :  * Ensures `min < n < max`, otherwise the function will `RESULT_BAIL` with `S2N_ERR_SAFETY`
     109                 :            :  */
     110                 :            : #define RESULT_ENSURE_EXCLUSIVE_RANGE(min, n, max)              \
     111                 :            :         do { \
     112                 :            :             __typeof(n) __tmp_n = ( n ); \
     113                 :            :             __typeof(n) __tmp_min = ( min ); \
     114                 :            :             __typeof(n) __tmp_max = ( max ); \
     115                 :            :             RESULT_ENSURE_GT(__tmp_n, __tmp_min); \
     116                 :            :             RESULT_ENSURE_LT(__tmp_n, __tmp_max); \
     117                 :            :         } while(0)
     118                 :            : 
     119                 :            : /**
     120                 :            :  * Ensures `x` is a readable reference, otherwise the function will `RESULT_BAIL` with `S2N_ERR_NULL`
     121                 :            :  */
     122                 : 2061568956 : #define RESULT_ENSURE_REF(x)                                   __S2N_ENSURE(S2N_OBJECT_PTR_IS_READABLE(x), RESULT_BAIL(S2N_ERR_NULL))
     123                 :            : 
     124                 :            : /**
     125                 :            :  * Ensures `x` is a mutable reference, otherwise the function will `RESULT_BAIL` with `S2N_ERR_NULL`
     126                 :            :  */
     127                 :   10552270 : #define RESULT_ENSURE_MUT(x)                                   __S2N_ENSURE(S2N_OBJECT_PTR_IS_WRITABLE(x), RESULT_BAIL(S2N_ERR_NULL))
     128                 :            : 
     129                 :            : /**
     130                 :            :  * Ensures the `result` is `S2N_RESULT_OK`, otherwise the function will return an error signal
     131                 :            :  *
     132                 :            :  * `RESULT_PRECONDITION` should be used at the beginning of a function to make assertions about
     133                 :            :  * the provided arguments. By default, it is functionally equivalent to `RESULT_GUARD(result)`
     134                 :            :  * but can be altered by a testing environment to provide additional guarantees.
     135                 :            :  */
     136                 :     917485 : #define RESULT_PRECONDITION(result)                            RESULT_GUARD(__S2N_ENSURE_PRECONDITION((result)))
     137                 :            : 
     138                 :            : /**
     139                 :            :  * Ensures the `result` is `S2N_RESULT_OK`, otherwise the function will return an error signal
     140                 :            :  *
     141                 :            :  * NOTE: The condition will _only_ be checked when the code is compiled in debug mode.
     142                 :            :  *       In release mode, the check is removed.
     143                 :            :  *
     144                 :            :  * `RESULT_POSTCONDITION` should be used at the end of a function to make assertions about
     145                 :            :  * the resulting state. In debug mode, it is functionally equivalent to `RESULT_GUARD(result)`.
     146                 :            :  * In production builds, it becomes a no-op. This can also be altered by a testing environment
     147                 :            :  * to provide additional guarantees.
     148                 :            :  */
     149                 :    6974079 : #define RESULT_POSTCONDITION(result)                           RESULT_GUARD(__S2N_ENSURE_POSTCONDITION((result)))
     150                 :            : 
     151                 :            : /**
     152                 :            :  * Performs a safer memcpy.
     153                 :            :  *
     154                 :            :  * The following checks are performed:
     155                 :            :  *
     156                 :            :  * * `destination` is non-null
     157                 :            :  * * `source` is non-null
     158                 :            :  *
     159                 :            :  * Callers will still need to ensure the following:
     160                 :            :  *
     161                 :            :  * * The size of the data pointed to by both the `destination` and `source` parameters,
     162                 :            :  *   shall be at least `len` bytes.
     163                 :            :  */
     164                 :    4913616 : #define RESULT_CHECKED_MEMCPY(destination, source, len)        __S2N_ENSURE_SAFE_MEMMOVE((destination), (source), (len), RESULT_ENSURE_REF)
     165                 :            : 
     166                 :            : /**
     167                 :            :  * Performs a safer memset
     168                 :            :  *
     169                 :            :  * The following checks are performed:
     170                 :            :  *
     171                 :            :  * * `destination` is non-null
     172                 :            :  *
     173                 :            :  * Callers will still need to ensure the following:
     174                 :            :  *
     175                 :            :  * * The size of the data pointed to by the `destination` parameter shall be at least
     176                 :            :  *   `len` bytes.
     177                 :            :  */
     178                 :   13938154 : #define RESULT_CHECKED_MEMSET(destination, value, len)         __S2N_ENSURE_SAFE_MEMSET((destination), (value), (len), RESULT_ENSURE_REF)
     179                 :            : 
     180                 :            : /**
     181                 :            :  * Ensures `s2n_result_is_ok(result)`, otherwise the function will return `S2N_RESULT_ERROR`
     182                 :            :  */
     183                 : 1052379217 : #define RESULT_GUARD(result)                                   __S2N_ENSURE(s2n_result_is_ok(result), __S2N_ENSURE_CHECKED_RETURN(S2N_RESULT_ERROR))
     184                 :            : 
     185                 :            : /**
     186                 :            :  * Ensures `result == _OSSL_SUCCESS`, otherwise the function will `RESULT_BAIL` with `error`
     187                 :            :  */
     188                 :  171546159 : #define RESULT_GUARD_OSSL(result, error)                       __S2N_ENSURE((result) == _OSSL_SUCCESS, RESULT_BAIL(error))
     189                 :            : 
     190                 :            : /**
     191                 :            :  * Ensures `(result) > S2N_FAILURE`, otherwise the function will return `S2N_RESULT_ERROR`
     192                 :            :  */
     193                 :  130172019 : #define RESULT_GUARD_POSIX(result)                             __S2N_ENSURE((result) > S2N_FAILURE, __S2N_ENSURE_CHECKED_RETURN(S2N_RESULT_ERROR))
     194                 :            : 
     195                 :            : /**
     196                 :            :  * Ensures `(result) != NULL`, otherwise the function will return `S2N_RESULT_ERROR`
     197                 :            :  *
     198                 :            :  * Does not set s2n_errno to S2N_ERR_NULL, so is NOT a direct replacement for RESULT_ENSURE_REF.
     199                 :            :  */
     200                 :    9192450 : #define RESULT_GUARD_PTR(result)                               __S2N_ENSURE((result) != NULL, __S2N_ENSURE_CHECKED_RETURN(S2N_RESULT_ERROR))
     201                 :            : 
     202                 :            : /**
     203                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     204                 :            :  *
     205                 :            :  * Sets the global `s2n_errno` to `error` and returns with an `S2N_FAILURE`
     206                 :            :  */
     207                 :      21145 : #define POSIX_BAIL(error)                                     do { _S2N_ERROR((error)); __S2N_ENSURE_CHECKED_RETURN(S2N_FAILURE); } while (0)
     208                 :            : 
     209                 :            : /**
     210                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     211                 :            :  *
     212                 :            :  * Ensures the `condition` is `true`, otherwise the function will `POSIX_BAIL` with `error`
     213                 :            :  */
     214                 :  827993821 : #define POSIX_ENSURE(condition, error)                        __S2N_ENSURE((condition), POSIX_BAIL(error))
     215                 :            : 
     216                 :            : /**
     217                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     218                 :            :  *
     219                 :            :  * Ensures the `condition` is `true`, otherwise the function will `POSIX_BAIL` with `error`
     220                 :            :  *
     221                 :            :  * NOTE: The condition will _only_ be checked when the code is compiled in debug mode.
     222                 :            :  *       In release mode, the check is removed.
     223                 :            :  */
     224                 :            : #define POSIX_DEBUG_ENSURE(condition, error)                  __S2N_ENSURE_DEBUG((condition), POSIX_BAIL(error))
     225                 :            : 
     226                 :            : /**
     227                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     228                 :            :  *
     229                 :            :  * Ensures `(result) > S2N_FAILURE`, otherwise the function will `POSIX_BAIL` with `error`
     230                 :            :  *
     231                 :            :  * This can be useful for overriding the global `s2n_errno`
     232                 :            :  */
     233                 :        545 : #define POSIX_ENSURE_OK(result, error)                        __S2N_ENSURE((result) > S2N_FAILURE, POSIX_BAIL(error))
     234                 :            : 
     235                 :            : /**
     236                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     237                 :            :  *
     238                 :            :  * Ensures `a` is greater than or equal to `b`, otherwise the function will `POSIX_BAIL` with a `S2N_ERR_SAFETY` error
     239                 :            :  */
     240                 :   64336388 : #define POSIX_ENSURE_GTE(a, b)                                __S2N_ENSURE((a) >= (b), POSIX_BAIL(S2N_ERR_SAFETY))
     241                 :            : 
     242                 :            : /**
     243                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     244                 :            :  *
     245                 :            :  * Ensures `a` is less than or equal to `b`, otherwise the function will `POSIX_BAIL` with a `S2N_ERR_SAFETY` error
     246                 :            :  */
     247                 :   11835076 : #define POSIX_ENSURE_LTE(a, b)                                __S2N_ENSURE((a) <= (b), POSIX_BAIL(S2N_ERR_SAFETY))
     248                 :            : 
     249                 :            : /**
     250                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     251                 :            :  *
     252                 :            :  * Ensures `a` is greater than `b`, otherwise the function will `POSIX_BAIL` with a `S2N_ERR_SAFETY` error
     253                 :            :  */
     254                 :     343885 : #define POSIX_ENSURE_GT(a, b)                                 __S2N_ENSURE((a) > (b), POSIX_BAIL(S2N_ERR_SAFETY))
     255                 :            : 
     256                 :            : /**
     257                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     258                 :            :  *
     259                 :            :  * Ensures `a` is less than `b`, otherwise the function will `POSIX_BAIL` with a `S2N_ERR_SAFETY` error
     260                 :            :  */
     261                 :    3651717 : #define POSIX_ENSURE_LT(a, b)                                 __S2N_ENSURE((a) < (b), POSIX_BAIL(S2N_ERR_SAFETY))
     262                 :            : 
     263                 :            : /**
     264                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     265                 :            :  *
     266                 :            :  * Ensures `a` is equal to `b`, otherwise the function will `POSIX_BAIL` with a `S2N_ERR_SAFETY` error
     267                 :            :  */
     268                 :    9046232 : #define POSIX_ENSURE_EQ(a, b)                                 __S2N_ENSURE((a) == (b), POSIX_BAIL(S2N_ERR_SAFETY))
     269                 :            : 
     270                 :            : /**
     271                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     272                 :            :  *
     273                 :            :  * Ensures `a` is not equal to `b`, otherwise the function will `POSIX_BAIL` with a `S2N_ERR_SAFETY` error
     274                 :            :  */
     275                 :    3634019 : #define POSIX_ENSURE_NE(a, b)                                 __S2N_ENSURE((a) != (b), POSIX_BAIL(S2N_ERR_SAFETY))
     276                 :            : 
     277                 :            : /**
     278                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     279                 :            :  *
     280                 :            :  * Ensures `min <= n <= max`, otherwise the function will `POSIX_BAIL` with `S2N_ERR_SAFETY`
     281                 :            :  */
     282                 :            : #define POSIX_ENSURE_INCLUSIVE_RANGE(min, n, max)              \
     283                 :     882067 :         do { \
     284                 :     882067 :             __typeof(n) __tmp_n = ( n ); \
     285                 :     882067 :             __typeof(n) __tmp_min = ( min ); \
     286                 :     882067 :             __typeof(n) __tmp_max = ( max ); \
     287                 :     882067 :             POSIX_ENSURE_GTE(__tmp_n, __tmp_min); \
     288                 :     882067 :             POSIX_ENSURE_LTE(__tmp_n, __tmp_max); \
     289                 :     882067 :         } while(0)
     290                 :            : 
     291                 :            : /**
     292                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     293                 :            :  *
     294                 :            :  * Ensures `min < n < max`, otherwise the function will `POSIX_BAIL` with `S2N_ERR_SAFETY`
     295                 :            :  */
     296                 :            : #define POSIX_ENSURE_EXCLUSIVE_RANGE(min, n, max)              \
     297                 :            :         do { \
     298                 :            :             __typeof(n) __tmp_n = ( n ); \
     299                 :            :             __typeof(n) __tmp_min = ( min ); \
     300                 :            :             __typeof(n) __tmp_max = ( max ); \
     301                 :            :             POSIX_ENSURE_GT(__tmp_n, __tmp_min); \
     302                 :            :             POSIX_ENSURE_LT(__tmp_n, __tmp_max); \
     303                 :            :         } while(0)
     304                 :            : 
     305                 :            : /**
     306                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     307                 :            :  *
     308                 :            :  * Ensures `x` is a readable reference, otherwise the function will `POSIX_BAIL` with `S2N_ERR_NULL`
     309                 :            :  */
     310                 :  995105826 : #define POSIX_ENSURE_REF(x)                                   __S2N_ENSURE(S2N_OBJECT_PTR_IS_READABLE(x), POSIX_BAIL(S2N_ERR_NULL))
     311                 :            : 
     312                 :            : /**
     313                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     314                 :            :  *
     315                 :            :  * Ensures `x` is a mutable reference, otherwise the function will `POSIX_BAIL` with `S2N_ERR_NULL`
     316                 :            :  */
     317                 :   20535734 : #define POSIX_ENSURE_MUT(x)                                   __S2N_ENSURE(S2N_OBJECT_PTR_IS_WRITABLE(x), POSIX_BAIL(S2N_ERR_NULL))
     318                 :            : 
     319                 :            : /**
     320                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     321                 :            :  *
     322                 :            :  * Ensures the `result` is `S2N_RESULT_OK`, otherwise the function will return an error signal
     323                 :            :  *
     324                 :            :  * `POSIX_PRECONDITION` should be used at the beginning of a function to make assertions about
     325                 :            :  * the provided arguments. By default, it is functionally equivalent to `POSIX_GUARD_RESULT(result)`
     326                 :            :  * but can be altered by a testing environment to provide additional guarantees.
     327                 :            :  */
     328                 :  624318263 : #define POSIX_PRECONDITION(result)                            POSIX_GUARD_RESULT(__S2N_ENSURE_PRECONDITION((result)))
     329                 :            : 
     330                 :            : /**
     331                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     332                 :            :  *
     333                 :            :  * Ensures the `result` is `S2N_RESULT_OK`, otherwise the function will return an error signal
     334                 :            :  *
     335                 :            :  * NOTE: The condition will _only_ be checked when the code is compiled in debug mode.
     336                 :            :  *       In release mode, the check is removed.
     337                 :            :  *
     338                 :            :  * `POSIX_POSTCONDITION` should be used at the end of a function to make assertions about
     339                 :            :  * the resulting state. In debug mode, it is functionally equivalent to `POSIX_GUARD_RESULT(result)`.
     340                 :            :  * In production builds, it becomes a no-op. This can also be altered by a testing environment
     341                 :            :  * to provide additional guarantees.
     342                 :            :  */
     343                 :  422565378 : #define POSIX_POSTCONDITION(result)                           POSIX_GUARD_RESULT(__S2N_ENSURE_POSTCONDITION((result)))
     344                 :            : 
     345                 :            : /**
     346                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     347                 :            :  *
     348                 :            :  * Performs a safer memcpy.
     349                 :            :  *
     350                 :            :  * The following checks are performed:
     351                 :            :  *
     352                 :            :  * * `destination` is non-null
     353                 :            :  * * `source` is non-null
     354                 :            :  *
     355                 :            :  * Callers will still need to ensure the following:
     356                 :            :  *
     357                 :            :  * * The size of the data pointed to by both the `destination` and `source` parameters,
     358                 :            :  *   shall be at least `len` bytes.
     359                 :            :  */
     360                 :  127564722 : #define POSIX_CHECKED_MEMCPY(destination, source, len)        __S2N_ENSURE_SAFE_MEMMOVE((destination), (source), (len), POSIX_ENSURE_REF)
     361                 :            : 
     362                 :            : /**
     363                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     364                 :            :  *
     365                 :            :  * Performs a safer memset
     366                 :            :  *
     367                 :            :  * The following checks are performed:
     368                 :            :  *
     369                 :            :  * * `destination` is non-null
     370                 :            :  *
     371                 :            :  * Callers will still need to ensure the following:
     372                 :            :  *
     373                 :            :  * * The size of the data pointed to by the `destination` parameter shall be at least
     374                 :            :  *   `len` bytes.
     375                 :            :  */
     376                 :  116957159 : #define POSIX_CHECKED_MEMSET(destination, value, len)         __S2N_ENSURE_SAFE_MEMSET((destination), (value), (len), POSIX_ENSURE_REF)
     377                 :            : 
     378                 :            : /**
     379                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     380                 :            :  *
     381                 :            :  * Ensures `(result) > S2N_FAILURE`, otherwise the function will return `S2N_FAILURE`
     382                 :            :  */
     383                 : 1107988025 : #define POSIX_GUARD(result)                                   __S2N_ENSURE((result) > S2N_FAILURE, __S2N_ENSURE_CHECKED_RETURN(S2N_FAILURE))
     384                 :            : 
     385                 :            : /**
     386                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     387                 :            :  *
     388                 :            :  * Ensures `result == _OSSL_SUCCESS`, otherwise the function will `POSIX_BAIL` with `error`
     389                 :            :  */
     390                 :   85388879 : #define POSIX_GUARD_OSSL(result, error)                       __S2N_ENSURE((result) == _OSSL_SUCCESS, POSIX_BAIL(error))
     391                 :            : 
     392                 :            : /**
     393                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     394                 :            :  *
     395                 :            :  * Ensures `s2n_result_is_ok(result)`, otherwise the function will return `S2N_FAILURE`
     396                 :            :  */
     397                 : 1101847200 : #define POSIX_GUARD_RESULT(result)                            __S2N_ENSURE(s2n_result_is_ok(result), __S2N_ENSURE_CHECKED_RETURN(S2N_FAILURE))
     398                 :            : 
     399                 :            : /**
     400                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     401                 :            :  *
     402                 :            :  * Ensures `(result) != NULL`, otherwise the function will return `S2N_FAILURE`
     403                 :            :  *
     404                 :            :  * Does not set s2n_errno to S2N_ERR_NULL, so is NOT a direct replacement for POSIX_ENSURE_REF.
     405                 :            :  */
     406                 :       8194 : #define POSIX_GUARD_PTR(result)                               __S2N_ENSURE((result) != NULL, __S2N_ENSURE_CHECKED_RETURN(S2N_FAILURE))
     407                 :            : 
     408                 :            : /**
     409                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     410                 :            :  *
     411                 :            :  * Sets the global `s2n_errno` to `error` and returns with an `NULL`
     412                 :            :  */
     413                 :          7 : #define PTR_BAIL(error)                                       do { _S2N_ERROR((error)); __S2N_ENSURE_CHECKED_RETURN(NULL); } while (0)
     414                 :            : 
     415                 :            : /**
     416                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     417                 :            :  *
     418                 :            :  * Ensures the `condition` is `true`, otherwise the function will `PTR_BAIL` with `error`
     419                 :            :  */
     420                 :       2662 : #define PTR_ENSURE(condition, error)                          __S2N_ENSURE((condition), PTR_BAIL(error))
     421                 :            : 
     422                 :            : /**
     423                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     424                 :            :  *
     425                 :            :  * Ensures the `condition` is `true`, otherwise the function will `PTR_BAIL` with `error`
     426                 :            :  *
     427                 :            :  * NOTE: The condition will _only_ be checked when the code is compiled in debug mode.
     428                 :            :  *       In release mode, the check is removed.
     429                 :            :  */
     430                 :            : #define PTR_DEBUG_ENSURE(condition, error)                    __S2N_ENSURE_DEBUG((condition), PTR_BAIL(error))
     431                 :            : 
     432                 :            : /**
     433                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     434                 :            :  *
     435                 :            :  * Ensures `(result) != NULL`, otherwise the function will `PTR_BAIL` with `error`
     436                 :            :  *
     437                 :            :  * This can be useful for overriding the global `s2n_errno`
     438                 :            :  */
     439                 :            : #define PTR_ENSURE_OK(result, error)                          __S2N_ENSURE((result) != NULL, PTR_BAIL(error))
     440                 :            : 
     441                 :            : /**
     442                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     443                 :            :  *
     444                 :            :  * Ensures `a` is greater than or equal to `b`, otherwise the function will `PTR_BAIL` with a `S2N_ERR_SAFETY` error
     445                 :            :  */
     446                 :   25709225 : #define PTR_ENSURE_GTE(a, b)                                  __S2N_ENSURE((a) >= (b), PTR_BAIL(S2N_ERR_SAFETY))
     447                 :            : 
     448                 :            : /**
     449                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     450                 :            :  *
     451                 :            :  * Ensures `a` is less than or equal to `b`, otherwise the function will `PTR_BAIL` with a `S2N_ERR_SAFETY` error
     452                 :            :  */
     453                 :            : #define PTR_ENSURE_LTE(a, b)                                  __S2N_ENSURE((a) <= (b), PTR_BAIL(S2N_ERR_SAFETY))
     454                 :            : 
     455                 :            : /**
     456                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     457                 :            :  *
     458                 :            :  * Ensures `a` is greater than `b`, otherwise the function will `PTR_BAIL` with a `S2N_ERR_SAFETY` error
     459                 :            :  */
     460                 :            : #define PTR_ENSURE_GT(a, b)                                   __S2N_ENSURE((a) > (b), PTR_BAIL(S2N_ERR_SAFETY))
     461                 :            : 
     462                 :            : /**
     463                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     464                 :            :  *
     465                 :            :  * Ensures `a` is less than `b`, otherwise the function will `PTR_BAIL` with a `S2N_ERR_SAFETY` error
     466                 :            :  */
     467                 :   25709225 : #define PTR_ENSURE_LT(a, b)                                   __S2N_ENSURE((a) < (b), PTR_BAIL(S2N_ERR_SAFETY))
     468                 :            : 
     469                 :            : /**
     470                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     471                 :            :  *
     472                 :            :  * Ensures `a` is equal to `b`, otherwise the function will `PTR_BAIL` with a `S2N_ERR_SAFETY` error
     473                 :            :  */
     474                 :            : #define PTR_ENSURE_EQ(a, b)                                   __S2N_ENSURE((a) == (b), PTR_BAIL(S2N_ERR_SAFETY))
     475                 :            : 
     476                 :            : /**
     477                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     478                 :            :  *
     479                 :            :  * Ensures `a` is not equal to `b`, otherwise the function will `PTR_BAIL` with a `S2N_ERR_SAFETY` error
     480                 :            :  */
     481                 :            : #define PTR_ENSURE_NE(a, b)                                   __S2N_ENSURE((a) != (b), PTR_BAIL(S2N_ERR_SAFETY))
     482                 :            : 
     483                 :            : /**
     484                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     485                 :            :  *
     486                 :            :  * Ensures `min <= n <= max`, otherwise the function will `PTR_BAIL` with `S2N_ERR_SAFETY`
     487                 :            :  */
     488                 :            : #define PTR_ENSURE_INCLUSIVE_RANGE(min, n, max)                \
     489                 :            :         do { \
     490                 :            :             __typeof(n) __tmp_n = ( n ); \
     491                 :            :             __typeof(n) __tmp_min = ( min ); \
     492                 :            :             __typeof(n) __tmp_max = ( max ); \
     493                 :            :             PTR_ENSURE_GTE(__tmp_n, __tmp_min); \
     494                 :            :             PTR_ENSURE_LTE(__tmp_n, __tmp_max); \
     495                 :            :         } while(0)
     496                 :            : 
     497                 :            : /**
     498                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     499                 :            :  *
     500                 :            :  * Ensures `min < n < max`, otherwise the function will `PTR_BAIL` with `S2N_ERR_SAFETY`
     501                 :            :  */
     502                 :            : #define PTR_ENSURE_EXCLUSIVE_RANGE(min, n, max)                \
     503                 :            :         do { \
     504                 :            :             __typeof(n) __tmp_n = ( n ); \
     505                 :            :             __typeof(n) __tmp_min = ( min ); \
     506                 :            :             __typeof(n) __tmp_max = ( max ); \
     507                 :            :             PTR_ENSURE_GT(__tmp_n, __tmp_min); \
     508                 :            :             PTR_ENSURE_LT(__tmp_n, __tmp_max); \
     509                 :            :         } while(0)
     510                 :            : 
     511                 :            : /**
     512                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     513                 :            :  *
     514                 :            :  * Ensures `x` is a readable reference, otherwise the function will `PTR_BAIL` with `S2N_ERR_NULL`
     515                 :            :  */
     516                 :  355436524 : #define PTR_ENSURE_REF(x)                                     __S2N_ENSURE(S2N_OBJECT_PTR_IS_READABLE(x), PTR_BAIL(S2N_ERR_NULL))
     517                 :            : 
     518                 :            : /**
     519                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     520                 :            :  *
     521                 :            :  * Ensures `x` is a mutable reference, otherwise the function will `PTR_BAIL` with `S2N_ERR_NULL`
     522                 :            :  */
     523                 :            : #define PTR_ENSURE_MUT(x)                                     __S2N_ENSURE(S2N_OBJECT_PTR_IS_WRITABLE(x), PTR_BAIL(S2N_ERR_NULL))
     524                 :            : 
     525                 :            : /**
     526                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     527                 :            :  *
     528                 :            :  * Ensures the `result` is `S2N_RESULT_OK`, otherwise the function will return an error signal
     529                 :            :  *
     530                 :            :  * `PTR_PRECONDITION` should be used at the beginning of a function to make assertions about
     531                 :            :  * the provided arguments. By default, it is functionally equivalent to `PTR_GUARD_RESULT(result)`
     532                 :            :  * but can be altered by a testing environment to provide additional guarantees.
     533                 :            :  */
     534                 :       3861 : #define PTR_PRECONDITION(result)                              PTR_GUARD_RESULT(__S2N_ENSURE_PRECONDITION((result)))
     535                 :            : 
     536                 :            : /**
     537                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     538                 :            :  *
     539                 :            :  * Ensures the `result` is `S2N_RESULT_OK`, otherwise the function will return an error signal
     540                 :            :  *
     541                 :            :  * NOTE: The condition will _only_ be checked when the code is compiled in debug mode.
     542                 :            :  *       In release mode, the check is removed.
     543                 :            :  *
     544                 :            :  * `PTR_POSTCONDITION` should be used at the end of a function to make assertions about
     545                 :            :  * the resulting state. In debug mode, it is functionally equivalent to `PTR_GUARD_RESULT(result)`.
     546                 :            :  * In production builds, it becomes a no-op. This can also be altered by a testing environment
     547                 :            :  * to provide additional guarantees.
     548                 :            :  */
     549                 :            : #define PTR_POSTCONDITION(result)                             PTR_GUARD_RESULT(__S2N_ENSURE_POSTCONDITION((result)))
     550                 :            : 
     551                 :            : /**
     552                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     553                 :            :  *
     554                 :            :  * Performs a safer memcpy.
     555                 :            :  *
     556                 :            :  * The following checks are performed:
     557                 :            :  *
     558                 :            :  * * `destination` is non-null
     559                 :            :  * * `source` is non-null
     560                 :            :  *
     561                 :            :  * Callers will still need to ensure the following:
     562                 :            :  *
     563                 :            :  * * The size of the data pointed to by both the `destination` and `source` parameters,
     564                 :            :  *   shall be at least `len` bytes.
     565                 :            :  */
     566                 :        366 : #define PTR_CHECKED_MEMCPY(destination, source, len)          __S2N_ENSURE_SAFE_MEMMOVE((destination), (source), (len), PTR_ENSURE_REF)
     567                 :            : 
     568                 :            : /**
     569                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     570                 :            :  *
     571                 :            :  * Performs a safer memset
     572                 :            :  *
     573                 :            :  * The following checks are performed:
     574                 :            :  *
     575                 :            :  * * `destination` is non-null
     576                 :            :  *
     577                 :            :  * Callers will still need to ensure the following:
     578                 :            :  *
     579                 :            :  * * The size of the data pointed to by the `destination` parameter shall be at least
     580                 :            :  *   `len` bytes.
     581                 :            :  */
     582                 :            : #define PTR_CHECKED_MEMSET(destination, value, len)           __S2N_ENSURE_SAFE_MEMSET((destination), (value), (len), PTR_ENSURE_REF)
     583                 :            : 
     584                 :            : /**
     585                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     586                 :            :  *
     587                 :            :  * Ensures `(result) != NULL`, otherwise the function will return `NULL`
     588                 :            :  */
     589                 :            : #define PTR_GUARD(result)                                     __S2N_ENSURE((result) != NULL, __S2N_ENSURE_CHECKED_RETURN(NULL))
     590                 :            : 
     591                 :            : /**
     592                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     593                 :            :  *
     594                 :            :  * Ensures `result == _OSSL_SUCCESS`, otherwise the function will `PTR_BAIL` with `error`
     595                 :            :  */
     596                 :            : #define PTR_GUARD_OSSL(result, error)                         __S2N_ENSURE((result) == _OSSL_SUCCESS, PTR_BAIL(error))
     597                 :            : 
     598                 :            : /**
     599                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     600                 :            :  *
     601                 :            :  * Ensures `s2n_result_is_ok(result)`, otherwise the function will return `NULL`
     602                 :            :  */
     603                 :     386890 : #define PTR_GUARD_RESULT(result)                              __S2N_ENSURE(s2n_result_is_ok(result), __S2N_ENSURE_CHECKED_RETURN(NULL))
     604                 :            : 
     605                 :            : /**
     606                 :            :  * DEPRECATED: all methods (except those in s2n.h) should return s2n_result.
     607                 :            :  *
     608                 :            :  * Ensures `(result) > S2N_FAILURE`, otherwise the function will return `NULL`
     609                 :            :  */
     610                 :   13956318 : #define PTR_GUARD_POSIX(result)                               __S2N_ENSURE((result) > S2N_FAILURE, __S2N_ENSURE_CHECKED_RETURN(NULL))
     611                 :            : 

Generated by: LCOV version 1.14