diff --git a/contrib/txid/txid.c b/contrib/txid/txid.c
index 606fb40040bf4a522d799302bb6dcf8ef7d0268d..015e1fb93687cd2072b8bef0066e3be2a4f4d313 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;