1 #!/bin/sh 2 # SPDX-License-Identifier: GPL-2.0 3 # 4 # Test for mishandling of splice() on pseudofilesystems, which should catch 5 # bugs like 11990a5bd7e5 ("module: Correctly truncate sysfs sections output") 6 # 7 # Since splice fallback was removed as part of the set_fs() rework, many of these 8 # tests expect to fail now. See https://lore.kernel.org/lkml/202009181443.C2179FB@keescook/ 9 set -e 10 11 DIR=$(dirname "$0") 12 13 ret=0 14 15 expect_success() 16 { 17 title="$1" 18 shift 19 20 echo "" >&2 21 echo "$title ..." >&2 22 23 set +e 24 "$@" 25 rc=$? 26 set -e 27 28 case "$rc" in 29 0) 30 echo "ok: $title succeeded" >&2 31 ;; 32 1) 33 echo "FAIL: $title should work" >&2 34 ret=$(( ret + 1 )) 35 ;; 36 *) 37 echo "FAIL: something else went wrong" >&2 38 ret=$(( ret + 1 )) 39 ;; 40 esac 41 } 42 43 expect_failure() 44 { 45 title="$1" 46 shift 47 48 echo "" >&2 49 echo "$title ..." >&2 50 51 set +e 52 "$@" 53 rc=$? 54 set -e 55 56 case "$rc" in 57 0) 58 echo "FAIL: $title unexpectedly worked" >&2 59 ret=$(( ret + 1 )) 60 ;; 61 1) 62 echo "ok: $title correctly failed" >&2 63 ;; 64 *) 65 echo "FAIL: something else went wrong" >&2 66 ret=$(( ret + 1 )) 67 ;; 68 esac 69 } 70 71 do_splice() 72 { 73 filename="$1" 74 bytes="$2" 75 expected="$3" 76 report="$4" 77 78 out=$("$DIR"/splice_read "$filename" "$bytes" | cat) 79 if [ "$out" = "$expected" ] ; then 80 echo " matched $report" >&2 81 return 0 82 else 83 echo " no match: '$out' vs $report" >&2 84 return 1 85 fi 86 } 87 88 test_splice() 89 { 90 filename="$1" 91 92 echo " checking $filename ..." >&2 93 94 full=$(cat "$filename") 95 rc=$? 96 if [ $rc -ne 0 ] ; then 97 return 2 98 fi 99 100 two=$(echo "$full" | grep -m1 . | cut -c-2) 101 102 # Make sure full splice has the same contents as a standard read. 103 echo " splicing 4096 bytes ..." >&2 104 if ! do_splice "$filename" 4096 "$full" "full read" ; then 105 return 1 106 fi 107 108 # Make sure a partial splice see the first two characters. 109 echo " splicing 2 bytes ..." >&2 110 if ! do_splice "$filename" 2 "$two" "'$two'" ; then 111 return 1 112 fi 113 114 return 0 115 } 116 117 ### /proc/$pid/ has no splice interface; these should all fail. 118 expect_failure "proc_single_open(), seq_read() splice" test_splice /proc/$$/limits 119 expect_failure "special open(), seq_read() splice" test_splice /proc/$$/comm 120 121 ### /proc/sys/ has a splice interface; these should all succeed. 122 expect_success "proc_handler: proc_dointvec_minmax() splice" test_splice /proc/sys/fs/nr_open 123 expect_success "proc_handler: proc_dostring() splice" test_splice /proc/sys/kernel/modprobe 124 expect_success "proc_handler: special read splice" test_splice /proc/sys/kernel/version 125 126 ### /sys/ has no splice interface; these should all fail. 127 if ! [ -d /sys/module/test_module/sections ] ; then 128 expect_success "test_module kernel module load" modprobe test_module 129 fi 130 expect_success "kernfs attr splice" test_splice /sys/module/test_module/coresize 131 expect_success "kernfs binattr splice" test_splice /sys/module/test_module/sections/.init.text 132 133 exit $ret
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.