]> Sergey Matveev's repositories - nnn.git/commitdiff
fix: properly update mode after xchmod
authorNRK <nrk@disroot.org>
Fri, 26 May 2023 13:27:07 +0000 (19:27 +0600)
committerNRK <nrk@disroot.org>
Fri, 26 May 2023 13:31:00 +0000 (19:31 +0600)
xchmod now returns the new mode through a pointer, no need to assume all
executable bits were toggled.

Closes: https://github.com/jarun/nnn/issues/1657
src/nnn.c

index 6bd82d2d2dd81f7fc43544b7f4191a1733bbb69b..592a083a92b31c20d6b0111692d4634b25a8ba34 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -4604,12 +4604,12 @@ static bool show_stats(char *fpath)
        return TRUE;
 }
 
-static bool xchmod(const char *fpath, mode_t mode)
+static bool xchmod(const char *fpath, mode_t *mode)
 {
        /* (Un)set (S_IXUSR | S_IXGRP | S_IXOTH) */
-       (0100 & mode) ? (mode &= ~0111) : (mode |= 0111);
+       (0100 & *mode) ? (*mode &= ~0111) : (*mode |= 0111);
 
-       return (chmod(fpath, mode) == 0);
+       return (chmod(fpath, *mode) == 0);
 }
 
 static size_t get_fs_info(const char *path, uchar_t type)
@@ -7381,13 +7381,13 @@ nochange:
 
                                if ((sel == SEL_STATS && !show_stats(newpath))
                                    || (lstat(newpath, &sb) == -1)
-                                   || (sel == SEL_CHMODX && !xchmod(newpath, sb.st_mode))) {
+                                   || (sel == SEL_CHMODX && !xchmod(newpath, &sb.st_mode))) {
                                        printwarn(&presel);
                                        goto nochange;
                                }
 
                                if (sel == SEL_CHMODX)
-                                       pdents[cur].mode ^= 0111;
+                                       pdents[cur].mode = sb.st_mode;
                        }
                        break;
                case SEL_REDRAW: // fallthrough