Date: Mon, 1 Feb 2021 13:05:31 GMT From: Baptiste Daroussin <bapt@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 3728c4d31495 - stable/13 - diff: fix incorrectly displaying files as duplicates Message-ID: <202102011305.111D5VpX026662@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by bapt: URL: https://cgit.FreeBSD.org/src/commit/?id=3728c4d3149553967532a97254737bdb2cd92417 commit 3728c4d3149553967532a97254737bdb2cd92417 Author: Jamie Landeg-Jones <jamie@catflap.org> AuthorDate: 2021-01-25 17:42:26 +0000 Commit: Baptiste Daroussin <bapt@FreeBSD.org> CommitDate: 2021-02-01 13:05:25 +0000 diff: fix incorrectly displaying files as duplicates When diff hits certain access errors, function diffreg() shows the error message, and then returns to the calling function, which calls print_status() with the return value. However, in these cases, the return value isn't changed from the initial default value of D_SAME. Normally, print_status() with a value of D_SAME does nothing, so this works out ok, however, if the "-s" flag is set, a message is displayed showing identicality: case D_SAME: if (sflag) printf("Files %s%s and %s%s are identical\n", path1, entry, path2, entry); break; This then produces such results as: % diff -s /COPYRIGHT /var/run/rpcbind.sock diff: /var/run/rpcbind.sock: Operation not supported Files /COPYRIGHT and /var/run/rpcbind.sock are identical % diff -s /COPYRIGHT /etc/master.passwd diff: /etc/master.passwd: Permission denied Files /COPYRIGHT and /etc/master.passwd are identical Create a D_ERROR status which is returned in such cases, and print_status() then deals with that status seperately from D_SAME PR: 252614 MFC after: 1 week (cherry picked from commit fefb3c46a80fdde6f307e73a2b5b5aed806df1ce) --- usr.bin/diff/diff.c | 2 ++ usr.bin/diff/diff.h | 1 + usr.bin/diff/diffreg.c | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/usr.bin/diff/diff.c b/usr.bin/diff/diff.c index 0e46b96f9667..1bad6226f49d 100644 --- a/usr.bin/diff/diff.c +++ b/usr.bin/diff/diff.c @@ -511,6 +511,8 @@ print_status(int val, char *path1, char *path2, const char *entry) printf("File %s%s is not a regular file or directory and was skipped\n", path2, entry); break; + case D_ERROR: + break; } } diff --git a/usr.bin/diff/diff.h b/usr.bin/diff/diff.h index 30387610fc19..1974b5cc08d6 100644 --- a/usr.bin/diff/diff.h +++ b/usr.bin/diff/diff.h @@ -83,6 +83,7 @@ #define D_MISMATCH2 4 /* path1 was a file, path2 a dir */ #define D_SKIPPED1 5 /* path1 was a special file */ #define D_SKIPPED2 6 /* path2 was a special file */ +#define D_ERROR 7 /* A file access error occurred */ struct excludes { char *pattern; diff --git a/usr.bin/diff/diffreg.c b/usr.bin/diff/diffreg.c index 7d2b20b43def..4e887ab27c7b 100644 --- a/usr.bin/diff/diffreg.c +++ b/usr.bin/diff/diffreg.c @@ -299,6 +299,7 @@ diffreg(char *file1, char *file2, int flags, int capsicum) if ((f1 = opentemp(file1)) == NULL || fstat(fileno(f1), &stb1) == -1) { warn("%s", file1); + rval = D_ERROR; status |= 2; goto closem; } @@ -309,6 +310,7 @@ diffreg(char *file1, char *file2, int flags, int capsicum) } if (f1 == NULL) { warn("%s", file1); + rval = D_ERROR; status |= 2; goto closem; } @@ -320,6 +322,7 @@ diffreg(char *file1, char *file2, int flags, int capsicum) if ((f2 = opentemp(file2)) == NULL || fstat(fileno(f2), &stb2) == -1) { warn("%s", file2); + rval = D_ERROR; status |= 2; goto closem; } @@ -330,6 +333,7 @@ diffreg(char *file1, char *file2, int flags, int capsicum) } if (f2 == NULL) { warn("%s", file2); + rval = D_ERROR; status |= 2; goto closem; } @@ -365,6 +369,7 @@ diffreg(char *file1, char *file2, int flags, int capsicum) break; default: /* error */ + rval = D_ERROR; status |= 2; goto closem; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202102011305.111D5VpX026662>