Module Name:    src
Committed By:   rillig
Date:           Thu Feb 27 23:46:30 UTC 2025

Modified Files:
        src/tests/usr.bin/xlint/lint1: msg_298.c
        src/usr.bin/xlint/lint1: tree.c

Log Message:
lint: fix integer overflow when multiplying two large signed numbers

Seen in ipsec-tools/crypto_openssl.c.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/msg_298.c
cvs rdiff -u -r1.674 -r1.675 src/usr.bin/xlint/lint1/tree.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/usr.bin/xlint/lint1/msg_298.c
diff -u src/tests/usr.bin/xlint/lint1/msg_298.c:1.7 src/tests/usr.bin/xlint/lint1/msg_298.c:1.8
--- src/tests/usr.bin/xlint/lint1/msg_298.c:1.7	Sun Jun  9 10:27:39 2024
+++ src/tests/usr.bin/xlint/lint1/msg_298.c	Thu Feb 27 23:46:30 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_298.c,v 1.7 2024/06/09 10:27:39 rillig Exp $	*/
+/*	$NetBSD: msg_298.c,v 1.8 2025/02/27 23:46:30 rillig Exp $	*/
 # 3 "msg_298.c"
 
 // Test for message: conversion from '%s' to '%s' may lose accuracy, arg #%d [298]
@@ -8,6 +8,7 @@
 void take_uchar(unsigned char);
 void take_schar(signed char);
 void take_uint(unsigned int);
+void take_int(int);
 
 void
 convert_bit_and(long l)
@@ -22,4 +23,11 @@ convert_bit_and(long l)
 	take_schar(l & 0x7F);
 }
 
+void
+convert_mult(long long ll)
+{
+	/* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy, arg #1 [298] */
+	take_int(ll * 2);
+}
+
 // For lossy floating-to-integer conversions, see messages 380 and 381.

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.674 src/usr.bin/xlint/lint1/tree.c:1.675
--- src/usr.bin/xlint/lint1/tree.c:1.674	Thu Feb 27 06:23:07 2025
+++ src/usr.bin/xlint/lint1/tree.c	Thu Feb 27 23:46:30 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.674 2025/02/27 06:23:07 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.675 2025/02/27 23:46:30 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.674 2025/02/27 06:23:07 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.675 2025/02/27 23:46:30 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -152,8 +152,8 @@ si_mult_sat(const type_t *tp, int64_t l,
 	uint64_t al = s64_abs(l);
 	uint64_t ar = s64_abs(r);
 	bool neg = (l >= 0) != (r >= 0);
-	uint64_t max = ui_max_value(tp);
-	uint64_t max_prod = (uint64_t)max + (neg ? 1 : 0);
+	uint64_t max = (uint64_t)si_max_value(tp);
+	uint64_t max_prod = max + (neg ? 1 : 0);
 	if (al == 0 || ar <= max_prod / al)
 		return l * r;
 	else if (neg)

Reply via email to