[PATCH 12/26] tests: Additional tests for stat decoder

Eugene Syromyatnikov evgsyr at gmail.com
Mon Oct 24 03:01:26 UTC 2016


PRINT_SYSCALL_HEADER/PRINT_SYSCALL_FOOTER now contain open/close brace
pair in order to save errno. PRINT_SYSCALL_FOOTER now uses sprintrc for
printing rc/errno.

* xstatx.c (main): Add check for non-available pointer, for block device
file. Update PRINT_SYSCALL_FOOTER call convention.
* fstatat.c (PRINT_SYSCALL_HEADER): Add errno saving.
(PRINT_SYSCALL_FOOTER): Restore errno.
* fstatx.c (PRINT_SYSCALL_HEADER): Add errno saving.
(PRINT_SYSCALL_FOOTER): Restore errno.
* lstatx.c (PRINT_SYSCALL_HEADER): Add errno saving.
(PRINT_SYSCALL_FOOTER): Restore errno.
* statx.sh: Add tracing of /dev/full file, specify alignment.
* fstat.test: Specify alignment.
---
 tests/fstat.test |    2 +-
 tests/fstatat.c  |   10 +++++++---
 tests/fstatx.c   |   11 ++++++++---
 tests/lstatx.c   |   10 +++++++---
 tests/statx.sh   |    2 +-
 tests/xstatx.c   |   33 ++++++++++++++++++++++++++++++---
 6 files changed, 54 insertions(+), 14 deletions(-)

diff --git a/tests/fstat.test b/tests/fstat.test
index 506b440..2ba0fba 100755
--- a/tests/fstat.test
+++ b/tests/fstat.test
@@ -12,7 +12,7 @@ syscall=$NAME
 run_prog > /dev/null
 sample=$syscall.sample
 > "$sample"
-run_strace -ve$syscall -P$sample $args > "$OUT"
+run_strace -ve$syscall -P$sample -a21 $args > "$OUT"
 match_diff "$LOG" "$OUT"
 rm -f "$OUT"
 
diff --git a/tests/fstatat.c b/tests/fstatat.c
index ff47601..ec55ca0 100644
--- a/tests/fstatat.c
+++ b/tests/fstatat.c
@@ -30,9 +30,13 @@
 # define TEST_SYSCALL_INVOKE(sample, pst) \
 	fstatat(AT_FDCWD, sample, pst, AT_SYMLINK_NOFOLLOW)
 # define PRINT_SYSCALL_HEADER(sample) \
-	printf("%s(AT_FDCWD, \"%s\", ", TEST_SYSCALL_STR, sample)
-# define PRINT_SYSCALL_FOOTER \
-	puts(", AT_SYMLINK_NOFOLLOW) = 0")
+	do { \
+		int saved_errno = errno; \
+		printf("%s(AT_FDCWD, \"%s\", ", TEST_SYSCALL_STR, sample)
+# define PRINT_SYSCALL_FOOTER(rc) \
+		errno = saved_errno; \
+		printf(", AT_SYMLINK_NOFOLLOW) = %s\n", sprintrc(rc)); \
+	} while (0)
 
 # include "xstatx.c"
 
diff --git a/tests/fstatx.c b/tests/fstatx.c
index 890e30d..174f29f 100644
--- a/tests/fstatx.c
+++ b/tests/fstatx.c
@@ -25,12 +25,17 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#define IS_FSTAT 1
 #define TEST_SYSCALL_INVOKE(sample, pst) \
 	syscall(TEST_SYSCALL_NR, 0, pst)
 #define PRINT_SYSCALL_HEADER(sample) \
-	printf("%s(0, ", TEST_SYSCALL_STR)
-#define PRINT_SYSCALL_FOOTER \
-	puts(") = 0")
+	do { \
+		int saved_errno = errno; \
+		printf("%s(0, ", TEST_SYSCALL_STR)
+#define PRINT_SYSCALL_FOOTER(rc) \
+		errno = saved_errno; \
+		printf(") = %s\n", sprintrc(rc)); \
+	} while (0)
 
 #define USE_ASM_STAT
 
