lib: Fix memory leak when debugging enabled (found by valgrind).
[libguestfs.git] / daemon / guestfsd.c
index 51bb0b7..38cfd1a 100644 (file)
@@ -13,7 +13,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #include <config.h>
@@ -239,6 +239,11 @@ main (int argc, char *argv[])
   _umask (0);
 #endif
 
+  /* Make a private copy of /etc/lvm so we can change the config (see
+   * daemon/lvm-filter.c).
+   */
+  copy_lvm ();
+
   /* Connect to virtio-serial channel. */
   int sock = open (VIRTIO_SERIAL_CHANNEL, O_RDWR | O_CLOEXEC);
   if (sock == -1) {
@@ -410,10 +415,9 @@ xread (int sock, void *v_buf, size_t len)
 }
 
 int
-add_string (char ***argv, int *size, int *alloc, const char *str)
+add_string_nodup (char ***argv, int *size, int *alloc, char *str)
 {
   char **new_argv;
-  char *new_str;
 
   if (*size >= *alloc) {
     *alloc += 64;
@@ -421,25 +425,36 @@ add_string (char ***argv, int *size, int *alloc, const char *str)
     if (new_argv == NULL) {
       reply_with_perror ("realloc");
       free_strings (*argv);
+      *argv = NULL;
       return -1;
     }
     *argv = new_argv;
   }
 
+  (*argv)[*size] = str;
+
+  (*size)++;
+  return 0;
+}
+
+int
+add_string (char ***argv, int *size, int *alloc, const char *str)
+{
+  char *new_str;
+
   if (str) {
     new_str = strdup (str);
     if (new_str == NULL) {
       reply_with_perror ("strdup");
       free_strings (*argv);
+      *argv = NULL;
       return -1;
     }
-  } else
+  } else {
     new_str = NULL;
+  }
 
-  (*argv)[*size] = new_str;
-
-  (*size)++;
-  return 0;
+  return add_string_nodup (argv, size, alloc, new_str);
 }
 
 size_t