fix some memory leaks
authorLaurent Mazet <mazet@softndesign.org>
Sat, 18 Jan 2025 17:35:00 +0000 (18:35 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 18 Jan 2025 17:35:00 +0000 (18:35 +0100)
fm.c
function.c

diff --git a/fm.c b/fm.c
index f740261baee06119f80913df6dccb291efc26d97..e80b665da500c64669a8d9b19eda3b29e4614dd9 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -95,7 +95,7 @@ int main (int argc, char *argv[])
                 free (dirname[panel]);
             }
             dirname[panel] = strdup (arg);
-           CHECKALLOC (dirname[panel]);
+            CHECKALLOC (dirname[panel]);
             panel = (panel + 1) % MAXPANELS;
             break;
         case 'v':
@@ -204,13 +204,16 @@ int main (int argc, char *argv[])
                 list[i] = exploredir (dirname[i]);
                 if (list[i] == NULL) {
                     endwin ();
+                    VERBOSE (ERROR, fprintf (stderr, "can't read directory '%s'\n", (dirname[i]) ? dirname[i] : "."));
                     int _i;
                     for (_i = 0; _i < MAXPANELS; _i++) {
                         free (dirname[_i]);
                         freelist (list[_i]);
                         freewindow (windir[_i]);
+                        freewindow (winelem[_i]);
                     }
-                    VERBOSE (ERROR, fprintf (stderr, "can't read directory '%s'\n", (dirname[i]) ? dirname[i] : "."));
+                    freewindow (winmenu);
+                    freewindow (winscreen);
                     return 1;
                 }
             }
@@ -479,7 +482,10 @@ int main (int argc, char *argv[])
         free (dirname[i]);
         freelist (list[i]);
         freewindow (windir[i]);
+        freewindow (winelem[i]);
     }
+    freewindow (winmenu);
+    freewindow (winscreen);
 
     return 0;
 }
@@ -493,7 +499,7 @@ int main (int argc, char *argv[])
 /* test: fm.exe _ 2>&1 | grep invalid */
 
 /* Basic 2 panels view and quit */
-/* test: { sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d . -d /dev -d .. -v 1 */
+/* test: mkfifo .a && { sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d . -d /dev -d .. -v 1 && rm .a */
 /* test: { sleep 1; echo -en '\eq'; sleep 1; echo -en '\e'; sleep 1; echo -en '\eq'; sleep 1; echo; } | fm.exe */
 
 /* Help */
@@ -503,7 +509,7 @@ int main (int argc, char *argv[])
 /* Navigation */
 /* test: { sleep 1; echo ; sleep 1; echo; sleep 1; echo -en '\tjikkkkklljllll'; sleep 1; echo -n ilk; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe */
 /* test: { sleep 1; echo -n KKKKK; sleep 1; echo -n IIIII; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d /dev -d . */
-/* test: { sleep 1; echo -n kkkkkkkkkkkkkkkkkkkkkkkk; sleep 1; echo -n iiiiiiiiiiiiiiiiiiiii; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d /dev -d . */
+/* test: { sleep 1; for i in $(seq 1 50); do echo -n k; done; sleep 1; for i in $(seq 1 60); do echo -n i; done; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d /dev -d . */
 /* test: { sleep 1; echo -n kkkkkkkkk; sleep 1; echo -n ooo; sleep 1; echo -n uu; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 */
 
 /* Filter and selection */
index 62cfd1bf357e00723dfbc27ffd3437a952d72db3..9592d95f3e8978dcfc7f191e1135355591baeac1 100644 (file)
@@ -71,7 +71,7 @@ int _log8 (int x)
 char *itoo (int x)
 {
     int n = _log8 (x);
-    char *octal = (char *) calloc (n, 1);
+    char *octal = (char *) calloc (n + 1, 1);
     CHECKALLOC (octal);
 
     int l = 0;
@@ -103,47 +103,14 @@ list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
     int i;
     size_t size = 0;
 
-    if ((type == type_unkn_e) || (type == type_reg_e)) {
+    if (type == type_reg_e) {
         char *name = newfilename (dirname, filename);
-
         struct stat sb;
         if (STAT (name, &sb) == -1) {
             VERBOSE (ERROR, fprintf (stderr, "can't stat file '%s'\n", name));
             exit (1);
         }
-
-        switch (sb.st_mode & S_IFMT) {
-        case S_IFBLK:
-            type = type_block_e;
-            break;
-        case S_IFCHR:
-            type = type_char_e;
-            break;
-        case S_IFDIR:
-            type = type_dir_e;
-            break;
-        case S_IFIFO:
-            type = type_pipe_e;
-            break;
-#ifndef WIN32
-        case S_IFLNK:
-            type = type_symb_e;
-            break;
-#endif
-        case S_IFREG:
-            type = type_reg_e;
-            break;
-#ifndef WIN32
-        case S_IFSOCK:
-            type = type_socket_e;
-            break;
-#endif
-        }
-
-        if (type == type_reg_e) {
-            size = sb.st_size;
-        }
-
+        size = sb.st_size;
         free (name);
     }
 
@@ -242,6 +209,7 @@ void getinfo (char *dirname, elem_t *elem)
         VERBOSE (ERROR, fprintf (stderr, "can't stat file '%s%s%s'\n", dirname, SEPARATOR, elem->name));
         exit (1);
     }
+    free (name);
 
     elem->mode = 0777 & sb.st_mode;
 
@@ -381,6 +349,7 @@ int filterlist (list_t *list, char *regex)
             rc = 1;
         }
     }
+    regfree (&reegex);
     return rc;
 }