From fcb94cded0aed5555c717ea04fc78575f7831b3c Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Thu, 7 Apr 2016 01:15:58 +0000 Subject: [PATCH] Fix decoding of swapon flags * swapon.c (SYS_FUNC(swapon)): Print priority regardless of SWAP_FLAG_PREFER flag being set. * tests/swap.c (error_msg): Handle EINVAL. (main): Check decoding of swapon flags. --- swapon.c | 15 ++++++++++----- tests/swap.c | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/swapon.c b/swapon.c index 5f6df0b8..ef88b1ce 100644 --- a/swapon.c +++ b/swapon.c @@ -6,14 +6,19 @@ SYS_FUNC(swapon) { - int flags = tcp->u_arg[1]; + unsigned int flags = tcp->u_arg[1]; + unsigned int prio = flags & SWAP_FLAG_PRIO_MASK; + flags &= ~SWAP_FLAG_PRIO_MASK; printpath(tcp, tcp->u_arg[0]); tprints(", "); - printflags(swap_flags, flags & ~SWAP_FLAG_PRIO_MASK, - "SWAP_FLAG_???"); - if (flags & SWAP_FLAG_PREFER) - tprintf("|%d", flags & SWAP_FLAG_PRIO_MASK); + if (flags) { + printflags(swap_flags, flags, "SWAP_FLAG_???"); + if (prio) + tprintf("|%u", prio); + } else { + tprintf("%u", prio); + } return RVAL_DECODED; } diff --git a/tests/swap.c b/tests/swap.c index a2fd1ff4..e8f01968 100644 --- a/tests/swap.c +++ b/tests/swap.c @@ -14,6 +14,7 @@ error_msg(int error_num) switch (error_num) { case ENOSYS: return "ENOSYS"; case EPERM: return "EPERM"; + case EINVAL: return "EINVAL"; default: return "ENOENT"; } } @@ -27,6 +28,25 @@ main(void) printf("swapon(\"%s\", 0) = %d %s (%m)\n", sample, rc, error_msg(errno)); + rc = syscall(__NR_swapon, sample, 42); + printf("swapon(\"%s\", %s) = %d %s (%m)\n", + sample, "42", rc, error_msg(errno)); + + rc = syscall(__NR_swapon, sample, SWAP_FLAG_PREFER); + printf("swapon(\"%s\", %s) = %d %s (%m)\n", + sample, "SWAP_FLAG_PREFER", rc, error_msg(errno)); + + rc = syscall(__NR_swapon, sample, SWAP_FLAG_PREFER | 42); + printf("swapon(\"%s\", %s) = %d %s (%m)\n", + sample, "SWAP_FLAG_PREFER|42", rc, error_msg(errno)); + + rc = syscall(__NR_swapon, sample, -1L); + printf("swapon(\"%s\", %s) = %d %s (%m)\n", + sample, + "SWAP_FLAG_PREFER|SWAP_FLAG_DISCARD|SWAP_FLAG_DISCARD_ONCE" + "|SWAP_FLAG_DISCARD_PAGES|0xfff80000|32767", + rc, error_msg(errno)); + rc = syscall(__NR_swapoff, sample); printf("swapoff(\"%s\") = %d %s (%m)\n", sample, rc, error_msg(errno)); -- 2.40.0