DragonFlyBSD Kernel Audit
DF-1503 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/misc/kbd/kbd.c b/sys/dev/misc/kbd/kbd.c
--- a/sys/dev/misc/kbd/kbd.c
+++ b/sys/dev/misc/kbd/kbd.c
@@ -1087,7 +1087,15 @@
 			lwkt_reltoken(&kbd_token);
 			return EINVAL;
 		}
-		kbd->kb_fkeytab[fkeyp->keynum].len = imin(fkeyp->flen, MAXFK);
+		/*
+		 * DF-1503: fkeyarg_t.flen is plain `char` (signed on x86_64).
+		 * Cast through u_char before clamping so flen=-1 does not
+		 * become imin(-1,MAXFK)=-1 -> stored as u_char 255 -> 239-byte
+		 * OOB write of str[16].  Getfkey has the same shape and is
+		 * also fixed.
+		 */
+		kbd->kb_fkeytab[fkeyp->keynum].len =
+		    imin((int)(u_char)fkeyp->flen, MAXFK);
 		bcopy(fkeyp->keydef, kbd->kb_fkeytab[fkeyp->keynum].str,
 		      kbd->kb_fkeytab[fkeyp->keynum].len);
 		break;