]> granicus.if.org Git - strace/commitdiff
Fix decoding of device numbers in mknod and mknodat syscalls
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 25 Mar 2016 23:48:48 +0000 (23:48 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 25 Mar 2016 23:48:48 +0000 (23:48 +0000)
* mknod.c (decode_mknod): Treat device number argument as unsigned int.
* tests/mknod.c: Include <sys/sysmacros.h> or <sys/mkdev.h>
for definition of makedev macro.
(main): Add a check for a character special file.

mknod.c
tests/mknod.c

diff --git a/mknod.c b/mknod.c
index 14d9ddd74d78a2f0a96f31468d22e2fd525d2f23..d78fa07febf2bd481532f7a0251302991a3a2b84 100644 (file)
--- a/mknod.c
+++ b/mknod.c
@@ -48,15 +48,15 @@ static void
 decode_mknod(struct tcb *tcp, int offset)
 {
        int mode = tcp->u_arg[offset + 1];
+       unsigned int dev;
 
        printpath(tcp, tcp->u_arg[offset]);
        tprintf(", %s", sprintmode(mode));
        switch (mode & S_IFMT) {
        case S_IFCHR:
        case S_IFBLK:
-               tprintf(", makedev(%lu, %lu)",
-                       (unsigned long) major(tcp->u_arg[offset + 2]),
-                       (unsigned long) minor(tcp->u_arg[offset + 2]));
+               dev = tcp->u_arg[offset + 2];
+               tprintf(", makedev(%u, %u)", major(dev), minor(dev));
                break;
        }
 }
index 7e80582e0e8817b8975f497485cca9b2d203313b..48367fed3392f3b64b9aff14232cc60d93eebe65 100644 (file)
@@ -8,6 +8,13 @@
 # include <sys/stat.h>
 # include <unistd.h>
 
+# ifdef MAJOR_IN_SYSMACROS
+#  include <sys/sysmacros.h>
+# endif
+# ifdef MAJOR_IN_MKDEV
+#  include <sys/mkdev.h>
+# endif
+
 # define TMP_FILE "mknod"
 
 int
@@ -18,6 +25,13 @@ main(void)
               TMP_FILE, rc,
               errno == ENOSYS ? "ENOSYS" : "EEXIST");
 
+       const unsigned long dev =
+               (unsigned long) 0xdeadbeef00000000 | makedev(1, 7);
+       rc = syscall(__NR_mknod, TMP_FILE, S_IFCHR | 0400, dev);
+       printf("mknod(\"%s\", S_IFCHR|0400, makedev(1, 7)) = %d %s (%m)\n",
+              TMP_FILE, rc,
+              errno == ENOSYS ? "ENOSYS" : "EEXIST");
+
        puts("+++ exited with 0 +++");
        return 0;
 }