Module Name:    src
Committed By:   kamil
Date:           Wed Jul  4 03:00:46 UTC 2018

Modified Files:
        src/sys/dev/pci: pciide_piix_reg.h

Log Message:
Avoid undefined behavior in pciiide macros

Cast the 'bytes' argument in PIIX_IDETIM_SET() and PIIX_IDETIM_CLEAR()
to unsigned int. This prevents UB because of shifting the bits and changing
the bit of signedness.

sys/dev/pci/piixide.c:714:11, left shift of 65535 by 16 places cannot be 
represented in type 'int'
sys/dev/pci/piixide.c:720:11, left shift of 32768 by 16 places cannot be 
represented in type 'int'

Detected with Kernel Undefined Behavior Sanitizer.

Reported by <Harry Pantazis>


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/pci/pciide_piix_reg.h

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

Modified files:

Index: src/sys/dev/pci/pciide_piix_reg.h
diff -u src/sys/dev/pci/pciide_piix_reg.h:1.14 src/sys/dev/pci/pciide_piix_reg.h:1.15
--- src/sys/dev/pci/pciide_piix_reg.h:1.14	Mon Oct 19 18:41:16 2009
+++ src/sys/dev/pci/pciide_piix_reg.h	Wed Jul  4 03:00:46 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: pciide_piix_reg.h,v 1.14 2009/10/19 18:41:16 bouyer Exp $	*/
+/*	$NetBSD: pciide_piix_reg.h,v 1.15 2018/07/04 03:00:46 kamil Exp $	*/
 
 /*
  * Copyright (c) 1998 Manuel Bouyer.
@@ -49,9 +49,9 @@
 #define PIIX_IDETIM 0x40
 #define PIIX_IDETIM_READ(x, channel) (((x) >> (16 * (channel))) & 0x0000FFFF)
 #define PIIX_IDETIM_SET(x, bytes, channel) \
-	((x) | ((bytes) << (16 * (channel))))
+	((x) | ((unsigned int)(bytes) << (16 * (channel))))
 #define PIIX_IDETIM_CLEAR(x, bytes, channel) \
-	((x) & ~((bytes) << (16 * (channel))))
+	((x) & ~((unsigned int)(bytes) << (16 * (channel))))
 
 #define PIIX_IDETIM_IDE		0x8000 /* PIIX decode IDE registers */
 #define PIIX_IDETIM_SITRE	0x4000 /* slaves IDE timing registers

Reply via email to