]> granicus.if.org Git - strace/commitdiff
tests: add syslog-success test
authorEugene Syromyatnikov <evgsyr@gmail.com>
Thu, 27 Sep 2018 05:22:32 +0000 (07:22 +0200)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 5 Aug 2019 22:48:31 +0000 (22:48 +0000)
* tests/.gitignore: Add syslog-success
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add syslog-success.test.
* tests/syslog-success.c: New file.
* tests/syslog-success.test: New test.
* tests/syslog.c: Add support for running under syscall retval
injection, add checks.

tests/.gitignore
tests/Makefile.am
tests/syslog-success.c [new file with mode: 0644]
tests/syslog-success.test [new file with mode: 0755]
tests/syslog.c

index 2b0993506320aefc5068978f30ee5c01e51ae968..f5133873d647d2864feae82df3b61e652e19d55d 100644 (file)
@@ -599,6 +599,7 @@ sync_file_range2
 syscallent.i
 sysinfo
 syslog
+syslog-success
 tee
 threads-execve
 time
index 05aede5d3edee6b7859bb7be4d4f9e7addbaa552..156e359a80d49db1b68606c9c22a1588b5bdb3a0 100644 (file)
@@ -161,6 +161,7 @@ check_PROGRAMS = $(PURE_EXECUTABLES) \
        stack-fcall-mangled \
        status-none-threads \
        status-unfinished-threads \
+       syslog-success \
        threads-execve \
        unblock_reset_raise \
        unix-pair-send-recv \
@@ -287,6 +288,7 @@ DECODER_TESTS = \
        seccomp-strict.test \
        sigaltstack.test \
        sun_path.test \
+       syslog-success.test \
        uio.test \
        umount.test \
        umount2.test \
diff --git a/tests/syslog-success.c b/tests/syslog-success.c
new file mode 100644 (file)
index 0000000..4374de6
--- /dev/null
@@ -0,0 +1,2 @@
+#define RETVAL_INJECTED 1
+#include "syslog.c"
diff --git a/tests/syslog-success.test b/tests/syslog-success.test
new file mode 100755 (executable)
index 0000000..adc916e
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh -efu
+
+. "${srcdir=.}/scno_tampering.sh"
+
+run_prog ../syslog-success 0
+for i in 0 23 42; do
+       run_strace -a35 -e trace=syslog -e inject=syslog:retval="${i}" \
+               ../syslog-success "${i}" > "$EXP.$i"
+       mv "$LOG" "$LOG.$i"
+       match_diff "$LOG.$i" "$EXP.$i"
+done
index a3417ea210716cc42cf2a8238f959fdc63740f51..f4f937349bfec54efb64b0af042738cd5761b983 100644 (file)
 # include <stdio.h>
 # include <unistd.h>
 
+# ifdef RETVAL_INJECTED
+#  define RET_SFX " (INJECTED)"
+# else
+#  define RET_SFX ""
+# endif
+
 bool
 valid_cmd(int cmd)
 {
@@ -69,40 +75,63 @@ main(void)
        };
        static const kernel_ulong_t high =
                (kernel_ulong_t) 0xbadc0ded00000000ULL;
+       static const size_t buf_size = 64;
+
        const kernel_ulong_t addr = (kernel_ulong_t) 0xfacefeeddeadbeefULL;
        int rc;
+       char *buf = tail_alloc(buf_size);
+
+       fill_memory(buf, buf_size);
 
        for (size_t i = 0; i < ARRAY_SIZE(no_args); i++) {
                rc = syscall(__NR_syslog, high | no_args[i].cmd, addr, -1);
-               printf("syslog(%s) = %s\n",
+               printf("syslog(%s) = %s" RET_SFX "\n",
                no_args[i].str, sprintrc(rc));
        }
 
        for (size_t i = 0; i < ARRAY_SIZE(two_args); i++) {
                rc = syscall(__NR_syslog, high | two_args[i].cmd, NULL, -1);
-               printf("syslog(%s, NULL, -1) = %s\n",
+               printf("syslog(%s, NULL, -1) = %s" RET_SFX "\n",
                       two_args[i].str, sprintrc(rc));
 
-               rc = syscall(__NR_syslog, high | two_args[i].cmd, addr, -1);
-               printf("syslog(%s, %#llx, -1) = %s\n",
-                      two_args[i].str, (unsigned long long) addr,
-                      sprintrc(rc));
-
-               rc = syscall(__NR_syslog, two_args[i].cmd, addr, 0);
-               printf("syslog(%s, %s, 0) = %s\n",
-                      two_args[i].str,
-                      !rc && valid_cmd(two_args[i].cmd)
-                          && (sizeof(kernel_ulong_t) == sizeof(void *))
-                               ? "\"\""
-                               : (sizeof(addr) == 8) ? "0xfacefeeddeadbeef"
-                                                     : "0xdeadbeef",
-                      sprintrc(rc));
+# ifdef RETVAL_INJECTED
+               /* Avoid valid commands with a bogus address */
+               if (!valid_cmd(two_args[i].cmd))
+# endif
+               {
+                       rc = syscall(__NR_syslog, high | two_args[i].cmd, addr,
+                                    -1);
+                       printf("syslog(%s, %#llx, -1) = %s" RET_SFX "\n",
+                              two_args[i].str, (unsigned long long) addr,
+                              sprintrc(rc));
+
+                       rc = syscall(__NR_syslog, two_args[i].cmd, addr, 0);
+
+                       printf("syslog(%s, %s, 0) = %s" RET_SFX "\n",
+                              two_args[i].str,
+                              !rc && valid_cmd(two_args[i].cmd)
+                                  && (sizeof(kernel_ulong_t) == sizeof(void *))
+                                     ? "\"\""
+                                     : (sizeof(addr) == 8)
+                                       ? "0xfacefeeddeadbeef" : "0xdeadbeef",
+                              sprintrc(rc));
+               }
+
+               rc = syscall(__NR_syslog, two_args[i].cmd, buf, buf_size);
+               const char *errstr = sprintrc(rc);
+
+               printf("syslog(%s, ", two_args[i].str);
+               if (rc >= 0 && valid_cmd(two_args[i].cmd))
+                       printstr(buf, two_args[i].cmd, rc);
+               else
+                       printf("%p", buf);
+               printf(", %zu) = %s" RET_SFX "\n", buf_size, errstr);
        }
 
        for (size_t i = 0; i < ARRAY_SIZE(levels); i++) {
                rc = syscall(__NR_syslog, high | 8, addr, levels[i].cmd);
                printf("syslog(8 /* SYSLOG_ACTION_CONSOLE_LEVEL */, %#llx, %s)"
-                      " = %s\n",
+                      " = %s" RET_SFX "\n",
                       (unsigned long long) addr, levels[i].str, sprintrc(rc));
        }