From: Laurent Mazet Date: Sat, 18 Jan 2025 17:35:00 +0000 (+0100) Subject: fix some memory leaks X-Git-Tag: v1.0~27 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=6b81b880c3621b30085ca15f9ae7562323e4671f;p=fm.git fix some memory leaks --- diff --git a/fm.c b/fm.c index f740261..e80b665 100644 --- 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 */ diff --git a/function.c b/function.c index 62cfd1b..9592d95 100644 --- a/function.c +++ b/function.c @@ -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; }