Index: uspace/lib/c/generic/strtol.c
===================================================================
--- uspace/lib/c/generic/strtol.c	(revision 33b8d024bc268f2773c26e74a40dada11bb71e58)
+++ uspace/lib/c/generic/strtol.c	(revision 17c1427397e6ec84fdd0ce49eddfd8c5ffb03b62)
@@ -55,4 +55,13 @@
 	}
 	return INT_MAX;
+}
+
+/* FIXME: workaround for GCC "optimizing" the overflow check
+ * into soft-emulated 128b multiplication using `__multi3`,
+ * which we don't currently implement.
+ */
+__attribute__((noinline)) static uintmax_t _max_value(int base)
+{
+	return UINTMAX_MAX / base;
 }
 
@@ -111,10 +120,11 @@
 
 	uintmax_t result = 0;
+	uintmax_t max = _max_value(base);
 	int digit;
 
 	while (digit = _digit_value(*nptr), digit < base) {
 
-		if (__builtin_mul_overflow(result, base, &result) ||
-		    __builtin_add_overflow(result, digit, &result)) {
+		if (result > max ||
+		    __builtin_add_overflow(result * base, digit, &result)) {
 
 			errno = ERANGE;
