Browse Source

Properly format errnos in _json_c_strerror

The function _json_c_strerror does not properly format unknown errnos.
The int to ascii loop ignores the leading digit if the number can be
divided by 10 and if an errno has been formatted, shorter errnos would
not properly terminate the newly created string, showing the ending
numbers of the previous output.

A test case has been added to show these effects.

Since this function has been introduced for tests, the effect of this on
real life code is basically non-existing. First an environment variable
has to be set to activate this strerror code and second an unknown errno
would have to be encountered.
tags/json-c-0.16-20220414
Tobias Stoeckmann 5 years ago
parent
commit
4298431150
5 changed files with 18 additions and 2 deletions
  1. +2
    -1
      strerror_override.c
  2. +2
    -1
      tests/CMakeLists.txt
  3. +11
    -0
      tests/test_strerror.c
  4. +2
    -0
      tests/test_strerror.expected
  5. +1
    -0
      tests/test_strerror.test

+ 2
- 1
strerror_override.c View File

@@ -94,7 +94,7 @@ char *_json_c_strerror(int errno_in)
}

// It's not one of the known errno values, return the numeric value.
for (ii = 0; errno_in > 10; errno_in /= 10, ii++)
for (ii = 0; errno_in >= 10; errno_in /= 10, ii++)
{
digbuf[ii] = "0123456789"[(errno_in % 10)];
}
@@ -105,5 +105,6 @@ char *_json_c_strerror(int errno_in)
{
errno_buf[start_idx] = digbuf[ii];
}
errno_buf[start_idx] = '\0';
return errno_buf;
}

+ 2
- 1
tests/CMakeLists.txt View File

@@ -32,12 +32,13 @@ foreach(TESTNAME
test_printbuf
test_set_serializer
test_set_value
test_strerror
test_util_file
test_visit
test_object_iterator)

add_executable(${TESTNAME} ${TESTNAME}.c)
if(${TESTNAME} STREQUAL test_util_file)
if(${TESTNAME} STREQUAL test_strerror OR ${TESTNAME} STREQUAL test_util_file)
# For output consistency, we need _json_c_strerror() in some tests:
target_sources(${TESTNAME} PRIVATE ../strerror_override.c)
endif()


+ 11
- 0
tests/test_strerror.c View File

@@ -0,0 +1,11 @@
#include "strerror_override.h"
#include "strerror_override_private.h"

#include <stdio.h>

int main(int argc, char **argv)
{
puts(strerror(10000));
puts(strerror(999));
return 0;
}

+ 2
- 0
tests/test_strerror.expected View File

@@ -0,0 +1,2 @@
ERRNO=10000
ERRNO=999

+ 1
- 0
tests/test_strerror.test View File

@@ -0,0 +1 @@
test_basic.test

Loading…
Cancel
Save