From: Dmitry V. Levin Date: Fri, 25 Mar 2016 23:48:48 +0000 (+0000) Subject: Fix decoding of device numbers in mknod and mknodat syscalls X-Git-Tag: v4.12~492 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9d91928320c8c5a2472a64d431074238a5213eb9;p=strace Fix decoding of device numbers in mknod and mknodat syscalls * mknod.c (decode_mknod): Treat device number argument as unsigned int. * tests/mknod.c: Include or for definition of makedev macro. (main): Add a check for a character special file. --- diff --git a/mknod.c b/mknod.c index 14d9ddd7..d78fa07f 100644 --- 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; } } diff --git a/tests/mknod.c b/tests/mknod.c index 7e80582e..48367fed 100644 --- a/tests/mknod.c +++ b/tests/mknod.c @@ -8,6 +8,13 @@ # include # include +# ifdef MAJOR_IN_SYSMACROS +# include +# endif +# ifdef MAJOR_IN_MKDEV +# include +# 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; }