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)