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)