The individual patches no longer seem to exist, so I submit them together. According to debian/changelog entries by Arthur Korn <art...@debian.org>, these patches include: * fixed memleak introduced in 0.34-2 with the patch by Timo Benk. global char *mp[] was assigned the result of stdup() repeatedly without free. My ugly fix is to free it all up at the beginning of readFileSystems(). Now I'm a proud Perl coder ... closes: #196057 * memleak news: avoid it if there are more than 9 filesystems too. * Fixed filesystem name corruption, thanks to Ralf Horstmann and Cristian Ionescu-Idbohrn for the patch. --- wmfsm/wmfsm/wmfsm.c | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-)
diff --git a/wmfsm/wmfsm/wmfsm.c b/wmfsm/wmfsm/wmfsm.c index a82e57f..8c1805a 100644 --- a/wmfsm/wmfsm/wmfsm.c +++ b/wmfsm/wmfsm/wmfsm.c @@ -38,6 +38,7 @@ #include <stdio.h> #include <unistd.h> #include <stdlib.h> +#include <ctype.h> #include <string.h> #include <X11/X.h> #include <X11/xpm.h> @@ -78,7 +79,6 @@ # define STATFS(a,b) statfs(a,b) /* Maybe configure got messed up */ #endif - /* #if defined IRIX64 # include <sys/types.h> @@ -228,7 +228,7 @@ main(int argc, char *argv[]) if (numberfs > 4) { for (i = 0, dy = 0; i < numberfs; i++) { - for (j = 0, dx = 0; j < LENMP && j < strlen(mp[i]); j++) { + for (j = 0, dx = 0; j < LENMP && (unsigned int)j < strlen(mp[i]); j++) { k = j + (strlen(mp[i]) > LENMP ? strlen(mp[i]) - LENMP : 0); c = (int) mp[i][k]; switch (c) { @@ -284,7 +284,7 @@ main(int argc, char *argv[]) } else { /*one fs in two lines */ for (i = 0, dy = 0; i < numberfs; i++) { - for (j = 0, dx = 0; j < 10 && j < strlen(mp[i]); j++) { + for (j = 0, dx = 0; j < 10 && (unsigned int)j < strlen(mp[i]); j++) { c = (int) mp[i][j + (strlen(mp[i]) > 10 ? strlen(mp[i]) - 10 : 0)]; switch (c) { case '/': @@ -337,7 +337,7 @@ main(int argc, char *argv[]) } } if (numberfs < 9) { - for (j = 0, dx = 0, dy = 47; j < 10 && j < strlen(hostname); j++) { + for (j = 0, dx = 0, dy = 47; j < 10 && (unsigned int)j < strlen(hostname); j++) { c = (int) hostname[j]; switch (c) { case '/': @@ -394,7 +394,7 @@ void ParseCMDLine(int argc, char *argv[]) { - int c, option_index, arg; + int c, option_index; static struct option long_options[] = { {"fire", no_argument, 0, 'f'}, {"normal", no_argument, 0, 'n'}, @@ -453,6 +453,7 @@ print_usage() void pressEvent(XButtonEvent * xev) { + (void)xev; ForceUpdate = 1; return; } @@ -460,6 +461,14 @@ pressEvent(XButtonEvent * xev) void readFileSystems() { + /* Wipe mp[] */ + int i; + for (i = 0; i < 100; i++) + if (mp[i]) { + free(mp[i]); + mp[i]=0; + } + /* Look for the goods between #if defined(__OpenBSD__) -- tschroed */ #if defined(__OpenBSD__) || defined(__FreeBSD__) #define MAXMOUNT 32 @@ -517,6 +526,7 @@ readFileSystems() 1 #endif ) { + if (mp[numberfs]) free(mp[numberfs]); mp[numberfs++] = strdup(mountPoint); } } @@ -532,7 +542,7 @@ excludeFileSystems() char confFileName[255]; char workString[255]; int i, j, exnumberfs = 0; - int start = 0, excluded, finalnumberfs = 0; + int excluded, finalnumberfs = 0; char *mount_points[100]; FILE *confFile; int include = -1; @@ -569,11 +579,11 @@ excludeFileSystems() } else { numberfs = numberfs > 9 ? 9 : numberfs; - return; + goto CLEANUP; } if (!exnumberfs) { numberfs = numberfs > 9 ? 9 : numberfs; - return; + goto CLEANUP; } excluded = 0; for (i = 0; i < numberfs; i++) { @@ -584,13 +594,22 @@ excludeFileSystems() included = 1; } } - if ((!excluded && !include) || (included && include)) - mp[finalnumberfs++] = strdup(mp[i]); + if ((!excluded && !include) || (included && include)) { + if (finalnumberfs == i) { + finalnumberfs++; + } else { + if (mp[finalnumberfs]) free(mp[finalnumberfs]); + mp[finalnumberfs++] = strdup(mp[i]); + } + } included = excluded = 0; } + numberfs = finalnumberfs > 9 ? 9 : finalnumberfs; + +CLEANUP: for (j = 0; j < exnumberfs; j++) + if (mount_points[j]) { free(mount_points[j]); - for (j = finalnumberfs; j < numberfs; j++) - free(mp[j]); - numberfs = finalnumberfs > 9 ? 9 : finalnumberfs; + mount_points[j]=0; + } } -- 2.1.0 -- To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.