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