From patchwork Tue May 22 23:34:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Omar Sandoval X-Patchwork-Id: 10419741 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C79E160545 for ; Tue, 22 May 2018 23:34:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B6F2028EB3 for ; Tue, 22 May 2018 23:34:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id ABA5828EC0; Tue, 22 May 2018 23:34:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 120D828EBB for ; Tue, 22 May 2018 23:34:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753458AbeEVXe2 (ORCPT ); Tue, 22 May 2018 19:34:28 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:39009 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753512AbeEVXeV (ORCPT ); Tue, 22 May 2018 19:34:21 -0400 Received: by mail-pf0-f193.google.com with SMTP id a22-v6so9507543pfn.6 for ; Tue, 22 May 2018 16:34:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=osandov-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=uyJmBW2w7iKATs5HOO2FnQAeZ3Z2sEhYwSQGGpp/Qwk=; b=dNk8YoXGITB6717jpeXdV5Lj2r9/QfNircvf+OH47cvimNgf4Yrw8yxFcun3iMHOYm t9i60V1phrKvBXY1nPBEjMoIl9rXp5x0W6TOI4l9uew43ASlpV2Fy9Ej5l59fMySfwq5 w3PDVB6CJLoyy/z15xd2b8C6Ec4WCAPwSbEt+MpTqsJcD+1owsKdYo4FCct5/NVchltZ QXTCLbsxsfV9w1xCaMq/0GpW1xvKAsad4j+Jv6wB4dHLRQeFtneZ3jw7L7UvDYG4v53m 4RXjmdywcXd5AeMvOF4h8WKu+nnGJMFFPzDN2HN3cpZp1OaRYxAv/M55j/gBzVqerUm5 UrYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=uyJmBW2w7iKATs5HOO2FnQAeZ3Z2sEhYwSQGGpp/Qwk=; b=OyzAdg9Vyn9PdSFRiA/iU0zqykELHwFH7Bp2nxgW5BGF3N0rir3/feDiLB+NNQouM8 losl5zm0zXMeIbkuy6F8fMjwC/o6+kRFDVNO8rBLfPgVx8Ikr489QyzdaWzdvRceMZku 0JNJgLNZ7BHVVu2gDim+tBBXgXF1iyCsUZ2mIPSwMkRL5kJlCz1esG7RYds9eMm1wRN2 YmUaAqHtSS3yVBt8LZ4xrXQdHt04s28QML1aEXGI7wLQd0P3u6XsRFAdlJU6NHpi4l9v WbBABGlz+7k0M87pYqxnnqXE1VlgnNXQ/MkxowRLvK1oOSVIx58vIKR3rnzeh8c4ofX+ mSuw== X-Gm-Message-State: ALKqPwf8whFJXz5st6sctlhIfzl1Mx8GzjpbV0c6fk5MJoaj5Nxxs+G2 h3WJYliK2Vd1pf0SlWuzqDgi0jTfxzk= X-Google-Smtp-Source: AB8JxZpsF5/DlvXK65KRfh9+LBP+1E+TsHhwKjZgc+SrI2atXmgXd550/hSF8jvRwxiNysrLdCMReg== X-Received: by 2002:a63:a341:: with SMTP id v1-v6mr396820pgn.442.1527032058921; Tue, 22 May 2018 16:34:18 -0700 (PDT) Received: from vader.thefacebook.com ([2620:10d:c090:200::7:5b87]) by smtp.gmail.com with ESMTPSA id t28-v6sm35522928pfk.161.2018.05.22.16.34.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 22 May 2018 16:34:18 -0700 (PDT) From: Omar Sandoval To: fstests@vger.kernel.org Cc: "Darrick J . Wong" , Eryu Guan , linux-btrfs@vger.kernel.org, linux-xfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v3 5/5] generic: test invalid swap file activation Date: Tue, 22 May 2018 16:34:00 -0700 Message-Id: <7712e5e38f9a46a590d0edb55357010c338d62a4.1527031843.git.osandov@fb.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: References: In-Reply-To: References: Sender: fstests-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: fstests@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Omar Sandoval Swap files cannot have holes, and they must at least two pages. swapon(8) and mkswap(8) have stricter restrictions, so add versions of those commands without any restrictions. Signed-off-by: Omar Sandoval --- .gitignore | 2 ++ src/Makefile | 2 +- src/mkswap.c | 83 +++++++++++++++++++++++++++++++++++++++++++ src/swapon.c | 24 +++++++++++++ tests/generic/494 | 77 +++++++++++++++++++++++++++++++++++++++ tests/generic/494.out | 5 +++ tests/generic/group | 1 + 7 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 src/mkswap.c create mode 100644 src/swapon.c create mode 100755 tests/generic/494 create mode 100644 tests/generic/494.out diff --git a/.gitignore b/.gitignore index 53029e24..efc73a7c 100644 --- a/.gitignore +++ b/.gitignore @@ -92,6 +92,7 @@ /src/lstat64 /src/makeextents /src/metaperf +/src/mkswap /src/mmapcat /src/multi_open_unlink /src/nametest @@ -111,6 +112,7 @@ /src/seek_sanity_test /src/stale_handle /src/stat_test +/src/swapon /src/t_access_root /src/t_dir_offset /src/t_dir_offset2 diff --git a/src/Makefile b/src/Makefile index c42d3bb1..01fe99ef 100644 --- a/src/Makefile +++ b/src/Makefile @@ -26,7 +26,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ renameat2 t_getcwd e4compact test-nextquota punch-alternating \ attr-list-by-handle-cursor-test listxattr dio-interleaved t_dir_type \ dio-invalidate-cache stat_test t_encrypted_d_revalidate \ - attr_replace_test + attr_replace_test swapon mkswap SUBDIRS = log-writes perf diff --git a/src/mkswap.c b/src/mkswap.c new file mode 100644 index 00000000..d0bce2bd --- /dev/null +++ b/src/mkswap.c @@ -0,0 +1,83 @@ +/* mkswap(8) without any sanity checks */ + +#include +#include +#include +#include +#include +#include +#include + +struct swap_header { + char bootbits[1024]; + uint32_t version; + uint32_t last_page; + uint32_t nr_badpages; + unsigned char sws_uuid[16]; + unsigned char sws_volume[16]; + uint32_t padding[117]; + uint32_t badpages[1]; +}; + +int main(int argc, char **argv) +{ + struct swap_header *hdr; + FILE *file; + struct stat st; + long page_size; + int ret; + + if (argc != 2) { + fprintf(stderr, "usage: %s PATH\n", argv[0]); + return EXIT_FAILURE; + } + + page_size = sysconf(_SC_PAGESIZE); + if (page_size == -1) { + perror("sysconf"); + return EXIT_FAILURE; + } + + hdr = calloc(1, page_size); + if (!hdr) { + perror("calloc"); + return EXIT_FAILURE; + } + + file = fopen(argv[1], "r+"); + if (!file) { + perror("fopen"); + free(hdr); + return EXIT_FAILURE; + } + + ret = fstat(fileno(file), &st); + if (ret) { + perror("fstat"); + free(hdr); + fclose(file); + return EXIT_FAILURE; + } + + hdr->version = 1; + hdr->last_page = st.st_size / page_size - 1; + memset(&hdr->sws_uuid, 0x99, sizeof(hdr->sws_uuid)); + memcpy((char *)hdr + page_size - 10, "SWAPSPACE2", 10); + + if (fwrite(hdr, page_size, 1, file) != 1) { + perror("fwrite"); + free(hdr); + fclose(file); + return EXIT_FAILURE; + } + + if (fclose(file) == EOF) { + perror("fwrite"); + free(hdr); + return EXIT_FAILURE; + } + + free(hdr); + + return EXIT_SUCCESS; +} diff --git a/src/swapon.c b/src/swapon.c new file mode 100644 index 00000000..0cb7108a --- /dev/null +++ b/src/swapon.c @@ -0,0 +1,24 @@ +/* swapon(8) without any sanity checks; simply calls swapon(2) directly. */ + +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + int ret; + + if (argc != 2) { + fprintf(stderr, "usage: %s PATH\n", argv[0]); + return EXIT_FAILURE; + } + + ret = swapon(argv[1], 0); + if (ret) { + perror("swapon"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/tests/generic/494 b/tests/generic/494 new file mode 100755 index 00000000..28468033 --- /dev/null +++ b/tests/generic/494 @@ -0,0 +1,77 @@ +#! /bin/bash +# FS QA Test 494 +# +# Test invalid swap files. +# +#----------------------------------------------------------------------- +# Copyright (c) 2018 Facebook. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# remove previous $seqres.full before test +rm -f $seqres.full + +_supported_fs generic +_supported_os Linux +_require_scratch_swapfile +_require_test_program mkswap +_require_test_program swapon + +_scratch_mkfs >> $seqres.full 2>&1 +_scratch_mount + +echo "File with holes" +# We can't use _format_swapfile because we're using our custom mkswap and +# swapon. +touch "$SCRATCH_MNT/swap" +$CHATTR_PROG +C "$SCRATCH_MNT/swap" > /dev/null 2>&1 +chmod 0600 "$SCRATCH_MNT/swap" +$XFS_IO_PROG -c "truncate $(($(get_page_size) * 10))" "$SCRATCH_MNT/swap" +"$here/src/mkswap" "$SCRATCH_MNT/swap" +"$here/src/swapon" "$SCRATCH_MNT/swap" +swapoff "$SCRATCH_MNT/swap" > /dev/null 2>&1 + +echo "Empty swap file (only swap header)" +rm -f "$SCRATCH_MNT/swap" +touch "$SCRATCH_MNT/swap" +$CHATTR_PROG +C "$SCRATCH_MNT/swap" > /dev/null 2>&1 +chmod 0600 "$SCRATCH_MNT/swap" +_pwrite_byte 0x61 0 $(get_page_size) "$SCRATCH_MNT/swap" >> $seqres.full +"$here/src/mkswap" "$SCRATCH_MNT/swap" +"$here/src/swapon" "$SCRATCH_MNT/swap" +swapoff "$SCRATCH_MNT/swap" > /dev/null 2>&1 + +status=0 +exit diff --git a/tests/generic/494.out b/tests/generic/494.out new file mode 100644 index 00000000..bd452bb2 --- /dev/null +++ b/tests/generic/494.out @@ -0,0 +1,5 @@ +QA output created by 494 +File with holes +swapon: Invalid argument +Empty swap file (only swap header) +swapon: Invalid argument diff --git a/tests/generic/group b/tests/generic/group index 9778930a..10267414 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -496,3 +496,4 @@ 491 auto quick freeze mount 492 auto quick swap 493 auto quick swap +494 auto quick swap