tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

csf_common.h (2996B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #ifndef _CSF_COMMON_E58E5677_950A_424c_B6C2_CA180092E6A2_H
      6 #define _CSF_COMMON_E58E5677_950A_424c_B6C2_CA180092E6A2_H
      7 
      8 /*
      9 
     10 This header file defines:
     11 
     12 csf_countof
     13 csf_sprintf
     14 csf_vsprintf
     15 
     16 */
     17 
     18 /*
     19  General security tip: Ensure that "format" is never a user-defined string.
     20  Format should ALWAYS be something that's built into your code, not user
     21  supplied. For example: never write:
     22 
     23  csf_sprintf(buffer, csf_countof(buffer), pUserSuppliedString);
     24 
     25  Instead write:
     26 
     27  csf_sprintf(buffer, csf_countof(buffer), "%s", pUserSuppliedString);
     28 
     29 */
     30 
     31 #ifdef WIN32
     32 #  if !defined(_countof)
     33 #    if !defined(__cplusplus)
     34 #      define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
     35 #    else
     36 extern "C++" {
     37 template <typename _CountofType, size_t _SizeOfArray>
     38 char (*_csf_countof_helper(_CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
     39 #      define _countof(_Array) sizeof(*_csf_countof_helper(_Array))
     40 }
     41 #    endif
     42 #  endif
     43 #else
     44 #  define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
     45 #endif
     46 // csf_countof
     47 
     48 #define csf_countof(anArray) _countof(anArray)
     49 
     50 // csf_sprintf
     51 
     52 #ifdef _WIN32
     53 // Unlike snprintf, sprintf_s guarantees that the buffer will be null-terminated
     54 // (unless the buffer size is zero).
     55 #  define csf_sprintf(/* char* */ buffer,                                   \
     56                      /* size_t */ sizeOfBufferInCharsInclNullTerm,         \
     57                      /* const char * */ format, ...)                       \
     58    _snprintf_s(buffer, sizeOfBufferInCharsInclNullTerm, _TRUNCATE, format, \
     59                __VA_ARGS__)
     60 #else
     61 #  define csf_sprintf(/* char */ buffer,                                    \
     62                      /* size_t */ sizeOfBufferInCharsInclNullTerm,         \
     63                      /* const char * */ format, ...)                       \
     64    snprintf(buffer, sizeOfBufferInCharsInclNullTerm, format, __VA_ARGS__); \
     65    buffer[sizeOfBufferInCharsInclNullTerm - 1] = '\0'
     66 #endif
     67 
     68 // csf_vsprintf
     69 
     70 #ifdef _WIN32
     71 #  define csf_vsprintf(/* char* */ buffer,                                  \
     72                       /* size_t */ sizeOfBufferInCharsInclNullTerm,        \
     73                       /* const char * */ format, /* va_list */ vaList)     \
     74    vsnprintf_s(buffer, sizeOfBufferInCharsInclNullTerm, _TRUNCATE, format, \
     75                vaList);                                                    \
     76    buffer[sizeOfBufferInCharsInclNullTerm - 1] = '\0'
     77 #else
     78 #  define csf_vsprintf(/* char */ buffer,                               \
     79                       /* size_t */ sizeOfBufferInCharsInclNullTerm,    \
     80                       /* const char * */ format, /* va_list */ vaList) \
     81    vsprintf(buffer, format, vaList);                                   \
     82    buffer[sizeOfBufferInCharsInclNullTerm - 1] = '\0'
     83 #endif
     84 
     85 #endif