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

Bug#783411: Possible memory leak in cdebconf-udeb



Control: reassign -1 src:libtextwrap
Control: tag -1 + patch

Hi,

On Mon, Apr 27, 2015 at 07:24:21AM +0200, Christian PERRIER wrote:
> Quoting Niels Thykier (niels@thykier.net):
> 
> > Hi,
> > 
> > Thanks for the report.
> > 
> > A quick scan with cppcheck highlighted several cases of memory leaks.
> > Please see attached diff for a quick (untested) attempt of plugging these.
> > 
> > Thanks,
> > ~Niels
> > 
> 
> Committed and pushed to master. Untested as well and not sure it
> really fixes the leak(s) spotted by Guo Yixuan but it can't indeed
> hurt.

Thank you for the help!

After debugging with mtrace(), I located some memory leak in
libtextwrap. A patch is attached. It appears to fix the problem in my
case.

Cheers,
Yixuan
--- a/textwrap.c
+++ b/textwrap.c
@@ -256,6 +256,7 @@ textwrap(const textwrap_t *prop, const c
   /* locale initialization */
   encoding = normalize(nl_langinfo(CODESET));
   encoding_type = set_encoding_type(encoding);
+  free(encoding);
 
   /* buffer initialization */
   len = strlen(text);
@@ -295,6 +296,7 @@ textwrap(const textwrap_t *prop, const c
 
     if (!*p) {
       stringt_addstringt(out, word);
+      stringt_destroy(word);
       return stringt_destroy_extract(out);
     }
 
@@ -306,6 +308,7 @@ textwrap(const textwrap_t *prop, const c
 	* memory for out
 	*/
        stringt_addstr(out, " <ERR>");
+       stringt_destroy(word);
        return stringt_destroy_extract(out);
     }
     w = mbwidth(p, ml);
@@ -319,7 +322,10 @@ textwrap(const textwrap_t *prop, const c
     if (*now == '\n') {
       stringt_addstringt(out, word);
       stringt_addstr(out, "\n");
-      if (!*p) return stringt_destroy_extract(out);
+      if (!*p) {
+          stringt_destroy(word);
+          return stringt_destroy_extract(out);
+      }
       stringt_addstr(out, head2); line_width = head2_width;
       stringt_zero(word); word_width = 0;
       continue;
@@ -334,7 +340,10 @@ textwrap(const textwrap_t *prop, const c
 	/* new line */
 	stringt_addstringt(out, word);
 	stringt_addstr(out, "\n");
-	if (!*p) return stringt_destroy_extract(out);
+	if (!*p) {
+            stringt_destroy(word);
+            return stringt_destroy_extract(out);
+        }
 	stringt_addstr(out, head2); line_width = head2_width;
 	stringt_zero(word); word_width = 0;
       } else {

Attachment: signature.asc
Description: Digital signature


Reply to: