URI: 
       tlibhtml: plug quite a few memory leaks - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 8241eca986a18d242f52273f76d59f6828e6c859
   DIR parent 2738cc3cfc053a5922aee655405c0ab620beae0f
  HTML Author: Neven Sajko <nsajko@gmail.com>
       Date:   Sun, 18 Aug 2019 13:46:43 +0000
       
       libhtml: plug quite a few memory leaks
       
       Change-Id: I45bd62a590373669e90183cc2b2ee56570c007f5
       
       Diffstat:
         M src/libhtml/build.c                 |       3 +++
         M src/libhtml/lex.c                   |      14 ++++++++++----
       
       2 files changed, 13 insertions(+), 4 deletions(-)
       ---
   DIR diff --git a/src/libhtml/build.c b/src/libhtml/build.c
       t@@ -2127,6 +2127,7 @@ getitems(ItemSource* is, uchar* data, int datalen)
                outerps = lastps(ps);
                ans = outerps->items->next;
                /* note: ans may be nil and di->kids not nil, if there's a frameset! */
       +        freeitem(outerps->items);
                outerps->items = newispacer(ISPnull);
                outerps->lastit = outerps->items;
                is->psstk = ps;
       t@@ -2134,6 +2135,7 @@ getitems(ItemSource* is, uchar* data, int datalen)
                        /* TODO evalscript(nil); */
                        ;
                }
       +        freeitems(outerps->items);
        
        return_ans:
                if(dbgbuild) {
       t@@ -2143,6 +2145,7 @@ return_ans:
                        else
                                printitems(ans, "getitems returning:");
                }
       +        _freetokens(toks, tokslen);
                return ans;
        }
        
   DIR diff --git a/src/libhtml/lex.c b/src/libhtml/lex.c
       t@@ -540,8 +540,11 @@ _gettoks(uchar* data, int datalen, int chset, int mtype, int* plen)
                if(dbglex)
                        fprint(2, "lex: returning %d tokens\n", ai);
                *plen = ai;
       -        if(ai == 0) 
       +        free(ts);
       +        if(ai == 0) {
       +                free(a);
                        return nil;
       +        }
                return a;
        }
        
       t@@ -603,15 +606,18 @@ getplaindata(TokenSource* ts, Token* a, int* pai)
        }
        
        /* Return concatenation of s and buf[0:j] */
       +/* Frees s. */
        static Rune*
        buftostr(Rune* s, Rune* buf, int j)
        {
       +        Rune *tmp;
                buf[j] = 0;
                if(s == nil)
       -                s = _Strndup(buf, j);
       +                tmp = _Strndup(buf, j);
                else 
       -                s = _Strdup2(s, buf);
       -        return s;
       +                tmp = _Strdup2(s, buf);
       +        free(s);
       +        return tmp;
        }
        
        /* Gather data up to next start-of-tag or end-of-buffer. */