The branch main has been updated by bapt:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=fefb3c46a80fdde6f307e73a2b5b5aed806df1ce

commit fefb3c46a80fdde6f307e73a2b5b5aed806df1ce
Author:     Jamie Landeg-Jones <[email protected]>
AuthorDate: 2021-01-25 17:42:26 +0000
Commit:     Baptiste Daroussin <[email protected]>
CommitDate: 2021-01-25 19:38:18 +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
---
 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;
        }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "[email protected]"

Reply via email to