diff options
author | Tom Lane | 2007-10-08 22:07:16 +0000 |
---|---|---|
committer | Tom Lane | 2007-10-08 22:07:16 +0000 |
commit | 9f3bd2994c30df430c1aef5a8d6893ce61ee3f43 (patch) | |
tree | 5baf186684be89a092da67414047aba7b40b9e0b | |
parent | b196b7fb721440ae814c0215ff889dce00fd26a2 (diff) |
Faster test for overflow in str2txid, from Marko.
-rw-r--r-- | contrib/txid/txid.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/contrib/txid/txid.c b/contrib/txid/txid.c index 606fb40040b..015e1fb9368 100644 --- a/contrib/txid/txid.c +++ b/contrib/txid/txid.c @@ -234,24 +234,27 @@ static txid str2txid(const char *s, const char **endp) { txid val = 0; + txid cutoff = MAX_TXID / 10; + txid cutlim = MAX_TXID % 10; for (; *s; s++) { - txid last = val; + unsigned d; if (*s < '0' || *s > '9') break; - - val = val * 10 + (*s - '0'); + d = *s - '0'; /* * check for overflow */ - if (val > MAX_TXID || (val / 10) != last) + if (val > cutoff || (val == cutoff && d > cutlim)) { val = 0; break; } + + val = val * 10 + d; } if (endp) *endp = s; |