Added bug 469671
[fw/sdcc] / src / SDCCsymt.c
index c0b1bcdc952336ec9ba78e1fcdee49b30ae7a457..de4b9d4b82184df0772590ee07123764807d9e18 100644 (file)
@@ -72,7 +72,7 @@ newBucket ()
 {
   bucket *bp;
 
-  bp = Safe_calloc (1, sizeof (bucket));
+  bp = Safe_alloc ( sizeof (bucket));
 
   return bp;
 }
@@ -112,10 +112,16 @@ addSym (bucket ** stab,
     checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name);
   }
 
+  /* prevent overflow of the (r)name buffers */
+  if (strlen(sname)>SDCC_SYMNAME_MAX) {
+    werror (W_SYMBOL_NAME_TOO_LONG, SDCC_SYMNAME_MAX);
+    sname[SDCC_SYMNAME_MAX]='\0';
+  }
+
   /* the symbols are always added at the head of the list  */
   i = hashKey (sname);
   /* get a free entry */
-  bp = Safe_calloc (1, sizeof (bucket));
+  bp = Safe_alloc ( sizeof (bucket));
 
   bp->sym = sym;               /* update the symbol pointer  */
   bp->level = level;           /* update the nest level      */
@@ -267,7 +273,7 @@ newSymbol (char *name, int scope)
 {
   symbol *sym;
 
-  sym = Safe_calloc (1, sizeof (symbol));
+  sym = Safe_alloc ( sizeof (symbol));
 
   strcpy (sym->name, name);    /* copy the name    */
   sym->level = scope;          /* set the level    */
@@ -284,7 +290,7 @@ newLink ()
 {
   sym_link *p;
 
-  p = Safe_calloc (1, sizeof (sym_link));
+  p = Safe_alloc ( sizeof (sym_link));
 
   return p;
 }
@@ -297,7 +303,7 @@ newStruct (char *tag)
 {
   structdef *s;
 
-  s = Safe_calloc (1, sizeof (structdef));
+  s = Safe_alloc ( sizeof (structdef));
 
   strcpy (s->tag, tag);                /* copy the tag            */
   return s;
@@ -1423,6 +1429,8 @@ computeType (sym_link * type1, sym_link * type2)
        (!IS_LITERAL(type2) && SPEC_USIGN (etype2))) && 
       !IS_FLOAT (reType))
     SPEC_USIGN (reType) = 1;
+  else
+    SPEC_USIGN (reType) = 0;
   
   /* if result is a literal then make not so */
   if (IS_LITERAL (reType))
@@ -1885,6 +1893,11 @@ printTypeChain (sym_link * start, FILE * of)
       nlr = 1;
     }
 
+  if (start==NULL) {
+    fprintf (of, "**err**");
+    return;
+  }
+
   /* print the chain as it is written in the source: */
   /* start with the last entry                       */
   for (type = start; type && type->next; type = type->next)