Hi,

I palloc0'ed a variable of type StringInfo and without doing an
initStringInfo() (forgot to do it i.e.) tried to append some stuff to it
using appendStringInfo(). It went into a tight loop within the function
enlargeStringInfo() at:

while (needed > newlen)

Must be a common enough case for a palloc0'ed field right?

The attached patch should fix this.

*** 226,232 ****
!       if (needed < 0 ||
                ((Size) needed) >= (MaxAllocSize - (Size) str->len))
                elog(ERROR, "invalid string enlargement request size %d",
                         needed);
--- 226,232 ----
!       if (needed <= 0 ||
                ((Size) needed) >= (MaxAllocSize - (Size) str->len))
                elog(ERROR, "invalid string enlargement request size %d",
                         needed);

I also found the absence of a function like resetStringInfo() a bit
puzzling. A found a lot of places where the code was resetting the "len"
field to 0 and assigning '\0' to the data field to reset the variable. This
seems to be the only missing API which will be needed while working with the
StringInfo type.

Regards,
Nikhils

-- 
EnterpriseDB               http://www.enterprisedb.com
Index: src/backend/lib/stringinfo.c
===================================================================
RCS file: /repositories/edbhome/cvs/EDBAS82/edb/edb-postgres/src/backend/lib/stringinfo.c,v
retrieving revision 1.3
diff -c -r1.3 stringinfo.c
*** src/backend/lib/stringinfo.c	9 Nov 2006 11:09:09 -0000	1.3
--- src/backend/lib/stringinfo.c	29 Aug 2007 14:37:58 -0000
***************
*** 226,232 ****
  	 * bogus data.	Without this, we can get an overflow or infinite loop in
  	 * the following.
  	 */
! 	if (needed < 0 ||
  		((Size) needed) >= (MaxAllocSize - (Size) str->len))
  		elog(ERROR, "invalid string enlargement request size %d",
  			 needed);
--- 226,232 ----
  	 * bogus data.	Without this, we can get an overflow or infinite loop in
  	 * the following.
  	 */
! 	if (needed <= 0 ||
  		((Size) needed) >= (MaxAllocSize - (Size) str->len))
  		elog(ERROR, "invalid string enlargement request size %d",
  			 needed);
***************
*** 259,261 ****
--- 259,272 ----
  
  	str->maxlen = newlen;
  }
+ 
+ /*
+  * resetStringInfo
+  * Reset the len field and the data field contents for a fresh start
+  */
+ void 
+ resetStringInfo(StringInfo str)
+ {
+ 	str->len = 0;
+ 	str->data[0] = '\0';
+ }
Index: src/include/lib/stringinfo.h
===================================================================
RCS file: /repositories/edbhome/cvs/EDBAS82/edb/edb-postgres/src/include/lib/stringinfo.h,v
retrieving revision 1.3
diff -c -r1.3 stringinfo.h
*** src/include/lib/stringinfo.h	9 Nov 2006 11:09:17 -0000	1.3
--- src/include/lib/stringinfo.h	29 Aug 2007 14:37:58 -0000
***************
*** 138,141 ****
--- 138,146 ----
   */
  extern void enlargeStringInfo(StringInfo str, int needed);
  
+ /*------------------------
+  * resetStringInfo
+  * Reset the len field and the data field contents for a fresh start
+  */
+ extern void resetStringInfo(StringInfo str);
  #endif   /* STRINGINFO_H */
---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to