bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Valgrind and Bison memory leaks


From: Paul Eggert
Subject: Re: Valgrind and Bison memory leaks
Date: Wed, 08 Nov 2006 12:14:10 -0800
User-agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/21.4 (gnu/linux)

"Joel E. Denny" <address@hidden> writes:

> Most importantly, the end of the patch includes a small change to 
> lib/quotearg.*, which I see are part of gnulib.  I'll need some guidance 
> on whether that change makes sense for gnulib in general and on what to do 
> with it.

OK, on further thought I guess it's all right.  To start off, I
installed this into gnulib:

2006-11-08  Paul Eggert  <address@hidden>

        * lib/quotearg.h (quotearg_free): New decl.
        * lib/quotearg.c (quotearg_free): New function.
        (slot0, nslots, slotvec0, slotvec):
        Now file-scope so that quotearg_free can get at them.

--- lib/quotearg.h      14 May 2005 06:03:58 -0000      1.12
+++ lib/quotearg.h      8 Nov 2006 20:10:31 -0000
@@ -1,7 +1,7 @@
 /* quotearg.h - quote arguments for output
 
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Free Software
-   Foundation, Inc.
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006 Free
+   Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -134,4 +134,7 @@ char *quotearg_char (char const *arg, ch
 /* Equivalent to quotearg_char (ARG, ':').  */
 char *quotearg_colon (char const *arg);
 
+/* Free any dynamically allocated memory.  */
+void quotearg_free (void);
+
 #endif /* !QUOTEARG_H_ */
--- lib/quotearg.c      31 Oct 2006 21:51:45 -0000      1.51
+++ lib/quotearg.c      8 Nov 2006 20:10:30 -0000
@@ -567,6 +567,34 @@ struct slotvec
   char *val;
 };
 
+/* Preallocate a slot 0 buffer, so that the caller can always quote
+   one small component of a "memory exhausted" message in slot 0.  */
+static char slot0[256];
+static unsigned int nslots = 1;
+static struct slotvec slotvec0 = {sizeof slot0, slot0};
+static struct slotvec *slotvec = &slotvec0;
+
+void
+quotearg_free (void)
+{
+  struct slotvec *sv = slotvec;
+  unsigned int i;
+  for (i = 1; i < nslots; i++)
+    free (sv[i].val);
+  if (sv[0].val != slot0)
+    {
+      free (sv[0].val);
+      slotvec0.size = sizeof slot0;
+      slotvec0.val = slot0;
+    }
+  if (sv != &slotvec0)
+    {
+      free (sv);
+      slotvec = &slotvec0;
+    }
+  nslots = 1;
+}
+
 /* Use storage slot N to return a quoted version of argument ARG.
    ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a
    null-terminated string.
@@ -581,13 +609,7 @@ quotearg_n_options (int n, char const *a
 {
   int e = errno;
 
-  /* Preallocate a slot 0 buffer, so that the caller can always quote
-     one small component of a "memory exhausted" message in slot 0.  */
-  static char slot0[256];
-  static unsigned int nslots = 1;
   unsigned int n0 = n;
-  static struct slotvec slotvec0 = {sizeof slot0, slot0};
-  static struct slotvec *slotvec = &slotvec0;
   struct slotvec *sv = slotvec;
 
   if (n < 0)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]