Module Name:    src
Committed By:   msaitoh
Date:           Thu May 20 01:07:24 UTC 2021

Modified Files:
        src/sys/arch/arm/rockchip: rk3399_cru.c

Log Message:
Fix signed integer overflow found by kUBSan. OK'd by jmcneill.

 The output was:
   UBSan: Undefined Behavior in ../../../../arch/arm/rockchip/rk3399_cru.c:
   284:13, signed integer overflow: 594000000 - -2086967296 cannot be
   represented in type 'int'


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/arm/rockchip/rk3399_cru.c

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

Modified files:

Index: src/sys/arch/arm/rockchip/rk3399_cru.c
diff -u src/sys/arch/arm/rockchip/rk3399_cru.c:1.21 src/sys/arch/arm/rockchip/rk3399_cru.c:1.22
--- src/sys/arch/arm/rockchip/rk3399_cru.c:1.21	Wed Jan 27 03:10:19 2021
+++ src/sys/arch/arm/rockchip/rk3399_cru.c	Thu May 20 01:07:24 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rk3399_cru.c,v 1.21 2021/01/27 03:10:19 thorpej Exp $ */
+/* $NetBSD: rk3399_cru.c,v 1.22 2021/05/20 01:07:24 msaitoh Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <[email protected]>
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: rk3399_cru.c,v 1.21 2021/01/27 03:10:19 thorpej Exp $");
+__KERNEL_RCSID(1, "$NetBSD: rk3399_cru.c,v 1.22 2021/05/20 01:07:24 msaitoh Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -281,10 +281,15 @@ rk3399_cru_pll_set_rate(struct rk_cru_so
 
 	best_diff = INT_MAX;
 	for (int i = 0; i < pll->nrates; i++) {
-		const int diff = (int)rate - (int)pll->rates[i].rate;
-		if (abs(diff) < best_diff) {
+		int diff;
+
+		if (rate > pll->rates[i].rate)
+			diff = rate - pll->rates[i].rate;
+		else
+			diff = pll->rates[i].rate - rate;
+		if (diff < best_diff) {
 			pll_rate = &pll->rates[i];
-			best_diff = abs(diff);
+			best_diff = diff;
 		}
 	}
 

Reply via email to