]> git.ipfire.org Git - thirdparty/json-c.git/commitdiff
Properly format errnos in _json_c_strerror 663/head
authorTobias Stoeckmann <tobias@stoeckmann.org>
Sat, 22 Aug 2020 09:35:50 +0000 (11:35 +0200)
committerTobias Stoeckmann <tobias@stoeckmann.org>
Sat, 22 Aug 2020 09:35:50 +0000 (11:35 +0200)
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.

strerror_override.c
tests/CMakeLists.txt
tests/test_strerror.c [new file with mode: 0644]
tests/test_strerror.expected [new file with mode: 0644]
tests/test_strerror.test [new symlink]

index 7a262f7bfc57a1dbd1402e9e68a4c5b7c4c660f5..a3dd377a3df11fe55c269368d090385232fbdf5d 100644 (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;
 }
index 125f615765aa58bc363a0fedaf0878977f6c2689..0c5c26e910728a1c0d461dd80141fd4c60620a3d 100644 (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()
diff --git a/tests/test_strerror.c b/tests/test_strerror.c
new file mode 100644 (file)
index 0000000..1780564
--- /dev/null
@@ -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;
+}
diff --git a/tests/test_strerror.expected b/tests/test_strerror.expected
new file mode 100644 (file)
index 0000000..b6b3bb6
--- /dev/null
@@ -0,0 +1,2 @@
+ERRNO=10000
+ERRNO=999
diff --git a/tests/test_strerror.test b/tests/test_strerror.test
new file mode 120000 (symlink)
index 0000000..58a13f4
--- /dev/null
@@ -0,0 +1 @@
+test_basic.test
\ No newline at end of file