aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2026-02-05 17:41:56 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2026-02-05 19:40:35 +0000
commitf8c12e6e3874cdd353fb16785da6f4e7eb134cd9 (patch)
tree617d4f93d7f01ce3549aacdb1843966e63fe0b99
parent5379c4627782ebb2619f95a5784361c88472c8b5 (diff)
diff: Report I/O errors in Stone algorithm
In the legacy Stone algorithm, we do a first pass over the files to check if they're identical before we start diffing them. That code would correctly set the exit status if an I/O error was encountered, but would not emit an error message. Do so. PR: 292198 MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: thj Differential Revision: https://reviews.freebsd.org/D55125
-rw-r--r--usr.bin/diff/diffreg.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/usr.bin/diff/diffreg.c b/usr.bin/diff/diffreg.c
index 95c724817ede..8dcf55a7190b 100644
--- a/usr.bin/diff/diffreg.c
+++ b/usr.bin/diff/diffreg.c
@@ -406,6 +406,10 @@ diffreg_stone(char *file1, char *file2, int flags, int capsicum)
break;
default:
/* error */
+ if (ferror(f1))
+ warn("%s", file1);
+ if (ferror(f2))
+ warn("%s", file2);
rval = D_ERROR;
status |= 2;
goto closem;
@@ -499,9 +503,9 @@ files_differ(FILE *f1, FILE *f2, int flags)
return (0);
for (;;) {
- i = fread(buf1, 1, sizeof(buf1), f1);
- j = fread(buf2, 1, sizeof(buf2), f2);
- if ((!i && ferror(f1)) || (!j && ferror(f2)))
+ if ((i = fread(buf1, 1, sizeof(buf1), f1)) == 0 && ferror(f1))
+ return (-1);
+ if ((j = fread(buf2, 1, sizeof(buf2), f2)) == 0 && ferror(f2))
return (-1);
if (i != j)
return (1);