diff --git a/src/arscan.c b/src/arscan.c
index eed90c80..f86e95f7 100644
--- a/src/arscan.c
+++ b/src/arscan.c
@@ -395,16 +395,12 @@ parse_int (const char *ptr, const size_t len, const int base, uintmax_t max,
 
   while (ptr < ep && *ptr != ' ')
     {
-      uintmax_t nv;
-
-      if (*ptr < '0' || *ptr > maxchar)
+      if (*ptr < '0' || *ptr > maxchar
+          || INT_MULTIPLY_WRAPV (val, base, &val)
+          || INT_ADD_WRAPV (val, *ptr - '0', &val)
+          || val > max)
         OSSS (fatal, NILF,
               _("invalid %s for archive %s member %s"), type, archive, name);
-      nv = (val * base) + (*ptr - '0');
-      if (nv < val || nv > max)
-        OSSS (fatal, NILF,
-              _("invalid %s for archive %s member %s"), type, archive, name);
-      val = nv;
       ++ptr;
     }