summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-01-09 13:44:27 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2016-01-09 13:44:27 -0500
commitacbdda4dbf99117712fb9b699ae1e83a01faea53 (patch)
tree9cfc1647b5aaa15e35cc714946b2073c3c18e47c
parent831c22ba3c6c23f826e3c266d842daab32f65990 (diff)
downloadpostgresql-acbdda4dbf99117712fb9b699ae1e83a01faea53.tar.gz
Clean up code for widget_in() and widget_out().
Given syntactically wrong input, widget_in() could call atof() with an indeterminate pointer argument, typically leading to a crash; or if it didn't do that, it might return a NULL pointer, which again would lead to a crash since old-style C functions aren't supposed to do things that way. Fix that by correcting the off-by-one syntax test and throwing a proper error rather than just returning NULL. Also, since widget_in and widget_out have been marked STRICT for a long time, their tests for null inputs are just dead code; remove 'em. In the oldest branches, also improve widget_out to use snprintf not sprintf, just to be sure. In passing, get rid of a long-since-useless sprintf into a local buffer that nothing further is done with, and make some other minor coding style cleanups. In the intended regression-testing usage of these functions, none of this is very significant; but if the regression test database were left around in a production installation, these bugs could amount to a minor security hazard. Piotr Stefaniak, Michael Paquier, and Tom Lane
-rw-r--r--src/test/regress/regress.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c
index 09e027c1e5..eaa35ec3fc 100644
--- a/src/test/regress/regress.c
+++ b/src/test/regress/regress.c
@@ -237,34 +237,33 @@ WIDGET *
widget_in(char *str)
{
char *p,
- *coord[NARGS],
- buf2[1000];
+ *coord[NARGS];
int i;
WIDGET *result;
- if (str == NULL)
- return NULL;
for (i = 0, p = str; *p && i < NARGS && *p != RDELIM; p++)
- if (*p == ',' || (*p == LDELIM && !i))
+ {
+ if (*p == DELIM || (*p == LDELIM && i == 0))
coord[i++] = p + 1;
- if (i < NARGS - 1)
- return NULL;
+ }
+
+ if (i < NARGS)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type widget: \"%s\"",
+ str)));
+
result = (WIDGET *) palloc(sizeof(WIDGET));
result->center.x = atof(coord[0]);
result->center.y = atof(coord[1]);
result->radius = atof(coord[2]);
- snprintf(buf2, sizeof(buf2), "widget_in: read (%f, %f, %f)\n",
- result->center.x, result->center.y, result->radius);
return result;
}
char *
widget_out(WIDGET *widget)
{
- if (widget == NULL)
- return NULL;
-
return psprintf("(%g,%g,%g)",
widget->center.x, widget->center.y, widget->radius);
}