Module Name: src Committed By: rin Date: Mon Jul 29 08:13:50 UTC 2019
Modified Files: src/sys/dev/rasops: rasops.h rasops1.c rasops_putchar.h Log Message: Avoid undefined behavior when converting unaligned be32 data to host integer, found by kUBSan. Pointed out by msaitoh. To generate a diff of this commit: cvs rdiff -u -r1.37 -r1.38 src/sys/dev/rasops/rasops.h cvs rdiff -u -r1.29 -r1.30 src/sys/dev/rasops/rasops1.c cvs rdiff -u -r1.3 -r1.4 src/sys/dev/rasops/rasops_putchar.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/rasops/rasops.h diff -u src/sys/dev/rasops/rasops.h:1.37 src/sys/dev/rasops/rasops.h:1.38 --- src/sys/dev/rasops/rasops.h:1.37 Sun Jul 28 12:06:10 2019 +++ src/sys/dev/rasops/rasops.h Mon Jul 29 08:13:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops.h,v 1.37 2019/07/28 12:06:10 rin Exp $ */ +/* $NetBSD: rasops.h,v 1.38 2019/07/29 08:13:50 rin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -153,6 +153,18 @@ struct rasops_info { ((uint8_t *)(font)->data + ((uc) - ((font)->firstchar)) * \ (ri)->ri_fontscale) +static __inline uint32_t +be32uatoh(uint8_t *p) +{ + uint32_t u; + + u = p[0]; u <<= 8; + u |= p[1]; u <<= 8; + u |= p[2]; u <<= 8; + u |= p[3]; + return u; +} + /* * rasops_init(). * Index: src/sys/dev/rasops/rasops1.c diff -u src/sys/dev/rasops/rasops1.c:1.29 src/sys/dev/rasops/rasops1.c:1.30 --- src/sys/dev/rasops/rasops1.c:1.29 Mon Jul 29 02:57:41 2019 +++ src/sys/dev/rasops/rasops1.c Mon Jul 29 08:13:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops1.c,v 1.29 2019/07/29 02:57:41 rin Exp $ */ +/* $NetBSD: rasops1.c,v 1.30 2019/07/29 08:13:50 rin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rasops1.c,v 1.29 2019/07/29 02:57:41 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rasops1.c,v 1.30 2019/07/29 08:13:50 rin Exp $"); #include "opt_rasops.h" @@ -151,8 +151,7 @@ rasops1_putchar(void *cookie, int row, i } else { while (height--) { tmp = *rp & lmask; - fb = fr[3] | (fr[2] << 8) | - (fr[1] << 16) | (fr[0] << 24); + fb = be32uatoh(fr); fr += fs; if (bg) fb = ~fb; @@ -202,8 +201,7 @@ rasops1_putchar(void *cookie, int row, i while (height--) { tmp0 = rp[0] & lmask; tmp1 = rp[1] & rmask; - fb = fr[3] | (fr[2] << 8) | - (fr[1] << 16) | (fr[0] << 24); + fb = be32uatoh(fr); fr += fs; if (bg) fb = ~fb; Index: src/sys/dev/rasops/rasops_putchar.h diff -u src/sys/dev/rasops/rasops_putchar.h:1.3 src/sys/dev/rasops/rasops_putchar.h:1.4 --- src/sys/dev/rasops/rasops_putchar.h:1.3 Sun Jul 28 12:10:52 2019 +++ src/sys/dev/rasops/rasops_putchar.h Mon Jul 29 08:13:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops_putchar.h,v 1.3 2019/07/28 12:10:52 rin Exp $ */ +/* $NetBSD: rasops_putchar.h,v 1.4 2019/07/29 08:13:50 rin Exp $ */ /* NetBSD: rasops8.c,v 1.41 2019/07/25 03:02:44 rin Exp */ /*- @@ -70,7 +70,8 @@ PUTCHAR(RASOPS_DEPTH)(void *cookie, int { struct rasops_info *ri = (struct rasops_info *)cookie; struct wsdisplay_font *font = PICK_FONT(ri, uc); - int width, height, cnt, fs, fb; + int width, height, cnt, fs; + uint32_t fb; uint8_t *dp, *rp, *hp, *hrp, *fr; CLR_TYPE clr[2]; @@ -124,8 +125,7 @@ PUTCHAR(RASOPS_DEPTH)(void *cookie, int hp = hrp; hrp += ri->ri_stride; } - fb = fr[3] | (fr[2] << 8) | (fr[1] << 16) | - (fr[0] << 24); + fb = be32uatoh(fr); fr += fs; for (cnt = width; cnt; cnt--) { SUBST_CLR(dp, (fb >> 31) & 1);