Ethereal-dev: [Ethereal-dev] get_persconffile_path mess (more memleak fixes)

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Joerg Mayer <jmayer@xxxxxxxxx>
Date: Tue, 30 Jul 2002 08:12:42 +0200
OK, some more memleaks found by valgrind fixed. Nothing serious, but
it is a clear indication that allocating a buffer in a function and
leaving the task of freeing to the calling function (or the function
calling the calling function) simply doesn't work. Unfortunately, I
havn't come up with a better idea either, so I'll just attach the
fixes. Please check before applying.

 Ciao
  Jörg
--
Joerg Mayer                                          <jmayer@xxxxxxxxx>
I found out that "pro" means "instead of" (as in proconsul). Now I know
what proactive means.
Changelog: <jmayer@xxxxxxxxx>
 prefs.c, prefs.h, tethereal.c, gtk/main.c, gtk/prefs_dlg.c:
	Fix a few more memleaks found by valgrind (all deriving
	from the get_persconffile_path mess).

Index: ethereal/prefs.c
===================================================================
RCS file: /cvsroot/ethereal/prefs.c,v
retrieving revision 1.86
diff -u -r1.86 prefs.c
--- prefs.c	2002/06/16 00:58:37	1.86
+++ prefs.c	2002/07/30 05:53:40
@@ -721,7 +721,7 @@
    return NULL. */
 e_prefs *
 read_prefs(int *gpf_errno_return, char **gpf_path_return,
-	   int *pf_errno_return, const char **pf_path_return)
+	   int *pf_errno_return, char **pf_path_return)
 {
   int         i;
   const char *pf_path;
@@ -876,6 +876,8 @@
     /* We succeeded in opening it; read it. */
     read_prefs_file(pf_path, pf);
     fclose(pf);
+    g_free(pf_path);
+    pf_path = NULL;
   } else {
     /* We failed to open it.  If we failed for some reason other than
        "it doesn't exist", return the errno and the pathname, so our
@@ -1662,7 +1664,7 @@
    If we got an error, stuff a pointer to the path of the preferences file
    into "*pf_path_return", and return the errno. */
 int
-write_prefs(const char **pf_path_return)
+write_prefs(char **pf_path_return)
 {
   const char  *pf_path;
   FILE        *pf;
Index: ethereal/prefs.h
===================================================================
RCS file: /cvsroot/ethereal/prefs.h,v
retrieving revision 1.38
diff -u -r1.38 prefs.h
--- prefs.h	2002/05/11 18:58:02	1.38
+++ prefs.h	2002/07/30 05:53:40
@@ -202,13 +202,13 @@
    the user's preferences file, stuff the errno into "*pf_errno_return"
    and a pointer to the path of the file into "*pf_path_return", and
    return NULL. */
-extern e_prefs *read_prefs(int *, char **, int *, const char **);
+extern e_prefs *read_prefs(int *, char **, int *, char **);
 
 /* Write out "prefs" to the user's preferences file, and return 0.
 
    If we got an error, stuff a pointer to the path of the preferences file
    into "*pf_path_return", and return the errno. */
-extern int write_prefs(const char **);
+extern int write_prefs(char **);
 
 /* Copy a set of preferences. */
 extern void copy_prefs(e_prefs *dest, e_prefs *src);
Index: ethereal/tethereal.c
===================================================================
RCS file: /cvsroot/ethereal/tethereal.c,v
retrieving revision 1.149
diff -u -r1.149 tethereal.c
--- tethereal.c	2002/07/17 00:22:12	1.149
+++ tethereal.c	2002/07/30 05:53:41
@@ -313,7 +313,7 @@
 #endif
 
   char                *gpf_path;
-  const char          *pf_path;
+  char                *pf_path;
   int                  gpf_open_errno, pf_open_errno;
   int                  err;
 #ifdef HAVE_LIBPCAP
@@ -377,6 +377,8 @@
   if (pf_path != NULL) {
     fprintf(stderr, "Can't open your preferences file \"%s\": %s.\n", pf_path,
         strerror(pf_open_errno));
+    g_free(pf_path);
+    pf_path = NULL;
   }
 
   /* Set the name resolution code's flags from the preferences. */
Index: ethereal/gtk/main.c
===================================================================
RCS file: /cvsroot/ethereal/gtk/main.c,v
retrieving revision 1.255
diff -u -r1.255 main.c
--- main.c	2002/07/07 22:14:03	1.255
+++ main.c	2002/07/30 05:53:42
@@ -1213,7 +1213,7 @@
 #endif
 
   char                *gpf_path, *cf_path, *df_path;
-  const char          *pf_path;
+  char                *pf_path;
   int                  gpf_open_errno, pf_open_errno, cf_open_errno, df_open_errno;
   int                  err;
 #ifdef HAVE_LIBPCAP
@@ -1953,6 +1953,8 @@
       simple_dialog(ESD_TYPE_WARN, NULL,
         "Could not open your preferences file\n\"%s\": %s.", pf_path,
         strerror(pf_open_errno));
+      g_free(pf_path);
+      pf_path = NULL;
   }
 
   /* If the user's capture filter file exists but we failed to open it,
@@ -2060,6 +2062,9 @@
 		if (prefs_write_needed) {
 			write_prefs(&pf_path);
 		}
+	} else {
+		/* Ignore errors silently */
+		g_free(pf_path);
 	}
 	
   epan_cleanup();
Index: ethereal/gtk/prefs_dlg.c
===================================================================
RCS file: /cvsroot/ethereal/gtk/prefs_dlg.c,v
retrieving revision 1.49
diff -u -r1.49 prefs_dlg.c
--- prefs_dlg.c	2002/07/17 00:22:30	1.49
+++ prefs_dlg.c	2002/07/30 05:53:43
@@ -914,7 +914,7 @@
   gboolean must_redissect = FALSE;
   int err;
   char *pf_dir_path;
-  const char *pf_path;
+  char *pf_path;
 
   /* Fetch the preferences (i.e., make sure all the values set in all of
      the preferences panes have been copied to "prefs" and the registered
@@ -950,6 +950,7 @@
        simple_dialog(ESD_TYPE_WARN, NULL,
         "Can't open preferences file\n\"%s\": %s.", pf_path,
         strerror(err));
+       g_free(pf_path);
     }
   }