[libgda: 2/3] Fix undefined behavior due to signed integer overflow




commit 657b2f8497da907559a6769c5b1d2d7b5bd40688
Author: Andreas Schwab <schwab suse de>
Date:   Sun Jul 25 10:48:48 2021 +0200

    Fix undefined behavior due to signed integer overflow

 libgda/sql-parser/lemon.c | 40 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)
---
diff --git a/libgda/sql-parser/lemon.c b/libgda/sql-parser/lemon.c
index cf0f3b3eb..a6fe75bb9 100644
--- a/libgda/sql-parser/lemon.c
+++ b/libgda/sql-parser/lemon.c
@@ -3505,7 +3505,7 @@ void print_stack_union(
   int maxdtlength;          /* Maximum length of any ".datatype" field. */
   char *stddt;              /* Standardized name for a datatype */
   int i,j;                  /* Loop counters */
-  int hash;                 /* For hashing the name of a type */
+  unsigned int hash;        /* For hashing the name of a type */
   const char *name;         /* Name of the parser */
 
   /* Allocate and initialize types[] and allocate stddt[] */
@@ -3568,7 +3568,7 @@ void print_stack_union(
         break;
       }
       hash++;
-      if( hash>=arraysize ) hash = 0;
+      if( (int)hash>=arraysize ) hash = 0;
     }
     if( types[hash]==0 ){
       sp->dtnum = hash + 1;
@@ -4342,9 +4342,9 @@ int SetUnion(char *s1, char *s2)
 ** Code for processing tables in the LEMON parser generator.
 */
 
-PRIVATE int strhash(const char *x)
+PRIVATE unsigned int strhash(const char *x)
 {
-  int h = 0;
+  unsigned int h = 0;
   while( *x) h = h*13 + *(x++);
   return h;
 }
@@ -4417,8 +4417,8 @@ void Strsafe_init(){
 int Strsafe_insert(const char *data)
 {
   x1node *np;
-  int h;
-  int ph;
+  unsigned int h;
+  unsigned int ph;
 
   if( x1a==0 ) return 0;
   ph = strhash(data);
@@ -4472,7 +4472,7 @@ int Strsafe_insert(const char *data)
 ** if no such key. */
 const char *Strsafe_find(const char *key)
 {
-  int h;
+  unsigned int h;
   x1node *np;
 
   if( x1a==0 ) return 0;
@@ -4583,8 +4583,8 @@ void Symbol_init(){
 int Symbol_insert(struct symbol *data, const char *key)
 {
   x2node *np;
-  int h;
-  int ph;
+  unsigned int h;
+  unsigned int ph;
 
   if( x2a==0 ) return 0;
   ph = strhash(key);
@@ -4640,7 +4640,7 @@ int Symbol_insert(struct symbol *data, const char *key)
 ** if no such key. */
 struct symbol *Symbol_find(const char *key)
 {
-  int h;
+  unsigned int h;
   x2node *np;
 
   if( x2a==0 ) return 0;
@@ -4714,9 +4714,9 @@ PRIVATE int statecmp(struct config *a, struct config *b)
 }
 
 /* Hash a state */
-PRIVATE int statehash(struct config *a)
+PRIVATE unsigned int statehash(struct config *a)
 {
-  int h=0;
+  unsigned int h=0;
   while( a ){
     h = h*571 + a->rp->index*37 + a->dot;
     a = a->bp;
@@ -4782,8 +4782,8 @@ void State_init(){
 int State_insert(struct state *data, struct config *key)
 {
   x3node *np;
-  int h;
-  int ph;
+  unsigned int h;
+  unsigned int ph;
 
   if( x3a==0 ) return 0;
   ph = statehash(key);
@@ -4839,7 +4839,7 @@ int State_insert(struct state *data, struct config *key)
 ** if no such key. */
 struct state *State_find(struct config *key)
 {
-  int h;
+  unsigned int h;
   x3node *np;
 
   if( x3a==0 ) return 0;
@@ -4869,9 +4869,9 @@ struct state **State_arrayof()
 }
 
 /* Hash a configuration */
-PRIVATE int confighash(struct config *a)
+PRIVATE unsigned int confighash(struct config *a)
 {
-  int h=0;
+  unsigned int h=0;
   h = h*571 + a->rp->index*37 + a->dot;
   return h;
 }
@@ -4924,8 +4924,8 @@ void Configtable_init(){
 int Configtable_insert(struct config *data)
 {
   x4node *np;
-  int h;
-  int ph;
+  unsigned int h;
+  unsigned int ph;
 
   if( x4a==0 ) return 0;
   ph = confighash(data);
@@ -4979,7 +4979,7 @@ int Configtable_insert(struct config *data)
 ** if no such key. */
 struct config *Configtable_find(struct config *key)
 {
-  int h;
+  unsigned int h;
   x4node *np;
 
   if( x4a==0 ) return 0;


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