]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
tests: dd: ensure posix_fadvise errors are handled
authorPádraig Brady <P@draigBrady.com>
Mon, 10 Mar 2025 12:33:20 +0000 (12:33 +0000)
committerPádraig Brady <P@draigBrady.com>
Mon, 10 Mar 2025 12:46:14 +0000 (12:46 +0000)
* tests/dd/nocache_fail.sh: Add a test case for the recent fix.

tests/dd/nocache_fail.sh [new file with mode: 0755]
tests/local.mk

diff --git a/tests/dd/nocache_fail.sh b/tests/dd/nocache_fail.sh
new file mode 100755 (executable)
index 0000000..4d30c85
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/sh
+# Ensure we diagnose failure to drop caches
+# We didn't check the return from posix_fadvise() correctly before v9.7
+
+# Copyright (C) 2025 Free Software Foundation, Inc.
+
+# 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, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will 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, see <https://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ dd
+require_gcc_shared_
+
+# Replace each getxattr and lgetxattr call with a call to these stubs.
+# Count those and write the total number of calls to the file "x"
+# via a global destructor.
+cat > k.c <<'EOF' || framework_failure_
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+int posix_fadvise (int fd, off_t offset, off_t len, int advice)
+{
+  fopen ("called", "w");
+  return ENOTSUP;  /* Simulate non standard error indication.  */
+}
+EOF
+
+# Then compile/link it:
+gcc_shared_ k.c k.so \
+  || framework_failure_ 'failed to build shared library'
+
+touch ifile || framework_failure_
+
+LD_PRELOAD=$LD_PRELOAD:./k.so dd if=ifile iflag=nocache count=0 2>err
+ret=$?
+
+test -f called || skip_ "internal test failure: maybe LD_PRELOAD doesn't work?"
+
+grep 'dd: failed to discard cache for: ifile' err || fail=1
+
+# Ensure that the dd command failed
+test "$ret" = 1 || fail=1
+
+Exit $fail
index 12e30b449b823230fa8155c2ec464141d80cd02d..4da6756ac632e06d376f643346373701c192058e 100644 (file)
@@ -553,6 +553,7 @@ all_tests =                                 \
   tests/dd/no-allocate.sh                      \
   tests/dd/nocache.sh                          \
   tests/dd/nocache_eof.sh                      \
+  tests/dd/nocache_fail.sh                     \
   tests/dd/not-rewound.sh                      \
   tests/dd/reblock.sh                          \
   tests/dd/skip-seek.pl                                \