From: Rasmus Villemoes Date: Mon, 5 Nov 2018 17:29:00 +0000 (+0000) Subject: Add support for /dev/[u]random ioctls X-Git-Tag: v4.26~89 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2649c8c8b6832f267fb20cbcfdead19d32b8f2fc;p=strace Add support for /dev/[u]random ioctls * random_ioctl.c: New file. * Makefile.am (strace_SOURCES): Add it. * defs.h (DECL_IOCTL): Add random. * ioctl.c (ioctl_decode): Add 'R' case. * xlat/random_ioctl_cmds.in: New file. * tests/ioctl_random.c: New file. * tests/.gitignore: Add ioctl_random. * tests/pure_executables.list: Likewise. * tests/gen_tests.in (ioctl_random): New entry. Signed-off-by: Rasmus Villemoes --- diff --git a/Makefile.am b/Makefile.am index db16b3aa..350bc51a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -267,6 +267,7 @@ strace_SOURCES = \ ptp.c \ ptrace.h \ quota.c \ + random_ioctl.c \ readahead.c \ readlink.c \ reboot.c \ diff --git a/defs.h b/defs.h index 5ba95f53..b8d561aa 100644 --- a/defs.h +++ b/defs.h @@ -973,6 +973,7 @@ DECL_IOCTL(kvm); DECL_IOCTL(nbd); DECL_IOCTL(nsfs); DECL_IOCTL(ptp); +DECL_IOCTL(random); DECL_IOCTL(scsi); DECL_IOCTL(term); DECL_IOCTL(ubi); diff --git a/ioctl.c b/ioctl.c index 4c9e7db3..e7dd4c4e 100644 --- a/ioctl.c +++ b/ioctl.c @@ -329,6 +329,8 @@ ioctl_decode(struct tcb *tcp) return inotify_ioctl(tcp, code, arg); case 0xab: return nbd_ioctl(tcp, code, arg); + case 'R': + return random_ioctl(tcp, code, arg); default: break; } diff --git a/random_ioctl.c b/random_ioctl.c new file mode 100644 index 00000000..6eaf6daf --- /dev/null +++ b/random_ioctl.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018 The strace developers. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "defs.h" +#include "print_fields.h" + +#include +#include + +#define XLAT_MACROS_ONLY +# include "xlat/random_ioctl_cmds.h" +#undef XLAT_MACROS_ONLY + +/* + * RNDGETPOOL was removed in 2.6.9, so non-ancient kernels always + * return -EINVAL for that. + */ + +int +random_ioctl(struct tcb *const tcp, const unsigned int code, + const kernel_ulong_t arg) +{ + struct rand_pool_info info; + kernel_ulong_t buf; + + switch (code) { + case RNDGETENTCNT: + if (entering(tcp)) + return 0; + ATTRIBUTE_FALLTHROUGH; + case RNDADDTOENTCNT: + tprints(", "); + printnum_int(tcp, arg, "%d"); + break; + + case RNDADDENTROPY: + tprints(", "); + if (!umove_or_printaddr(tcp, arg, &info)) { + PRINT_FIELD_D("{", info, entropy_count); + PRINT_FIELD_D(", ", info, buf_size); + tprints(", buf="); + buf = arg + offsetof(struct rand_pool_info, buf); + printstrn(tcp, buf, info.buf_size); + tprints("}"); + } + break; + + /* ioctls with no parameters */ + case RNDZAPENTCNT: + case RNDCLEARPOOL: + case RNDRESEEDCRNG: + break; + default: + return RVAL_DECODED; + } + return RVAL_IOCTL_DECODED; +} diff --git a/tests/.gitignore b/tests/.gitignore index 577a1316..297319ef 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -158,6 +158,7 @@ ioctl_nsfs ioctl_perf ioctl_perf-success ioctl_ptp +ioctl_random ioctl_rtc ioctl_rtc-v ioctl_scsi diff --git a/tests/gen_tests.in b/tests/gen_tests.in index cd63788d..f36cb62f 100644 --- a/tests/gen_tests.in +++ b/tests/gen_tests.in @@ -150,6 +150,7 @@ ioctl_nbd +ioctl.test -y ioctl_nsfs +ioctl.test -esignal=none ioctl_perf +ioctl.test ioctl_ptp +ioctl.test +ioctl_random +ioctl.test ioctl_rtc +ioctl.test ioctl_rtc-v +ioctl.test -v ioctl_scsi +ioctl.test diff --git a/tests/ioctl_random.c b/tests/ioctl_random.c new file mode 100644 index 00000000..06545e85 --- /dev/null +++ b/tests/ioctl_random.c @@ -0,0 +1,74 @@ +/* + * Check decoding of RND* commands of ioctl syscall. + * + * Copyright (c) 2018 The strace developers. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "tests.h" + +#include +#include +#include +#include +#include + +#define XLAT_MACROS_ONLY +# include "xlat/random_ioctl_cmds.h" +#undef XLAT_MACROS_ONLY + +#define RVAL_EBADF " = -1 EBADF (%m)\n" + +int +main(void) +{ + union { + char c[sizeof(struct rand_pool_info) + 8]; + struct rand_pool_info info; + } u; + struct rand_pool_info *info = &u.info; + int cnt = 6; + + memcpy(info->buf, "12345678", 8); + info->buf_size = 8; + info->entropy_count = 3; + + ioctl(-1, RNDGETENTCNT, &cnt); + printf("ioctl(-1, RNDGETENTCNT, %p)" RVAL_EBADF, &cnt); + ioctl(-1, RNDADDTOENTCNT, &cnt); + printf("ioctl(-1, RNDADDTOENTCNT, [6])" RVAL_EBADF); + ioctl(-1, RNDADDENTROPY, info); + printf("ioctl(-1, RNDADDENTROPY, {entropy_count=3, buf_size=8, buf=\"12345678\"})" RVAL_EBADF); + + ioctl(-1, RNDZAPENTCNT); + printf("ioctl(-1, RNDZAPENTCNT)" RVAL_EBADF); + ioctl(-1, RNDCLEARPOOL); + printf("ioctl(-1, RNDCLEARPOOL)" RVAL_EBADF); + ioctl(-1, RNDRESEEDCRNG); + printf("ioctl(-1, RNDRESEEDCRNG)" RVAL_EBADF); + + puts("+++ exited with 0 +++"); + return 0; +} diff --git a/tests/pure_executables.list b/tests/pure_executables.list index 69097bfb..d787f78e 100755 --- a/tests/pure_executables.list +++ b/tests/pure_executables.list @@ -121,6 +121,7 @@ ioctl_mtd ioctl_nbd ioctl_perf ioctl_ptp +ioctl_random ioctl_rtc ioctl_scsi ioctl_sg_io_v3 diff --git a/xlat/random_ioctl_cmds.in b/xlat/random_ioctl_cmds.in new file mode 100644 index 00000000..1b31dc52 --- /dev/null +++ b/xlat/random_ioctl_cmds.in @@ -0,0 +1,7 @@ +RNDGETENTCNT _IOR( 'R', 0x00, int ) +RNDADDTOENTCNT _IOW( 'R', 0x01, int ) +RNDGETPOOL _IOR( 'R', 0x02, int [2] ) +RNDADDENTROPY _IOW( 'R', 0x03, int [2] ) +RNDZAPENTCNT _IO( 'R', 0x04 ) +RNDCLEARPOOL _IO( 'R', 0x06 ) +RNDRESEEDCRNG _IO( 'R', 0x07 )