[PATCH 22/26] bjm: Parse parameters of init_module as of kernel_ulong_t type

Eugene Syromyatnikov evgsyr at gmail.com
Mon Oct 24 03:02:37 UTC 2016


init_module does not have compat on x32/n32, so its parameters should be
parsed as kernel_ulong_t.

* util.c (printaddr): Change type of addr parameter to kernel_ulong_t.
(printstr_ex): Change type of addr parameter to kernel_ulong_t, change
type of len parameter to kernel_long_t.
* defs.h: Include kernel_types.h. Update declaration of printaddr and
printstr_ex functions.
* bjm.c (SYS_FUNC(init_module)): Use getarg_ull for module_image and
param_values parameters.
---
 bjm.c  |    4 ++--
 defs.h |    7 ++++---
 util.c |   11 ++++++-----
 3 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/bjm.c b/bjm.c
index c8e8470..a6f30b3 100644
--- a/bjm.c
+++ b/bjm.c
@@ -44,9 +44,9 @@ SYS_FUNC(delete_module)
 
 SYS_FUNC(init_module)
 {
-	printaddr(tcp->u_arg[0]);
+	printaddr(getarg_ull(tcp, 0));
 	tprintf(", %llu, ", getarg_ull(tcp, 1));
-	printstr(tcp, tcp->u_arg[2], -1);
+	printstr(tcp, getarg_ull(tcp, 2), -1);
 
 	return RVAL_DECODED;
 }
diff --git a/defs.h b/defs.h
index 8f34679..04900e1 100644
--- a/defs.h
+++ b/defs.h
@@ -53,6 +53,7 @@
 #include <sys/time.h>
 #include <asm/unistd.h>
 
+#include "kernel_types.h"
 #include "mpers_type.h"
 #include "gcc_compat.h"
 
@@ -542,7 +543,7 @@ extern int getllval(struct tcb *, unsigned long long *, int);
 extern int printllval(struct tcb *, const char *, int)
 	ATTRIBUTE_FORMAT((printf, 2, 0));
 
-extern void printaddr(long);
+extern void printaddr(kernel_ulong_t addr);
 extern void printxvals(const uint64_t, const char *, const struct xlat *, ...)
 	ATTRIBUTE_SENTINEL;
 extern long long getarg_ll(struct tcb *tcp, int argn);
@@ -564,7 +565,7 @@ extern void dumpiov_upto(struct tcb *, int, long, unsigned long);
 #define dumpiov(tcp, len, addr) \
 	dumpiov_upto((tcp), (len), (addr), (unsigned long) -1L)
 extern void dumpstr(struct tcb *, long, int);
-extern void printstr_ex(struct tcb *, long addr, long len,
+extern void printstr_ex(struct tcb *, kernel_ulong_t addr, kernel_long_t len,
 	unsigned int user_style);
 extern bool printnum_short(struct tcb *, long, const char *)
 	ATTRIBUTE_FORMAT((printf, 3, 0));
@@ -673,7 +674,7 @@ extern void unwind_capture_stacktrace(struct tcb* tcp);
 #endif
 
 static inline void
-printstr(struct tcb *tcp, long addr, long len)
+printstr(struct tcb *tcp, kernel_ulong_t addr, kernel_long_t len)
 {
 	printstr_ex(tcp, addr, len, 0);
 }
diff --git a/util.c b/util.c
index e580eb2..59a65de 100644
--- a/util.c
+++ b/util.c
@@ -406,12 +406,12 @@ printflags64(const struct xlat *xlat, uint64_t flags, const char *dflt)
 }
 
 void
-printaddr(const long addr)
+printaddr(const kernel_ulong_t addr)
 {
 	if (!addr)
 		tprints("NULL");
 	else
-		tprintf("%#lx", addr);
+		tprintf("%#llx", (unsigned long long) addr);
 }
 
 #define DEF_PRINTNUM(name, type) \
@@ -798,7 +798,8 @@ printpath(struct tcb *tcp, long addr)
  * If string length exceeds `max_strlen', append `...' to the output.
  */
 void
-printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
+printstr_ex(struct tcb *tcp, kernel_ulong_t addr, kernel_long_t len,
+	unsigned int user_style)
 {
 	static char *str = NULL;
 	static char *outstr;
@@ -833,8 +834,8 @@ printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
 		style = QUOTE_0_TERMINATED;
 	}
 	else {
-		if (size > (unsigned long)len)
-			size = (unsigned long)len;
+		if (size > (kernel_ulong_t) len)
+			size = (kernel_ulong_t) len;
 		if (umoven(tcp, addr, size, str) < 0) {
 			printaddr(addr);
 			return;
-- 
1.7.10.4





More information about the Strace-devel mailing list