aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/pgbench/pgbench.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c
index 56dab6192db..0d809c915b1 100644
--- a/contrib/pgbench/pgbench.c
+++ b/contrib/pgbench/pgbench.c
@@ -1066,9 +1066,23 @@ top:
else
max = atoi(argv[3]);
- if (max < min || max > MAX_RANDOM_VALUE)
+ if (max < min)
{
- fprintf(stderr, "%s: invalid maximum number %d\n", argv[0], max);
+ fprintf(stderr, "%s: maximum is less than minimum\n", argv[0]);
+ st->ecnt++;
+ return true;
+ }
+
+ /*
+ * getrand() neeeds to be able to subtract max from min and add
+ * one the result without overflowing. Since we know max > min,
+ * we can detect overflow just by checking for a negative result.
+ * But we must check both that the subtraction doesn't overflow,
+ * and that adding one to the result doesn't overflow either.
+ */
+ if (max - min < 0 || (max - min) + 1 < 0)
+ {
+ fprintf(stderr, "%s: range too large\n", argv[0]);
st->ecnt++;
return true;
}