]> granicus.if.org Git - strace/commitdiff
Change scno type from long to unsigned long
authorDmitry V. Levin <ldv@altlinux.org>
Sun, 18 Dec 2016 17:20:44 +0000 (17:20 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 18 Dec 2016 22:57:57 +0000 (22:57 +0000)
Use an unsigned type for syscall numbers as they are not intended
for signed arithmetics.  Introduce kernel_scno_t as a typedef
to unsigned long, that could be changed later to kernel_ulong_t.

* kernel_types.h (kernel_scno_t): New type, typedef to unsigned long.
* defs.h (struct tcb): Change type of scno field from long
to kernel_scno_t.
(syscall_name): Change argument type from long to kernel_scno_t.
(scno_in_range, scno_is_valid): Change argument type from unsigned long
to kernel_scno_t.
* linux/aarch64/set_scno.c (arch_set_scno): Change scno argument type
from long to kernel_scno_t.
* linux/alpha/set_scno.c (arch_set_scno): Likewise.
* linux/arc/set_scno.c (arch_set_scno): Likewise.
* linux/arm/set_scno.c (arch_set_scno): Likewise.
* linux/avr32/set_scno.c (arch_set_scno): Likewise.
* linux/bfin/set_scno.c (arch_set_scno): Likewise.
* linux/crisv10/set_scno.c (arch_set_scno): Likewise.
* linux/hppa/set_scno.c (arch_set_scno): Likewise.
* linux/i386/set_scno.c (arch_set_scno): Likewise.
* linux/ia64/set_scno.c (arch_set_scno): Likewise.
* linux/m68k/set_scno.c (arch_set_scno): Likewise.
* linux/metag/set_scno.c (arch_set_scno): Likewise.
* linux/microblaze/set_scno.c (arch_set_scno): Likewise.
* linux/mips/set_scno.c (arch_set_scno): Likewise.
* linux/nios2/set_scno.c (arch_set_scno): Likewise.
* linux/or1k/set_scno.c (arch_set_scno): Likewise.
* linux/powerpc/set_scno.c (arch_set_scno): Likewise.
* linux/riscv/set_scno.c (arch_set_scno): Likewise.
* linux/s390/set_scno.c (arch_set_scno): Likewise.
* linux/sh/set_scno.c (arch_set_scno): Likewise.
* linux/sh64/set_scno.c (arch_set_scno): Likewise.
* linux/sparc/set_scno.c (arch_set_scno): Likewise.
* linux/tile/set_scno.c (arch_set_scno): Likewise.
* linux/x86_64/set_scno.c (arch_set_scno): Likewise.
* linux/xtensa/set_scno.c (arch_set_scno): Likewise.
* linux/aarch64/get_scno.c (arch_get_scno): Change scno variable type
from long to kernel_scno_t.
* linux/alpha/get_scno.c (arch_get_scno): Likewise.
* linux/arm/get_scno.c (arch_get_scno): Likewise.
* linux/sh/get_scno.c (arch_get_scno): Likewise.
* linux/x86_64/get_scno.c (arch_get_scno): Likewise.
* syscall.c (arch_set_scno): Likewise.
(shuffle_scno): Change return type from long to kernel_scno_t.
(syscall_name): Change argument type from long to kernel_scno_t.

33 files changed:
defs.h
kernel_types.h
linux/aarch64/get_scno.c
linux/aarch64/set_scno.c
linux/alpha/get_scno.c
linux/alpha/set_scno.c
linux/arc/set_scno.c
linux/arm/get_scno.c
linux/arm/set_scno.c
linux/avr32/set_scno.c
linux/bfin/set_scno.c
linux/crisv10/set_scno.c
linux/hppa/set_scno.c
linux/i386/set_scno.c
linux/ia64/set_scno.c
linux/m68k/set_scno.c
linux/metag/set_scno.c
linux/microblaze/set_scno.c
linux/mips/set_scno.c
linux/nios2/set_scno.c
linux/or1k/set_scno.c
linux/powerpc/set_scno.c
linux/riscv/set_scno.c
linux/s390/set_scno.c
linux/sh/get_scno.c
linux/sh/set_scno.c
linux/sh64/set_scno.c
linux/sparc/set_scno.c
linux/tile/set_scno.c
linux/x86_64/get_scno.c
linux/x86_64/set_scno.c
linux/xtensa/set_scno.c
syscall.c

diff --git a/defs.h b/defs.h
index 83f09f94305acb1a191ac880a03f3876a0f48f71..09af8d083ca743dc847b941209d56e53842613c9 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -229,7 +229,7 @@ struct tcb {
        int pid;                /* If 0, this tcb is free */
        int qual_flg;           /* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW */
        unsigned long u_error;  /* Error code */
-       long scno;              /* System call number */
+       kernel_scno_t scno;     /* System call number */
        long u_arg[MAX_ARGS];   /* System call arguments */
 #if HAVE_STRUCT_TCB_EXT_ARG
        long long ext_arg[MAX_ARGS];
@@ -467,7 +467,7 @@ extern int get_scno(struct tcb *tcp);
  * @return     String literal corresponding to the syscall number in case latter
  *             is valid; NULL otherwise.
  */
-extern const char *syscall_name(long scno);
+extern const char *syscall_name(kernel_scno_t scno);
 extern const char *err_name(unsigned long err);
 
 extern bool is_erestart(struct tcb *);
@@ -879,7 +879,7 @@ extern struct fault_opts *fault_vec[SUPPORTED_PERSONALITIES];
 
 /* Checks that sysent[scno] is not out of range. */
 static inline bool
-scno_in_range(unsigned long scno)
+scno_in_range(kernel_scno_t scno)
 {
        return scno < nsyscalls;
 }
@@ -890,7 +890,7 @@ scno_in_range(unsigned long scno)
  * and its sysent[scno].sys_flags has no TRACE_INDIRECT_SUBCALL flag set.
  */
 static inline bool
-scno_is_valid(unsigned long scno)
+scno_is_valid(kernel_scno_t scno)
 {
        return scno_in_range(scno)
               && sysent[scno].sys_func
index 5a276135a8340a68a808793d681dbcaa8a5a3c19..60cb629ed0b235a2273b8f56dac4c5771b2c67d1 100644 (file)
@@ -47,6 +47,8 @@ typedef unsigned long kernel_ulong_t;
 
 # endif
 
+typedef unsigned long kernel_scno_t;
+
 typedef struct {
        kernel_ulong_t  d_ino;
        kernel_ulong_t  d_off;
index c0fd4822330f7bccfabcb9578f19439199ed2e52..6dc4962e6fc8b8b250b707cee5d09e77d3a9f701 100644 (file)
@@ -2,7 +2,7 @@
 static int
 arch_get_scno(struct tcb *tcp)
 {
-       long scno = 0;
+       kernel_scno_t scno = 0;
 
        switch (aarch64_io.iov_len) {
                case sizeof(aarch64_regs):
index 24498d50d665bbc6f08c16bf92482f660f27ca00..e66297afc40731e5fc889b31b3e7ee91fd852dcc 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        unsigned int n = (uint16_t) scno;
        const struct iovec io = {
index 65b9a77d0c8f6a90cc146e5ab6f9e62e4a179295..13002775ba82f5358cdbd7023e1a09afaf5cfe94 100644 (file)
@@ -2,7 +2,7 @@
 static int
 arch_get_scno(struct tcb *tcp)
 {
-       long scno = 0;
+       kernel_scno_t scno = 0;
 
        if (upeek(tcp->pid, REG_A3, &alpha_a3) < 0)
                return -1;
index 21c603aad5942bf16cfd979e63660109c89b484d..4607ce45ecc3090d87b3b69d9cdb6dfc1d81f2ac 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        return upoke(tcp->pid, REG_R0, scno);
 }
index afac740e66061b7b688f627498fddafaae42a9bb..bc6c9dc77404d9762bed290ed4f07615d45c6d1a 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        arc_regs.scratch.r8 = scno;
        return set_regs(tcp->pid);
index 4dced92a7b8ab3f486834fa0f18b3c869b508262..e312d16384ce4fcf450f872f07c2b7f621830ffb 100644 (file)
@@ -31,7 +31,7 @@
 static int
 arch_get_scno(struct tcb *tcp)
 {
-       long scno = 0;
+       kernel_scno_t scno = 0;
 
        /* Note: we support only 32-bit CPUs, not 26-bit */
 
@@ -47,7 +47,7 @@ arch_get_scno(struct tcb *tcp)
        if (errno)
                return -1;
        /* EABI syscall convention? */
-       if ((unsigned long) scno != 0xef000000) {
+       if (scno != 0xef000000) {
                /* No, it's OABI */
                if ((scno & 0x0ff00000) != 0x0f900000) {
                        error_msg("pid %d unknown syscall trap 0x%08lx",
index 928f1e923b747722fa23b1c2ed5420f52242d3ec..085e539eebed03f75c49c44a112e54c099d5bcbe 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        unsigned int n = (uint16_t) scno;
        int rc = ptrace(PTRACE_SET_SYSCALL, tcp->pid, NULL, (unsigned long) n);
index 1090d2f364602b48c80497b71f61a4a066b50c37..d8f87d11d874c37f17a7cb71b631f4acb9292a8d 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        avr32_regs.r8 = scno;
        return set_regs(tcp->pid);
index 235dbb3a2d197401576f477eca86c7a725358636..8f60274d00ae08e81093c78bc3720446ea8fefbc 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        return upoke(tcp->pid, PT_ORIG_P0, scno);
 }
index 4ccba5ac33e78061da596a6acc5f5844e9ac6dbe..f728c7698ffe03d2e4eb5d5bdab151377e7b7e21 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        return upoke(tcp->pid, 4 * PT_R9, scno);
 }
index 21321a026f1952952ac6264aa17e46685abf51ef..3d85f4a5901e2fbceb6a541c5f8175966533e8c4 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        return upoke(tcp->pid, PT_GR20, scno);
 }
index 1affa3a160ffd99d0437d94fb0b811d2f2c2b641..1b633f32a301d596d6888820953815c237ee273b 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
 #ifdef HAVE_GETREGS_OLD
        return upoke(tcp->pid, 4 * ORIG_EAX, scno);
index 3450f1c3503523e6130845a5bbd7a143b041e9e8..a8f9cd87edaa3d8ebf81ff5ab5f455154dc27cb7 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        if (ia64_ia32mode)
                ia64_regs.gr[0] = scno;
index f8753b341d78226b76f4f87920163c6e353a2adb..17fa989dc10f4605606d77d0b8b3c69475dccf9d 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        m68k_regs.orig_d0 = scno;
        return set_regs(tcp->pid);
index 72198d6613e0f6a6cd97077be2fb139160236f2f..8b13e1da1a9f8763e6f679aa868abe892b52a840 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        metag_regs.dx[0][1] = scno;
        return set_regs(tcp->pid);
index 0f7ce9ec7a614c5389c0644b54d1bc4222f6bdc9..ff233035af27f1214e228b5dfc45068dfc79db7e 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        return upoke(tcp->pid, 0, scno);
 }
index fc7a63bb28e25d95985e4fe8ce56a19fb22e935b..7d8fe9bc5a18246bb3eb7f2997c06e25a191de95 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        mips_REG_V0 = scno;
        return set_regs(tcp->pid);
index e8e06bebc1ffc7bb69848fca24930927be06174a..64f1ccdaa871c3712c634a8fe56e5fd02b50a91a 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        nios2_regs.regs[2] = scno;
        return set_regs(tcp->pid);
index 5cf7672a0691d942a44a09f086e4829850cd3f46..0ce465acc9fd95724576739fd7ee54dcd3f50256 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        or1k_regs.gpr[11] = scno;
        return set_regs(tcp->pid);
index 9c1acd0a5131a54a610e33c3f78414e895ed3bba..aa4a9110ac3c1479de9ac73e1f872581239cd548 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
 #ifdef HAVE_GETREGS_OLD
        return upoke(tcp->pid, sizeof(long) * PT_R0, scno);
index 4ef3d6ef57f3abb8ddcfc779c8c5edffe84425f6..858a0671b1175a74acc01c0f10f43265829cd0f0 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        riscv_regs.a7 = scno;
        return set_regs(tcp->pid);
index e21c5409828cae8ca7a9440b94b3cffe3365c878..ffa600cf4ba685c58203dee01cca95bd2aa5dc07 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        s390_regset.gprs[2] = scno;
        return set_regs(tcp->pid);
index a9bc5d8fcd59e316af3bfd4e4d4820fd1fa7f475..971f5547a50fc39ca6dd2a6970181f347d4423c2 100644 (file)
@@ -2,7 +2,7 @@
 static int
 arch_get_scno(struct tcb *tcp)
 {
-       long scno = 0;
+       kernel_scno_t scno = 0;
 
        /*
         * In the new syscall ABI, the system call number is in R3.
@@ -10,11 +10,11 @@ arch_get_scno(struct tcb *tcp)
        if (upeek(tcp->pid, 4*(REG_REG0+3), &scno) < 0)
                return -1;
 
-       if (scno < 0) {
+       if ((long) scno < 0) {
                /* Odd as it may seem, a glibc bug has been known to cause
                   glibc to issue bogus negative syscall numbers.  So for
                   our purposes, make strace print what it *should* have been */
-               long correct_scno = (scno & 0xff);
+               kernel_scno_t correct_scno = (scno & 0xff);
                if (debug_flag)
                        error_msg("Detected glibc bug: bogus system call"
                                  " number = %ld, correcting to %ld",
index 83d603e6cfb4bec7d39d5ef818b02445ecb4c6a0..63e5529aa254ff62ed8e8374757ec89d5d4bf650 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        return upoke(tcp->pid, 4 * (REG_REG0 + 3), scno);
 }
index 212ce2ec59dc4251b32e63ed2b1db805d77ebec4..cae7d500c546b4490520ada9531d7edeaab9f144 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        return upoke(tcp->pid, REG_SYSCALL, scno);
 }
index bba124a8b655373ecb864e7f1d70da17e02b0aef..0ba7f08fea6fc2ba29d4401a2959f68c46063d80 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        sparc_regs.u_regs[U_REG_G1] = scno;
        return set_regs(tcp->pid);
index 5ba19638e890f2927241fc45980a035768ef342a..84c06767f96eecc61815154062dff26adaa0fa61 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        tile_regs.regs[10] = scno;
        return set_regs(tcp->pid);
index a87987e1d9b4f18f3da3e071a3eb9c5d65ad7ea9..cbde17be7763fd70a47b186cade4df0e580e8ec9 100644 (file)
@@ -40,7 +40,7 @@
 static int
 arch_get_scno(struct tcb *tcp)
 {
-       long scno = 0;
+       kernel_scno_t scno = 0;
        unsigned int currpers;
 
 #ifndef __X32_SYSCALL_BIT
index af1910b960de329e0ecd111882e44aa867c5011d..c7d5413c80f1a32c0562d307b453e37d04961bfb 100644 (file)
@@ -5,7 +5,7 @@
 #endif /* !HAVE_GETREGS_OLD */
 
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
 #ifdef HAVE_GETREGS_OLD
        return upoke(tcp->pid, 8 * ORIG_RAX, scno);
index 532814f2040dc861497567d046dec438bd190da2..a869a2b1d955d807639099c12c3380705ddefa7c 100644 (file)
@@ -1,5 +1,5 @@
 static int
-arch_set_scno(struct tcb *tcp, long scno)
+arch_set_scno(struct tcb *tcp, kernel_scno_t scno)
 {
        return upoke(tcp->pid, SYSCALL_NR, scno);
 }
index 2b30f58c4b8c458d4277a6d81c70cd7b730bf374..81489af7dbe87b1ac4bfe2ce0e06396f3a4acb0b 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -345,7 +345,7 @@ decode_socket_subcall(struct tcb *tcp)
        if (call < 1 || call >= SYS_socket_nsubcalls)
                return;
 
-       const unsigned long scno = SYS_socket_subcall + call;
+       const kernel_scno_t scno = SYS_socket_subcall + call;
        const unsigned int nargs = sysent[scno].nargs;
        uint64_t buf[nargs];
 
@@ -491,10 +491,10 @@ dumpio(struct tcb *tcp)
  * Shuffle syscall numbers so that we don't have huge gaps in syscall table.
  * The shuffling should be an involution: shuffle_scno(shuffle_scno(n)) == n.
  */
-#if defined(ARM) || defined(AARCH64) /* So far only 32-bit ARM needs this */
-static long
-shuffle_scno(unsigned long scno)
+static kernel_scno_t
+shuffle_scno(kernel_scno_t scno)
 {
+#if defined(ARM) || defined(AARCH64) /* So far only 32-bit ARM needs this */
        if (scno < ARM_FIRST_SHUFFLED_SYSCALL)
                return scno;
 
@@ -504,7 +504,7 @@ shuffle_scno(unsigned long scno)
        if (scno == 0x000ffff0)
                return ARM_FIRST_SHUFFLED_SYSCALL;
 
-#define ARM_SECOND_SHUFFLED_SYSCALL (ARM_FIRST_SHUFFLED_SYSCALL + 1)
+# define ARM_SECOND_SHUFFLED_SYSCALL (ARM_FIRST_SHUFFLED_SYSCALL + 1)
        /*
         * Is it ARM specific syscall?
         * Swap [0x000f0000, 0x000f0000 + LAST_SPECIAL] range
@@ -517,12 +517,10 @@ shuffle_scno(unsigned long scno)
        if (scno <= ARM_SECOND_SHUFFLED_SYSCALL + ARM_LAST_SPECIAL_SYSCALL) {
                return scno + 0x000f0000 - ARM_SECOND_SHUFFLED_SYSCALL;
        }
+#endif /* ARM || AARCH64 */
 
        return scno;
 }
-#else
-# define shuffle_scno(scno) ((long)(scno))
-#endif
 
 const char *
 err_name(unsigned long err)
@@ -544,7 +542,7 @@ clear_regs(void)
 static int get_syscall_args(struct tcb *);
 static int get_syscall_result(struct tcb *);
 static int arch_get_scno(struct tcb *tcp);
-static int arch_set_scno(struct tcb *, long);
+static int arch_set_scno(struct tcb *, kernel_scno_t);
 static void get_error(struct tcb *, const bool);
 static int arch_set_error(struct tcb *);
 
@@ -1272,7 +1270,7 @@ get_syscall_result(struct tcb *tcp)
 #endif
 
 const char *
-syscall_name(long scno)
+syscall_name(kernel_scno_t scno)
 {
 #if defined X32_PERSONALITY_NUMBER && defined __X32_SYSCALL_BIT
        if (current_personality == X32_PERSONALITY_NUMBER)