> On Mon, Feb 21, 2005 at 10:53:08PM -0500, Bruce Momjian wrote: > > Applied.
Thanks a lot. The patch attached solves the tread safety problem. Please review it before applying, I am not sure I am doing the right thing On Tue, 22 Feb 2005 19:57:15 +0100, Kurt Roeckx <[EMAIL PROTECTED]> wrote: > The configure test is a little broken. It needs to quote the > $'s. > > I've rewritten the test a little. This one needs applying too. $'s do get scrambled. Best regards, Nicolai.
*** ./src/port/snprintf.c.orig sali Şub 22 20:02:03 2005 --- ./src/port/snprintf.c sali Şub 22 21:59:48 2005 *************** *** 80,96 **** * for string length. This covers a nasty loophole. * * The other functions are there to prevent NULL pointers from ! * causing nast effects. **************************************************************/ /*static char _id[] = "$PostgreSQL: pgsql/src/port/snprintf.c,v 1.6 2005/02/22 04:57:24 momjian Exp $";*/ - static char *end; - static int SnprfOverflow; int snprintf(char *str, size_t count, const char *fmt,...); int vsnprintf(char *str, size_t count, const char *fmt, va_list args); int printf(const char *format, ...); ! static void dopr(char *buffer, const char *format, va_list args); int printf(const char *fmt,...) --- 80,94 ---- * for string length. This covers a nasty loophole. * * The other functions are there to prevent NULL pointers from ! * causing nasty effects. **************************************************************/ /*static char _id[] = "$PostgreSQL: pgsql/src/port/snprintf.c,v 1.6 2005/02/22 04:57:24 momjian Exp $";*/ int snprintf(char *str, size_t count, const char *fmt,...); int vsnprintf(char *str, size_t count, const char *fmt, va_list args); int printf(const char *format, ...); ! static void dopr(char *buffer, const char *format, va_list args, char *end); int printf(const char *fmt,...) *************** *** 97,103 **** { int len; va_list args; ! static char* buffer[4096]; char* p; va_start(args, fmt); --- 95,101 ---- { int len; va_list args; ! char* buffer[4096]; char* p; va_start(args, fmt); *************** *** 125,134 **** int vsnprintf(char *str, size_t count, const char *fmt, va_list args) { str[0] = '\0'; end = str + count - 1; ! SnprfOverflow = 0; ! dopr(str, fmt, args); if (count > 0) end[0] = '\0'; return strlen(str); --- 123,132 ---- int vsnprintf(char *str, size_t count, const char *fmt, va_list args) { + char *end; str[0] = '\0'; end = str + count - 1; ! dopr(str, fmt, args, end); if (count > 0) end[0] = '\0'; return strlen(str); *************** *** 138,148 **** * dopr(): poor man's version of doprintf */ ! static void fmtstr(char *value, int ljust, int len, int zpad, int maxwidth); ! static void fmtnum(long_long value, int base, int dosign, int ljust, int len, int zpad); ! static void fmtfloat(double value, char type, int ljust, int len, int precision, int pointflag); ! static void dostr(char *str, int cut); ! static void dopr_outch(int c); static char *output; --- 136,146 ---- * dopr(): poor man's version of doprintf */ ! static void fmtstr(char *value, int ljust, int len, int zpad, int maxwidth, char *end); ! static void fmtnum(long_long value, int base, int dosign, int ljust, int len, int zpad, char *end); ! static void fmtfloat(double value, char type, int ljust, int len, int precision, int pointflag, char *end); ! static void dostr(char *str, int cut, char *end); ! static void dopr_outch(int c, char *end); static char *output; *************** *** 152,158 **** #define FMTCHAR 4 static void ! dopr(char *buffer, const char *format, va_list args) { int ch; long_long value; --- 150,156 ---- #define FMTCHAR 4 static void ! dopr(char *buffer, const char *format, va_list args, char *end) { int ch; long_long value; *************** *** 415,425 **** case '%': break; default: ! dostr("???????", 0); } break; default: ! dopr_outch(ch); break; } } --- 413,423 ---- case '%': break; default: ! dostr("???????", 0, end); } break; default: ! dopr_outch(ch, end); break; } } *************** *** 446,465 **** case FMTSTR: fmtstr(fmtparptr[i]->value, fmtparptr[i]->ljust, fmtparptr[i]->len, fmtparptr[i]->zpad, ! fmtparptr[i]->maxwidth); break; case FMTNUM: fmtnum(fmtparptr[i]->numvalue, fmtparptr[i]->base, fmtparptr[i]->dosign, fmtparptr[i]->ljust, ! fmtparptr[i]->len, fmtparptr[i]->zpad); break; case FMTFLOAT: fmtfloat(fmtparptr[i]->fvalue, fmtparptr[i]->type, fmtparptr[i]->ljust, fmtparptr[i]->len, ! fmtparptr[i]->precision, fmtparptr[i]->pointflag); break; case FMTCHAR: ! dopr_outch(fmtparptr[i]->charvalue); break; } format = fmtpar[i].fmtend; --- 444,464 ---- case FMTSTR: fmtstr(fmtparptr[i]->value, fmtparptr[i]->ljust, fmtparptr[i]->len, fmtparptr[i]->zpad, ! fmtparptr[i]->maxwidth, end); break; case FMTNUM: fmtnum(fmtparptr[i]->numvalue, fmtparptr[i]->base, fmtparptr[i]->dosign, fmtparptr[i]->ljust, ! fmtparptr[i]->len, fmtparptr[i]->zpad, end); break; case FMTFLOAT: fmtfloat(fmtparptr[i]->fvalue, fmtparptr[i]->type, fmtparptr[i]->ljust, fmtparptr[i]->len, ! fmtparptr[i]->precision, fmtparptr[i]->pointflag, ! end); break; case FMTCHAR: ! dopr_outch(fmtparptr[i]->charvalue, end); break; } format = fmtpar[i].fmtend; *************** *** 466,472 **** goto nochar; } } ! dopr_outch(ch); nochar: /* nothing */ ; /* semicolon required because a goto has to be attached to a statement */ --- 465,471 ---- goto nochar; } } ! dopr_outch(ch, end); nochar: /* nothing */ ; /* semicolon required because a goto has to be attached to a statement */ *************** *** 475,481 **** } static void ! fmtstr(char *value, int ljust, int len, int zpad, int maxwidth) { int padlen, strlen; /* amount to pad */ --- 474,480 ---- } static void ! fmtstr(char *value, int ljust, int len, int zpad, int maxwidth, char *end) { int padlen, strlen; /* amount to pad */ *************** *** 492,510 **** padlen = -padlen; while (padlen > 0) { ! dopr_outch(' '); --padlen; } ! dostr(value, maxwidth); while (padlen < 0) { ! dopr_outch(' '); ++padlen; } } static void ! fmtnum(long_long value, int base, int dosign, int ljust, int len, int zpad) { int signvalue = 0; ulong_long uvalue; --- 491,509 ---- padlen = -padlen; while (padlen > 0) { ! dopr_outch(' ', end); --padlen; } ! dostr(value, maxwidth, end); while (padlen < 0) { ! dopr_outch(' ', end); ++padlen; } } static void ! fmtnum(long_long value, int base, int dosign, int ljust, int len, int zpad, char *end) { int signvalue = 0; ulong_long uvalue; *************** *** 559,592 **** { if (signvalue) { ! dopr_outch(signvalue); --padlen; signvalue = 0; } while (padlen > 0) { ! dopr_outch(zpad); --padlen; } } while (padlen > 0) { ! dopr_outch(' '); --padlen; } if (signvalue) ! dopr_outch(signvalue); while (place > 0) ! dopr_outch(convert[--place]); while (padlen < 0) { ! dopr_outch(' '); ++padlen; } } static void ! fmtfloat(double value, char type, int ljust, int len, int precision, int pointflag) { char fmt[32]; char convert[512]; --- 558,591 ---- { if (signvalue) { ! dopr_outch(signvalue, end); --padlen; signvalue = 0; } while (padlen > 0) { ! dopr_outch(zpad, end); --padlen; } } while (padlen > 0) { ! dopr_outch(' ', end); --padlen; } if (signvalue) ! dopr_outch(signvalue, end); while (place > 0) ! dopr_outch(convert[--place], end); while (padlen < 0) { ! dopr_outch(' ', end); ++padlen; } } static void ! fmtfloat(double value, char type, int ljust, int len, int precision, int pointflag, char *end) { char fmt[32]; char convert[512]; *************** *** 613,646 **** while (padlen > 0) { ! dopr_outch(' '); --padlen; } ! dostr(convert, 0); while (padlen < 0) { ! dopr_outch(' '); ++padlen; } } static void ! dostr(char *str, int cut) { if (cut) { while (*str && cut-- > 0) ! dopr_outch(*str++); } else { while (*str) ! dopr_outch(*str++); } } static void ! dopr_outch(int c) { #ifdef NOT_USED if (iscntrl((unsigned char) c) && c != '\n' && c != '\t') --- 612,645 ---- while (padlen > 0) { ! dopr_outch(' ', end); --padlen; } ! dostr(convert, 0, end); while (padlen < 0) { ! dopr_outch(' ', end); ++padlen; } } static void ! dostr(char *str, int cut, char *end) { if (cut) { while (*str && cut-- > 0) ! dopr_outch(*str++, end); } else { while (*str) ! dopr_outch(*str++, end); } } static void ! dopr_outch(int c, char *end) { #ifdef NOT_USED if (iscntrl((unsigned char) c) && c != '\n' && c != '\t') *************** *** 652,657 **** #endif if (end == 0 || output < end) *output++ = c; - else - SnprfOverflow++; } --- 651,654 ----
---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faq