Home
       cc1: Fix empty param list in newtype() - scc - simple c99 compiler
  HTML git clone git://git.simple-cc.org/scc
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit bbc13f1280dc042f22868c2565602f5b01c2873f
   DIR parent 010fd7349f3e3baeeea0344175cd351dd4692904
  HTML Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Wed, 16 Oct 2024 10:31:15 +0200
       
       cc1: Fix empty param list in newtype()
       
       When a function does not have parameters (a void function)
       then tp->n.elem is 0, and it was calling malloc with a size
       of 0 and then later in eqfunc() we are accessing the pointer
       returned by malloc(). It happens to work in linux, but
       obviously, it was wrong.
       
       Also, the malloc() call didn't allocate space for the NULL
       pointer that must finish the list and it was expected by
       eqfunc().
       
       Diffstat:
         M src/cmd/cc/cc1/types.c              |      10 +++++++---
       
       1 file changed, 7 insertions(+), 3 deletions(-)
       ---
   DIR diff --git a/src/cmd/cc/cc1/types.c b/src/cmd/cc/cc1/types.c
       @@ -256,7 +256,7 @@ deftype(Type *tp)
        static Type *
        newtype(Type *base)
        {
       -        Type *tp;
       +        Type *tp, **pars;
                size_t siz;
        
                tp = xmalloc(sizeof(*tp));
       @@ -264,8 +264,12 @@ newtype(Type *base)
                tp->id = newid();
        
                if (tp->op == FTN) {
       -                siz = tp->n.elem * sizeof(Type *);
       -                tp->p.pars = memcpy(xmalloc(siz), tp->p.pars, siz);
       +                siz = (tp->n.elem + 1) * sizeof(Type *);
       +                pars = xmalloc(siz);
       +                if (tp->n.elem > 0)
       +                        memcpy(pars, tp->p.pars, siz);
       +                pars[tp->n.elem] = NULL;
       +                tp->p.pars = pars;
                } else if (tp->op == ARY) {
                        /* We need alignment for flexible array members */
                        tp->align = tp->type->align;