avoid losing user x bit on directory
authorLaurent Mazet <mazet@softndesign.org>
Fri, 24 Jan 2025 11:26:11 +0000 (12:26 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Fri, 24 Jan 2025 11:26:11 +0000 (12:26 +0100)
function.c

index e4d2390c5b084657b8ecaf81c0048a25c9bae3e0..37a911ff8dd4ece6501789f6d44b411fd1f4e429 100644 (file)
@@ -101,7 +101,7 @@ list_t *alloclist (void)
 
 list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
 {
-    struct stat sb;
+    struct stat sb = {0};
     char *name = newfilename (dirname, filename);
     STAT (name, &sb);
 
@@ -146,7 +146,7 @@ list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
     list->tab = (elem_t *) realloc (list->tab, list->nb * sizeof (elem_t));
     CHECKALLOC (list->tab);
     memset (list->tab + list->nb - 1, 0, sizeof (elem_t));
-    elem_t * elem = list->tab;
+    elem_t *elem = list->tab;
     int i;
     for (i = list->nb - 1; i > 0; i--) {
         if (strcmp ((list->tab + i - 1)->name, filename) < 0) {
@@ -164,7 +164,7 @@ list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
     elem->size = size;
 #ifndef WIN32
     if (type == type_symb_e) {
-        struct stat sb;
+        struct stat sb = {0};
         if (stat (name, &sb) == -1) {
             type = type_erlk_e;
         } else if ((sb.st_mode & S_IFMT) == S_IFDIR) {
@@ -463,7 +463,7 @@ char *processcopy (char *dest, char *src)
 {
     char *msg = NULL;
 
-    struct stat sb;
+    struct stat sb = {0};
     if (STAT (src, &sb) == 0) {
         if ((sb.st_mode & S_IFMT) == S_IFDIR) {
             char *basename = strrchr (src, *SEPARATOR);
@@ -497,7 +497,7 @@ char *processcopy (char *dest, char *src)
             basename = (basename) ? basename + 1 : src;
             VERBOSE (DEBUG, fprintf (stderr, "basename '%s'\n", basename));
             char *newdest = newfilename (dest, basename);
-            struct stat sb;
+            struct stat sb = {0};
             if (STAT (newdest, &sb) == 0) {
                 msg = strdupcat ("File '", newdest, "' already exists", NULL);
             } else {
@@ -518,7 +518,7 @@ char *processdelete (char *name)
 {
     char *msg = NULL;
 
-    struct stat sb;
+    struct stat sb = {0};
     if (STAT (name, &sb) == 0) {
         if ((sb.st_mode & S_IFMT) == S_IFDIR) {
             DIR *dir = opendir (name);
@@ -572,7 +572,7 @@ char *processmove (char *dest, char *src)
 {
     char *msg = NULL;
 
-    struct stat sb;
+    struct stat sb = {0};
     errno = 0;
     int rc = STAT (dest, &sb);
     if ((rc == -1) && (errno == ENOENT)) {
@@ -594,7 +594,7 @@ char *processchmod (char *name, int mode)
 {
     char *msg = NULL;
 
-    struct stat sb;
+    struct stat sb = {0};
     if (STAT (name, &sb) == 0) {
         char *octal = itoo (mode);
         if ((sb.st_mode & S_IFMT) == S_IFDIR) {
@@ -613,7 +613,7 @@ char *processchmod (char *name, int mode)
                 closedir (dir);
                 if (msg == NULL) {
                     VERBOSE (DEBUG, fprintf (stderr, "chmod '%s' to 0%o\n", name, mode));
-                    if (chmod (name, mode) != 0) {
+                    if (chmod (name, mode | 0100) != 0) {
                         msg = strdupcat ("Can't change mode ", octal, " for directory '", name, "'", NULL);
                     }
                 }