util: Replace non-threadsafe strerror #24933

pull laanwj wants to merge 5 commits into bitcoin:master from laanwj:2022-04-strerror-threadsafe changing 9 files +69 −20
  1. laanwj commented at 2:26 pm on April 20, 2022: member

    Some uses of non-threadsafe strerror have snuck into the code since they were removed in #4152. Add a wrapper SysErrorString for thread-safe strerror alternatives (with code from NetworkErrorString) and replace all uses of strerror with this.

    Edit: I’ve also added a commit that refactors the code so that buf[] is never read at all if the function fails, making some fragile-looking code unnecessary.

    Edit2: from the linux manpage:

     0ATTRIBUTES
     1       For an explanation of the terms used in this section, see attributes(7).
     2
     3       ┌───────────────────┬───────────────┬─────────────────────────┐
     4       │Interface          │ Attribute     │ Value                   │
     5       ├───────────────────┼───────────────┼─────────────────────────┤
     6       │strerror()         │ Thread safety │ MT-Unsafe race:strerror │
     7       ├───────────────────┼───────────────┼─────────────────────────┤
     8 9       ├───────────────────┼───────────────┼─────────────────────────┤
    10       │strerror_r(),      │ Thread safety │ MT-Safe                 │
    11       │strerror_l()       │               │                         │
    12       └───────────────────┴───────────────┴─────────────────────────┘
    

    As the function can be called from any thread at any time, using a non-thread-safe function is unacceptable.

  2. laanwj added the label Utils/log/libs on Apr 20, 2022
  3. in src/util/syserror.cpp:23 in b24cd432f4 outdated
    16+    char buf[256];
    17+    buf[0] = 0;
    18+    /* Too bad there are two incompatible implementations of the
    19+     * thread-safe strerror. */
    20+    const char *s;
    21+#ifdef STRERROR_R_CHAR_P /* GNU variant can return a pointer outside the passed buffer */
    


    laanwj commented at 2:35 pm on April 20, 2022:

    Thinking of it, shouldn’t we be using errno_t strerror_s( char *buf, rsize_t bufsz, errno_t errnum ); from C11/C++17 here?

    Edit: oh, is that windows-only? Gah…

  4. laanwj force-pushed on Apr 20, 2022
  5. laanwj force-pushed on Apr 20, 2022
  6. laanwj force-pushed on Apr 20, 2022
  7. laanwj force-pushed on Apr 20, 2022
  8. laanwj force-pushed on Apr 20, 2022
  9. laanwj commented at 11:43 am on April 21, 2022: member

    To test on your favorite platform:

    0$ c++ error-test.cpp util/syserror.cpp -o error-test -DHAVE_CONFIG_H -I.
    

    (make sure to define -DHAVE_CONFIG_H, it ’s important that the right implementation is chosen for your platform)

    error-test.cpp:

    0#include <util/syserror.h>
    1
    2#include <iostream>
    3
    4int main()
    5{
    6    for (int i = -200; i < 200; ++i) {
    7        std::cout << SysErrorString(i) << std::endl;
    8    }
    9}
    
  10. jonatack commented at 12:04 pm on April 21, 2022: member
    Concept ACK on removing std::strerror, according to https://en.cppreference.com/w/cpp/string/byte/strerror it “is not required to be thread-safe. Implementations may be returning different pointers to static read-only string literals or may be returning the same pointer over and over, pointing at a static buffer in which strerror places the string” and this pull removes the remaining ones apart from three lines in src/leveldb/util/.
  11. jonatack commented at 12:13 pm on April 21, 2022: member
     0Build Options:
     1  with external callbacks = no
     2  with benchmarks         = no
     3  with tests              = yes
     4  with coverage           = no
     5  with examples           = no
     6  module ecdh             = no
     7  module recovery         = yes
     8  module extrakeys        = yes
     9  module schnorrsig       = yes
    10
    11  asm                     = x86_64
    12  ecmult window size      = 15
    13  ecmult gen prec. bits   = 4
    14
    15  valgrind                = yes
    16  CC                      = clang
    17  CPPFLAGS                =  -DDEBUG_LOCKORDER -DDEBUG_LOCKCONTENTION -DHAVE_CONFIG_H
    18  SECP_CFLAGS             = -O2  -std=c89 -pedantic -Wno-long-long -Wnested-externs -Wshadow -Wstrict-prototypes -Wundef -Wno-overlength-strings -Wall -Wno-unused-function -Wextra -Wcast-align -Wconditional-uninitialized -fvisibility=hidden 
    19  CFLAGS                  = -g -O2
    20  LDFLAGS                 = 
    21
    22Options used to compile and link:
    23  external signer = yes
    24  multiprocess    = no
    25  with experimental syscall sandbox support = yes
    26  with libs       = yes
    27  with wallet     = yes
    28    with sqlite   = yes
    29    with bdb      = yes
    30  with gui / qt   = yes
    31    with qr       = yes
    32  with zmq        = yes
    33  with test       = yes
    34  with fuzz binary = yes
    35  with bench      = yes
    36  with upnp       = yes
    37  with natpmp     = yes
    38  use asm         = yes
    39  USDT tracing    = yes
    40  sanitizers      = 
    41  debug enabled   = yes
    42  gprof enabled   = no
    43  werror          = yes
    44  LTO             = no
    45
    46  target os       = linux-gnu
    47  build os        = linux-gnu
    48
    49  CC              = /usr/bin/ccache clang
    50  CFLAGS          = -pthread -g -O2
    51  CPPFLAGS        =  -DDEBUG -DDEBUG_LOCKORDER -DABORT_ON_FAILED_ASSUME -fmacro-prefix-map=$(abs_top_srcdir)=.   -DHAVE_BUILD_INFO -DPROVIDE_FUZZ_MAIN_FUNCTION -DDEBUG_LOCKORDER -DDEBUG_LOCKCONTENTION -DHAVE_CONFIG_H
    52  CXX             = /usr/bin/ccache clang++ -std=c++20
    53  CXXFLAGS        =   -O0 -g3 -ftrapv -fdebug-prefix-map=$(abs_top_srcdir)=.  -Wstack-protector -fstack-protector-all -fcf-protection=full -fstack-clash-protection  -Wall -Wextra -Wgnu -Wformat -Wformat-security -Wvla -Wshadow-field -Wthread-safety -Wrange-loop-analysis -Wredundant-decls -Wunused-member-function -Wdate-time -Wconditional-uninitialized -Woverloaded-virtual -Wsuggest-override -Wunreachable-code-loop-increment -Wimplicit-fallthrough -Wdocumentation  -Wno-unused-parameter -Wno-self-assign -Werror   
    54  LDFLAGS         =  -lpthread  -Wl,-z,relro -Wl,-z,now -Wl,-z,separate-code -pie   
    55  ARFLAGS         = cr
    
      0Unknown error -200 (-200)
      1Unknown error -199 (-199)
      2Unknown error -198 (-198)
      3Unknown error -197 (-197)
      4Unknown error -196 (-196)
      5Unknown error -195 (-195)
      6Unknown error -194 (-194)
      7Unknown error -193 (-193)
      8Unknown error -192 (-192)
      9Unknown error -191 (-191)
     10Unknown error -190 (-190)
     11Unknown error -189 (-189)
     12Unknown error -188 (-188)
     13Unknown error -187 (-187)
     14Unknown error -186 (-186)
     15Unknown error -185 (-185)
     16Unknown error -184 (-184)
     17Unknown error -183 (-183)
     18Unknown error -182 (-182)
     19Unknown error -181 (-181)
     20Unknown error -180 (-180)
     21Unknown error -179 (-179)
     22Unknown error -178 (-178)
     23Unknown error -177 (-177)
     24Unknown error -176 (-176)
     25Unknown error -175 (-175)
     26Unknown error -174 (-174)
     27Unknown error -173 (-173)
     28Unknown error -172 (-172)
     29Unknown error -171 (-171)
     30Unknown error -170 (-170)
     31Unknown error -169 (-169)
     32Unknown error -168 (-168)
     33Unknown error -167 (-167)
     34Unknown error -166 (-166)
     35Unknown error -165 (-165)
     36Unknown error -164 (-164)
     37Unknown error -163 (-163)
     38Unknown error -162 (-162)
     39Unknown error -161 (-161)
     40Unknown error -160 (-160)
     41Unknown error -159 (-159)
     42Unknown error -158 (-158)
     43Unknown error -157 (-157)
     44Unknown error -156 (-156)
     45Unknown error -155 (-155)
     46Unknown error -154 (-154)
     47Unknown error -153 (-153)
     48Unknown error -152 (-152)
     49Unknown error -151 (-151)
     50Unknown error -150 (-150)
     51Unknown error -149 (-149)
     52Unknown error -148 (-148)
     53Unknown error -147 (-147)
     54Unknown error -146 (-146)
     55Unknown error -145 (-145)
     56Unknown error -144 (-144)
     57Unknown error -143 (-143)
     58Unknown error -142 (-142)
     59Unknown error -141 (-141)
     60Unknown error -140 (-140)
     61Unknown error -139 (-139)
     62Unknown error -138 (-138)
     63Unknown error -137 (-137)
     64Unknown error -136 (-136)
     65Unknown error -135 (-135)
     66Unknown error -134 (-134)
     67Unknown error -133 (-133)
     68Unknown error -132 (-132)
     69Unknown error -131 (-131)
     70Unknown error -130 (-130)
     71Unknown error -129 (-129)
     72Unknown error -128 (-128)
     73Unknown error -127 (-127)
     74Unknown error -126 (-126)
     75Unknown error -125 (-125)
     76Unknown error -124 (-124)
     77Unknown error -123 (-123)
     78Unknown error -122 (-122)
     79Unknown error -121 (-121)
     80Unknown error -120 (-120)
     81Unknown error -119 (-119)
     82Unknown error -118 (-118)
     83Unknown error -117 (-117)
     84Unknown error -116 (-116)
     85Unknown error -115 (-115)
     86Unknown error -114 (-114)
     87Unknown error -113 (-113)
     88Unknown error -112 (-112)
     89Unknown error -111 (-111)
     90Unknown error -110 (-110)
     91Unknown error -109 (-109)
     92Unknown error -108 (-108)
     93Unknown error -107 (-107)
     94Unknown error -106 (-106)
     95Unknown error -105 (-105)
     96Unknown error -104 (-104)
     97Unknown error -103 (-103)
     98Unknown error -102 (-102)
     99Unknown error -101 (-101)
    100Unknown error -100 (-100)
    101Unknown error -99 (-99)
    102Unknown error -98 (-98)
    103Unknown error -97 (-97)
    104Unknown error -96 (-96)
    105Unknown error -95 (-95)
    106Unknown error -94 (-94)
    107Unknown error -93 (-93)
    108Unknown error -92 (-92)
    109Unknown error -91 (-91)
    110Unknown error -90 (-90)
    111Unknown error -89 (-89)
    112Unknown error -88 (-88)
    113Unknown error -87 (-87)
    114Unknown error -86 (-86)
    115Unknown error -85 (-85)
    116Unknown error -84 (-84)
    117Unknown error -83 (-83)
    118Unknown error -82 (-82)
    119Unknown error -81 (-81)
    120Unknown error -80 (-80)
    121Unknown error -79 (-79)
    122Unknown error -78 (-78)
    123Unknown error -77 (-77)
    124Unknown error -76 (-76)
    125Unknown error -75 (-75)
    126Unknown error -74 (-74)
    127Unknown error -73 (-73)
    128Unknown error -72 (-72)
    129Unknown error -71 (-71)
    130Unknown error -70 (-70)
    131Unknown error -69 (-69)
    132Unknown error -68 (-68)
    133Unknown error -67 (-67)
    134Unknown error -66 (-66)
    135Unknown error -65 (-65)
    136Unknown error -64 (-64)
    137Unknown error -63 (-63)
    138Unknown error -62 (-62)
    139Unknown error -61 (-61)
    140Unknown error -60 (-60)
    141Unknown error -59 (-59)
    142Unknown error -58 (-58)
    143Unknown error -57 (-57)
    144Unknown error -56 (-56)
    145Unknown error -55 (-55)
    146Unknown error -54 (-54)
    147Unknown error -53 (-53)
    148Unknown error -52 (-52)
    149Unknown error -51 (-51)
    150Unknown error -50 (-50)
    151Unknown error -49 (-49)
    152Unknown error -48 (-48)
    153Unknown error -47 (-47)
    154Unknown error -46 (-46)
    155Unknown error -45 (-45)
    156Unknown error -44 (-44)
    157Unknown error -43 (-43)
    158Unknown error -42 (-42)
    159Unknown error -41 (-41)
    160Unknown error -40 (-40)
    161Unknown error -39 (-39)
    162Unknown error -38 (-38)
    163Unknown error -37 (-37)
    164Unknown error -36 (-36)
    165Unknown error -35 (-35)
    166Unknown error -34 (-34)
    167Unknown error -33 (-33)
    168Unknown error -32 (-32)
    169Unknown error -31 (-31)
    170Unknown error -30 (-30)
    171Unknown error -29 (-29)
    172Unknown error -28 (-28)
    173Unknown error -27 (-27)
    174Unknown error -26 (-26)
    175Unknown error -25 (-25)
    176Unknown error -24 (-24)
    177Unknown error -23 (-23)
    178Unknown error -22 (-22)
    179Unknown error -21 (-21)
    180Unknown error -20 (-20)
    181Unknown error -19 (-19)
    182Unknown error -18 (-18)
    183Unknown error -17 (-17)
    184Unknown error -16 (-16)
    185Unknown error -15 (-15)
    186Unknown error -14 (-14)
    187Unknown error -13 (-13)
    188Unknown error -12 (-12)
    189Unknown error -11 (-11)
    190Unknown error -10 (-10)
    191Unknown error -9 (-9)
    192Unknown error -8 (-8)
    193Unknown error -7 (-7)
    194Unknown error -6 (-6)
    195Unknown error -5 (-5)
    196Unknown error -4 (-4)
    197Unknown error -3 (-3)
    198Unknown error -2 (-2)
    199Unknown error -1 (-1)
    200Success (0)
    201Operation not permitted (1)
    202No such file or directory (2)
    203No such process (3)
    204Interrupted system call (4)
    205Input/output error (5)
    206No such device or address (6)
    207Argument list too long (7)
    208Exec format error (8)
    209Bad file descriptor (9)
    210No child processes (10)
    211Resource temporarily unavailable (11)
    212Cannot allocate memory (12)
    213Permission denied (13)
    214Bad address (14)
    215Block device required (15)
    216Device or resource busy (16)
    217File exists (17)
    218Invalid cross-device link (18)
    219No such device (19)
    220Not a directory (20)
    221Is a directory (21)
    222Invalid argument (22)
    223Too many open files in system (23)
    224Too many open files (24)
    225Inappropriate ioctl for device (25)
    226Text file busy (26)
    227File too large (27)
    228No space left on device (28)
    229Illegal seek (29)
    230Read-only file system (30)
    231Too many links (31)
    232Broken pipe (32)
    233Numerical argument out of domain (33)
    234Numerical result out of range (34)
    235Resource deadlock avoided (35)
    236File name too long (36)
    237No locks available (37)
    238Function not implemented (38)
    239Directory not empty (39)
    240Too many levels of symbolic links (40)
    241Unknown error 41 (41)
    242No message of desired type (42)
    243Identifier removed (43)
    244Channel number out of range (44)
    245Level 2 not synchronized (45)
    246Level 3 halted (46)
    247Level 3 reset (47)
    248Link number out of range (48)
    249Protocol driver not attached (49)
    250No CSI structure available (50)
    251Level 2 halted (51)
    252Invalid exchange (52)
    253Invalid request descriptor (53)
    254Exchange full (54)
    255No anode (55)
    256Invalid request code (56)
    257Invalid slot (57)
    258Unknown error 58 (58)
    259Bad font file format (59)
    260Device not a stream (60)
    261No data available (61)
    262Timer expired (62)
    263Out of streams resources (63)
    264Machine is not on the network (64)
    265Package not installed (65)
    266Object is remote (66)
    267Link has been severed (67)
    268Advertise error (68)
    269Srmount error (69)
    270Communication error on send (70)
    271Protocol error (71)
    272Multihop attempted (72)
    273RFS specific error (73)
    274Bad message (74)
    275Value too large for defined data type (75)
    276Name not unique on network (76)
    277File descriptor in bad state (77)
    278Remote address changed (78)
    279Can not access a needed shared library (79)
    280Accessing a corrupted shared library (80)
    281.lib section in a.out corrupted (81)
    282Attempting to link in too many shared libraries (82)
    283Cannot exec a shared library directly (83)
    284Invalid or incomplete multibyte or wide character (84)
    285Interrupted system call should be restarted (85)
    286Streams pipe error (86)
    287Too many users (87)
    288Socket operation on non-socket (88)
    289Destination address required (89)
    290Message too long (90)
    291Protocol wrong type for socket (91)
    292Protocol not available (92)
    293Protocol not supported (93)
    294Socket type not supported (94)
    295Operation not supported (95)
    296Protocol family not supported (96)
    297Address family not supported by protocol (97)
    298Address already in use (98)
    299Cannot assign requested address (99)
    300Network is down (100)
    301Network is unreachable (101)
    302Network dropped connection on reset (102)
    303Software caused connection abort (103)
    304Connection reset by peer (104)
    305No buffer space available (105)
    306Transport endpoint is already connected (106)
    307Transport endpoint is not connected (107)
    308Cannot send after transport endpoint shutdown (108)
    309Too many references: cannot splice (109)
    310Connection timed out (110)
    311Connection refused (111)
    312Host is down (112)
    313No route to host (113)
    314Operation already in progress (114)
    315Operation now in progress (115)
    316Stale file handle (116)
    317Structure needs cleaning (117)
    318Not a XENIX named type file (118)
    319No XENIX semaphores available (119)
    320Is a named type file (120)
    321Remote I/O error (121)
    322Disk quota exceeded (122)
    323No medium found (123)
    324Wrong medium type (124)
    325Operation canceled (125)
    326Required key not available (126)
    327Key has expired (127)
    328Key has been revoked (128)
    329Key was rejected by service (129)
    330Owner died (130)
    331State not recoverable (131)
    332Operation not possible due to RF-kill (132)
    333Memory page has hardware error (133)
    334Unknown error 134 (134)
    335Unknown error 135 (135)
    336Unknown error 136 (136)
    337Unknown error 137 (137)
    338Unknown error 138 (138)
    339Unknown error 139 (139)
    340Unknown error 140 (140)
    341Unknown error 141 (141)
    342Unknown error 142 (142)
    343Unknown error 143 (143)
    344Unknown error 144 (144)
    345Unknown error 145 (145)
    346Unknown error 146 (146)
    347Unknown error 147 (147)
    348Unknown error 148 (148)
    349Unknown error 149 (149)
    350Unknown error 150 (150)
    351Unknown error 151 (151)
    352Unknown error 152 (152)
    353Unknown error 153 (153)
    354Unknown error 154 (154)
    355Unknown error 155 (155)
    356Unknown error 156 (156)
    357Unknown error 157 (157)
    358Unknown error 158 (158)
    359Unknown error 159 (159)
    360Unknown error 160 (160)
    361Unknown error 161 (161)
    362Unknown error 162 (162)
    363Unknown error 163 (163)
    364Unknown error 164 (164)
    365Unknown error 165 (165)
    366Unknown error 166 (166)
    367Unknown error 167 (167)
    368Unknown error 168 (168)
    369Unknown error 169 (169)
    370Unknown error 170 (170)
    371Unknown error 171 (171)
    372Unknown error 172 (172)
    373Unknown error 173 (173)
    374Unknown error 174 (174)
    375Unknown error 175 (175)
    376Unknown error 176 (176)
    377Unknown error 177 (177)
    378Unknown error 178 (178)
    379Unknown error 179 (179)
    380Unknown error 180 (180)
    381Unknown error 181 (181)
    382Unknown error 182 (182)
    383Unknown error 183 (183)
    384Unknown error 184 (184)
    385Unknown error 185 (185)
    386Unknown error 186 (186)
    387Unknown error 187 (187)
    388Unknown error 188 (188)
    389Unknown error 189 (189)
    390Unknown error 190 (190)
    391Unknown error 191 (191)
    392Unknown error 192 (192)
    393Unknown error 193 (193)
    394Unknown error 194 (194)
    395Unknown error 195 (195)
    396Unknown error 196 (196)
    397Unknown error 197 (197)
    398Unknown error 198 (198)
    399Unknown error 199 (199)
    
  12. in src/init.cpp:68 in 9d5fa88167 outdated
    64@@ -65,6 +65,7 @@
    65 #include <util/string.h>
    66 #include <util/syscall_sandbox.h>
    67 #include <util/system.h>
    68+#include <util/syserror.h>
    


    jonatack commented at 12:23 pm on April 21, 2022:

    eb68c15a21856f1edf nit, sort if you retouch

    0-#include <util/system.h>
    1 #include <util/syserror.h>
    2+#include <util/system.h>
    

    laanwj commented at 4:41 pm on April 21, 2022:
    Thanks, fixed
  13. in src/util/syserror.cpp:16 in 9d5fa88167 outdated
    11+
    12+#include <cstring>
    13+
    14+std::string SysErrorString(int err)
    15+{
    16+    char buf[256];
    


    jonatack commented at 12:59 pm on April 21, 2022:
    Unsure, but just mentioning that per man strerror: “The GNU C Library uses a buffer of 1024 characters for strerror(). This buffer size therefore should be sufficient to avoid an ERANGE error when calling strerror_r().”

    laanwj commented at 4:27 pm on April 21, 2022:

    Huh. Yeah, would be better to bump it. Though personally I’d say 256 characters should be sufficient for an error message. But maybe some languages with UTF-8 (after all, it’s a locale specific function).

    Edit: Also FWIW we’re robust against errors in strerror. It will just return Unknown error (code) in that case.


    laanwj commented at 4:41 pm on April 21, 2022:
    Bumped in a separate commit.

    jonatack commented at 5:05 pm on April 21, 2022:
    Yes, 1024 seems like a lot. That was how much RAM a Sinclair ZX80 had 😄.
  14. jonatack commented at 1:09 pm on April 21, 2022: member
    ACK 9d5fa881678a code review, at each commit built and tested running error_test on debian testing 5.16.18-1 (2022-03-29) with -DHAVE_CONFIG_H defined, verified in man strerror that the strerror_r() function used here is similar to strerror(), but is thread safe. Tested that both the gnu and posix paths in SysErrorString() work for me locally. Looked up strerror_s in https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strerror-s-strerror-s-wcserror-s-wcserror-s and that it is thread-safe as well.
  15. laanwj force-pushed on Apr 21, 2022
  16. laanwj force-pushed on Apr 21, 2022
  17. jonatack commented at 5:45 pm on April 21, 2022: member
    ACK e3915676b0ac7da4ee58602231d6616a2e0b01ae
  18. prusnak commented at 9:22 pm on April 21, 2022: contributor
    Approach ACK
  19. MarcoFalke commented at 11:20 am on April 26, 2022: member

    What about:

     0diff --git a/test/lint/lint-locale-dependence.py b/test/lint/lint-locale-dependence.py
     1index 2abf1be6b3..837224a1c4 100755
     2--- a/test/lint/lint-locale-dependence.py
     3+++ b/test/lint/lint-locale-dependence.py
     4@@ -144,7 +144,7 @@ LOCALE_DEPENDENT_FUNCTIONS = [
     5     "strcasecmp",
     6     "strcasestr",
     7     "strcoll",      # LC_COLLATE
     8-    #"strerror",
     9+    "strerror",
    10     "strfmon",
    11     "strftime",     # LC_TIME
    12     "strncasecmp",
    
  20. laanwj force-pushed on Apr 28, 2022
  21. laanwj commented at 7:58 am on April 28, 2022: member

    Rebased (to get the Python port of the linter) and added a commit that updates the linter.

    • Added doc comment re NetworkErrorString
    • Updated the copyright year in syserror.* to 2022
  22. laanwj force-pushed on Apr 28, 2022
  23. laanwj force-pushed on Apr 28, 2022
  24. util: Replace non-threadsafe strerror
    Some uses of non-threadsafe `strerror` have snuck into the code since
    they were removed in #4152. Add a wrapper `SysErrorString` for
    thread-safe strerror alternatives and replace all uses of `strerror`
    with this.
    46971c6dbf
  25. util: Use strerror_s for SysErrorString on Windows e7f2f77756
  26. util: Refactor SysErrorString logic
    Deduplicate code and error checks by making sure `s` stays `nullptr`
    in case of error. Return "Unknown error" instead of an empty string in
    this case.
    718da302c7
  27. util: Increase buffer size to 1024 in SysErrorString
    Increase the error message buffer to 1024 as recommended in the manual
    page (Thanks Jon Atack)
    f00fb1265a
  28. test: Add `strerror` to locale-dependence linter
    Add `strerror` to the locale-dependence linter to catch its use. Add
    exemptions for bdb interface code (false positive) and strerror.cpp
    (the only allowed use).
    
    Also fix a bug in the regexp so that `_r` and `_s` variants are detected
    again.
    e3a06a3c6c
  29. laanwj force-pushed on Apr 28, 2022
  30. jonatack commented at 10:34 am on April 28, 2022: member
    ACK e3a06a3c6cbb288ac89a2725cf71ae8adaebf35c
  31. laanwj merged this on May 4, 2022
  32. laanwj closed this on May 4, 2022

  33. sidhujag referenced this in commit c86f6f9120 on May 4, 2022
  34. luke-jr referenced this in commit 74025fa311 on May 21, 2022
  35. luke-jr referenced this in commit c3bcedb66a on May 21, 2022
  36. luke-jr referenced this in commit d0e42a4c00 on May 21, 2022
  37. luke-jr referenced this in commit e80c91e034 on May 21, 2022
  38. luke-jr referenced this in commit ce5dc7c1a3 on May 21, 2022
  39. luke-jr referenced this in commit 3c651702c6 on May 22, 2022
  40. DrahtBot locked this on May 4, 2023

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-19 00:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me