diff --git a/tests/lstatx.c b/tests/lstatx.c
index 2bd4e9f..a3ff843 100644
--- a/tests/lstatx.c
+++ b/tests/lstatx.c
@@ -28,9 +28,13 @@
 #define TEST_SYSCALL_INVOKE(sample, pst) \
 	syscall(TEST_SYSCALL_NR, sample, pst)
 #define PRINT_SYSCALL_HEADER(sample) \
-	printf("%s(\"%s\", ", TEST_SYSCALL_STR, sample)
-#define PRINT_SYSCALL_FOOTER \
-	puts(") = 0")
+	do { \
+		int saved_errno = errno; \
+		printf("%s(\"%s\", ", TEST_SYSCALL_STR, sample)
+#define PRINT_SYSCALL_FOOTER(rc) \
+		errno = saved_errno; \
+		printf(") = %s\n", sprintrc(rc)); \
+	} while (0)
 
 #define USE_ASM_STAT
 
diff --git a/tests/statx.sh b/tests/statx.sh
index 830e5fc..a630193 100755
--- a/tests/statx.sh
+++ b/tests/statx.sh
@@ -3,4 +3,4 @@
 # Check decoding of stat family syscalls.
 
 . "${srcdir=.}/init.sh"
-run_strace_match_diff -v -P $NAME.sample
+run_strace_match_diff -v -P $NAME.sample -P /dev/full -a32
diff --git a/tests/xstatx.c b/tests/xstatx.c
index 2d0dac3..d1ad52d 100644
--- a/tests/xstatx.c
+++ b/tests/xstatx.c
@@ -40,6 +40,7 @@
 #  error PRINT_SYSCALL_FOOTER must be defined
 # endif
 
+# include <errno.h>
 # include <stdio.h>
 # include <stddef.h>
 # include <time.h>
@@ -132,6 +133,10 @@ typedef off_t libc_off_t;
 #  endif /* HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC */
 # endif
 
+# ifndef IS_FSTAT
+#  define IS_STAT 0
+# endif
+
 static void
 print_ftype(const unsigned int mode)
 {
@@ -227,16 +232,38 @@ create_sample(const char *fname, const libc_off_t size)
 int
 main(void)
 {
+# if !IS_FSTAT
+	static const char full[] = "/dev/full";
+# endif
 	static const char sample[] = TEST_SYSCALL_STR ".sample";
 	STRUCT_STAT st[2];
 
-	int rc = create_sample(sample, SAMPLE_SIZE);
+	STRUCT_STAT *st_cut = tail_alloc(sizeof(*st_cut) - 4);
+
+	int rc;
+
+	rc = create_sample(sample, SAMPLE_SIZE);
 	if (rc) {
 		(void) unlink(sample);
 		return rc;
 	}
 
-	if (TEST_SYSCALL_INVOKE(sample, st)) {
+	rc = TEST_SYSCALL_INVOKE(sample, st_cut);
+	PRINT_SYSCALL_HEADER(sample);
+	printf("%p", st_cut);
+	PRINT_SYSCALL_FOOTER(rc);
+
+# if !IS_FSTAT
+	rc = TEST_SYSCALL_INVOKE(full, st);
+	PRINT_SYSCALL_HEADER(full);
+	if (rc)
+		printf("%p", st);
+	else
+		print_stat(st);
+	PRINT_SYSCALL_FOOTER(rc);
+# endif
+
+	if ((rc = TEST_SYSCALL_INVOKE(sample, st))) {
 		perror(TEST_SYSCALL_STR);
 		(void) unlink(sample);
 		return 77;
@@ -297,7 +324,7 @@ main(void)
 
 	PRINT_SYSCALL_HEADER(sample);
 	print_stat(st);
-	PRINT_SYSCALL_FOOTER;
+	PRINT_SYSCALL_FOOTER(rc);
 
 	puts("+++ exited with 0 +++");
 	return 0;
-- 
1.7.10.4





More information about the Strace-devel mailing list