111a82d14SPhilippe Mathieu-Daudé#!/usr/bin/env bash 2*9dd003a9SVladimir Sementsov-Ogievskiy# group: rw quick 3ccc47808STomáš Golembiovský# 4ccc47808STomáš Golembiovský# Test 'offset' and 'size' options of the raw driver. Make sure we can't 5ccc47808STomáš Golembiovský# (or can) read and write outside of the image size. 6ccc47808STomáš Golembiovský# 7ccc47808STomáš Golembiovský# Copyright (C) 2016 Red Hat, Inc. 8ccc47808STomáš Golembiovský# 9ccc47808STomáš Golembiovský# This program is free software; you can redistribute it and/or modify 10ccc47808STomáš Golembiovský# it under the terms of the GNU General Public License as published by 11ccc47808STomáš Golembiovský# the Free Software Foundation; either version 2 of the License, or 12ccc47808STomáš Golembiovský# (at your option) any later version. 13ccc47808STomáš Golembiovský# 14ccc47808STomáš Golembiovský# This program is distributed in the hope that it will be useful, 15ccc47808STomáš Golembiovský# but WITHOUT ANY WARRANTY; without even the implied warranty of 16ccc47808STomáš Golembiovský# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17ccc47808STomáš Golembiovský# GNU General Public License for more details. 18ccc47808STomáš Golembiovský# 19ccc47808STomáš Golembiovský# You should have received a copy of the GNU General Public License 20ccc47808STomáš Golembiovský# along with this program. If not, see <http://www.gnu.org/licenses/>. 21ccc47808STomáš Golembiovský# 22ccc47808STomáš Golembiovský 23ccc47808STomáš Golembiovský# creator 24ccc47808STomáš Golembiovskýowner=tgolembi@redhat.com 25ccc47808STomáš Golembiovský 26ccc47808STomáš Golembiovskýseq=`basename $0` 27ccc47808STomáš Golembiovskýecho "QA output created by $seq" 28ccc47808STomáš Golembiovský 29ccc47808STomáš Golembiovskýstatus=1 # failure is the default! 30ccc47808STomáš Golembiovský 31ccc47808STomáš Golembiovský_cleanup() 32ccc47808STomáš Golembiovský{ 33ccc47808STomáš Golembiovský _cleanup_test_img 34ccc47808STomáš Golembiovský} 35ccc47808STomáš Golembiovskýtrap "_cleanup; exit \$status" 0 1 2 3 15 36ccc47808STomáš Golembiovský 37ccc47808STomáš Golembiovský# get standard environment, filters and checks 38ccc47808STomáš Golembiovský. ./common.rc 39ccc47808STomáš Golembiovský. ./common.filter 40ccc47808STomáš Golembiovský 41ccc47808STomáš Golembiovský_supported_fmt raw 4257284d2aSMax Reitz_supported_proto file fuse 43ccc47808STomáš Golembiovský_supported_os Linux 44ccc47808STomáš Golembiovský 45ccc47808STomáš Golembiovský 46ccc47808STomáš Golembiovský# Create JSON with options 47ccc47808STomáš Golembiovskýimg_json() { 48b43671f8SEric Blake printf %s 'json:{"driver":"raw", ' 49b43671f8SEric Blake printf %s "\"offset\":\"$img_offset\", " 50ccc47808STomáš Golembiovský if [ "$img_size" -ne -1 ] ; then 51b43671f8SEric Blake printf %s "\"size\":\"$img_size\", " 52ccc47808STomáš Golembiovský fi 53b43671f8SEric Blake printf %s '"file": {' 54b43671f8SEric Blake printf %s '"driver":"file", ' 55b43671f8SEric Blake printf %s "\"filename\":\"$TEST_IMG\" " 56b43671f8SEric Blake printf %s "} }" 57ccc47808STomáš Golembiovský} 58ccc47808STomáš Golembiovský 59ccc47808STomáš Golembiovskýdo_general_test() { 60ccc47808STomáš Golembiovský if [ "$img_size" -ge 0 ] ; then 61ccc47808STomáš Golembiovský test_size=$img_size 62ccc47808STomáš Golembiovský else 63ccc47808STomáš Golembiovský test_size=$((size-img_offset)) 64ccc47808STomáš Golembiovský fi 65ccc47808STomáš Golembiovský 66ccc47808STomáš Golembiovský echo 67ccc47808STomáš Golembiovský echo "write to image" 68ccc47808STomáš Golembiovský $QEMU_IO -c "write -P 0x0a 0 $test_size" "$(img_json)" | _filter_qemu_io 69ccc47808STomáš Golembiovský 70ccc47808STomáš Golembiovský echo 71ccc47808STomáš Golembiovský echo "read the image" 72ccc47808STomáš Golembiovský $QEMU_IO -c "read -P 0x0a 0 $test_size" "$(img_json)" | _filter_qemu_io 73ccc47808STomáš Golembiovský 74ccc47808STomáš Golembiovský echo 75ccc47808STomáš Golembiovský echo "check that offset is respected" 76ccc47808STomáš Golembiovský $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io 77ccc47808STomáš Golembiovský 78ccc47808STomáš Golembiovský echo 79ccc47808STomáš Golembiovský echo "write before image boundary" 80ccc47808STomáš Golembiovský $QEMU_IO -c "write $((test_size-1)) 1" "$(img_json)" | _filter_qemu_io 81ccc47808STomáš Golembiovský 82ccc47808STomáš Golembiovský echo 83ccc47808STomáš Golembiovský echo "write across image boundary" 84ccc47808STomáš Golembiovský $QEMU_IO -c "write $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io 85ccc47808STomáš Golembiovský 86ccc47808STomáš Golembiovský echo 87ccc47808STomáš Golembiovský echo "write at image boundary" 88ccc47808STomáš Golembiovský $QEMU_IO -c "write $test_size 1" "$(img_json)" | _filter_qemu_io 89ccc47808STomáš Golembiovský 90ccc47808STomáš Golembiovský echo 91ccc47808STomáš Golembiovský echo "write after image boundary" 92ccc47808STomáš Golembiovský $QEMU_IO -c "write $((test_size+512)) 1" "$(img_json)" | _filter_qemu_io 93ccc47808STomáš Golembiovský 94ccc47808STomáš Golembiovský echo 95ccc47808STomáš Golembiovský echo "writev before/after image boundary" 96ccc47808STomáš Golembiovský $QEMU_IO -c "writev $((test_size-512)) 512 512" "$(img_json)" | _filter_qemu_io 97ccc47808STomáš Golembiovský 98ccc47808STomáš Golembiovský echo 99ccc47808STomáš Golembiovský echo "read before image boundary" 100ccc47808STomáš Golembiovský $QEMU_IO -c "read $((test_size-1)) 1" "$(img_json)" | _filter_qemu_io 101ccc47808STomáš Golembiovský 102ccc47808STomáš Golembiovský echo 103ccc47808STomáš Golembiovský echo "read across image boundary" 104ccc47808STomáš Golembiovský $QEMU_IO -c "read $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io 105ccc47808STomáš Golembiovský 106ccc47808STomáš Golembiovský echo 107ccc47808STomáš Golembiovský echo "read at image boundary" 108ccc47808STomáš Golembiovský $QEMU_IO -c "read $test_size 1" "$(img_json)" | _filter_qemu_io 109ccc47808STomáš Golembiovský 110ccc47808STomáš Golembiovský echo 111ccc47808STomáš Golembiovský echo "read after image boundary" 112ccc47808STomáš Golembiovský $QEMU_IO -c "read $((test_size+512)) 1" "$(img_json)" | _filter_qemu_io 113ccc47808STomáš Golembiovský 114ccc47808STomáš Golembiovský echo 115ccc47808STomáš Golembiovský echo "readv before/after image boundary" 116ccc47808STomáš Golembiovský $QEMU_IO -c "readv $((test_size-512)) 512 512" "$(img_json)" | _filter_qemu_io 117ccc47808STomáš Golembiovský 118ccc47808STomáš Golembiovský echo 119ccc47808STomáš Golembiovský echo "fill image with pattern" 120ccc47808STomáš Golembiovský $QEMU_IO -c "write -P 0x0a 0 $size" $TEST_IMG | _filter_qemu_io 121ccc47808STomáš Golembiovský 122ccc47808STomáš Golembiovský echo 123ccc47808STomáš Golembiovský echo "write zeroes and check" 124ccc47808STomáš Golembiovský $QEMU_IO -c "write -z 0 512" "$(img_json)" | _filter_qemu_io 125ccc47808STomáš Golembiovský $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io 126ccc47808STomáš Golembiovský 127ccc47808STomáš Golembiovský echo 128ccc47808STomáš Golembiovský echo "write zeroes across image boundary" 129ccc47808STomáš Golembiovský $QEMU_IO -c "write -z $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io 130ccc47808STomáš Golembiovský 131ccc47808STomáš Golembiovský echo 132ccc47808STomáš Golembiovský echo "write zeroes at image boundary and check" 133ccc47808STomáš Golembiovský $QEMU_IO -c "write -z $((test_size-2)) 2" "$(img_json)" | _filter_qemu_io 134ccc47808STomáš Golembiovský $QEMU_IO -c "read -v $((img_offset+test_size-2)) 2" $TEST_IMG | _filter_qemu_io 135ccc47808STomáš Golembiovský $QEMU_IO -c "read -v $((img_offset+test_size)) 2" $TEST_IMG | _filter_qemu_io 136ccc47808STomáš Golembiovský 137ccc47808STomáš Golembiovský echo 138ccc47808STomáš Golembiovský echo "fill image with pattern" 139ccc47808STomáš Golembiovský $QEMU_IO -c "write -P 0x0a 0 $size" $TEST_IMG | _filter_qemu_io 140ccc47808STomáš Golembiovský 141ccc47808STomáš Golembiovský echo 142ccc47808STomáš Golembiovský echo "discard and check" 143ccc47808STomáš Golembiovský $QEMU_IO -c "discard 0 512" "$(img_json)" | _filter_qemu_io 144ccc47808STomáš Golembiovský $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io 145ccc47808STomáš Golembiovský 146ccc47808STomáš Golembiovský echo 147ccc47808STomáš Golembiovský echo "discard across image boundary" 148ccc47808STomáš Golembiovský $QEMU_IO -c "discard $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io 149ccc47808STomáš Golembiovský 150ccc47808STomáš Golembiovský echo 151ccc47808STomáš Golembiovský echo "discard at image boundary and check" 152ccc47808STomáš Golembiovský $QEMU_IO -c "discard $((test_size-2)) 2" "$(img_json)" | _filter_qemu_io 153ccc47808STomáš Golembiovský $QEMU_IO -c "read -v $((img_offset+test_size-2)) 2" $TEST_IMG | _filter_qemu_io 154ccc47808STomáš Golembiovský $QEMU_IO -c "read -v $((img_offset+test_size)) 2" $TEST_IMG | _filter_qemu_io 155ccc47808STomáš Golembiovský} 156ccc47808STomáš Golembiovský 157ccc47808STomáš Golembiovskýecho 158ccc47808STomáš Golembiovskýecho "== test 'offset' option ==" 159ccc47808STomáš Golembiovskýsize=4096 160ccc47808STomáš Golembiovskýimg_offset=512 161ccc47808STomáš Golembiovskýimg_size=-1 162ccc47808STomáš Golembiovský_make_test_img $size 163ccc47808STomáš Golembiovskýdo_general_test 164ccc47808STomáš Golembiovský_cleanup_test_img 165ccc47808STomáš Golembiovský 166ccc47808STomáš Golembiovskýecho 167ccc47808STomáš Golembiovskýecho "== test 'offset' and 'size' options ==" 168ccc47808STomáš Golembiovskýsize=4096 169ccc47808STomáš Golembiovskýimg_offset=512 170ccc47808STomáš Golembiovskýimg_size=2048 171ccc47808STomáš Golembiovský_make_test_img $size 172ccc47808STomáš Golembiovskýdo_general_test 173ccc47808STomáš Golembiovský_cleanup_test_img 174ccc47808STomáš Golembiovský 175ccc47808STomáš Golembiovskýecho 176ccc47808STomáš Golembiovskýecho "== test misaligned 'offset' ==" 177ccc47808STomáš Golembiovskýsize=4096 178ccc47808STomáš Golembiovskýimg_offset=10 179ccc47808STomáš Golembiovskýimg_size=2048 180ccc47808STomáš Golembiovský_make_test_img $size 181ccc47808STomáš Golembiovskýdo_general_test 182ccc47808STomáš Golembiovský_cleanup_test_img 183ccc47808STomáš Golembiovský 184ccc47808STomáš Golembiovskýecho 185ccc47808STomáš Golembiovskýecho "== test reopen ==" 186ccc47808STomáš Golembiovskýsize=4096 187ccc47808STomáš Golembiovskýimg_offset=512 188ccc47808STomáš Golembiovskýimg_size=512 189ccc47808STomáš Golembiovský_make_test_img $size 190ccc47808STomáš Golembiovský( 191ccc47808STomáš Golembiovský$QEMU_IO "$(img_json)" <<EOT 192ccc47808STomáš Golembiovskýwrite -P 0x0a 0 512 193ccc47808STomáš Golembiovskýwrite -P 0x0a 511 1 194ccc47808STomáš Golembiovskýwrite -P 0x0a 512 1 195ccc47808STomáš Golembiovskýreopen -o driver=raw,offset=1536,size=1024 196ccc47808STomáš Golembiovskýwrite -P 0x0a 0 1024 197ccc47808STomáš Golembiovskýwrite -P 0x0a 1023 1 198ccc47808STomáš Golembiovskýwrite -P 0x0a 1024 1 199ccc47808STomáš GolembiovskýEOT 200ccc47808STomáš Golembiovský) | _filter_qemu_io 201ccc47808STomáš Golembiovskýecho "checking boundaries" 202ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 510 4" $TEST_IMG | _filter_qemu_io 203ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 1022 4" $TEST_IMG | _filter_qemu_io 204ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 1534 4" $TEST_IMG | _filter_qemu_io 205ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 2558 4" $TEST_IMG | _filter_qemu_io 206ccc47808STomáš Golembiovský_cleanup_test_img 207ccc47808STomáš Golembiovský 208ccc47808STomáš Golembiovský# success, all done 209ccc47808STomáš Golembiovskýecho 210ccc47808STomáš Golembiovskýecho "*** done" 211ccc47808STomáš Golembiovskýrm -f $seq.full 212ccc47808STomáš Golembiovskýstatus=0 213