DragonFlyBSD Kernel Audit
DF-1961 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/powermng/powernow/powernow.c b/sys/dev/powermng/powernow/powernow.c
--- a/sys/dev/powermng/powernow/powernow.c
+++ b/sys/dev/powermng/powernow/powernow.c
@@ -140,6 +140,15 @@
 {
 	int		i         , j, n;
 	struct k8pnow_state state;
+
+	/* pst->n_states is uint8 (0..255) and comes from BIOS PSB/PST tables.
+	 * state_table[] has only POWERNOW_MAX_STATES=16 slots; bound-check
+	 * before the insertion-sort loop below overruns it. */
+	if (cstate->n_states > POWERNOW_MAX_STATES) {
+		kprintf("powernow: PSB n_states %u > %d, ignoring PST\n",
+			cstate->n_states, POWERNOW_MAX_STATES);
+		return 0;
+	}
 	for (n = 0, i = 0; i < cstate->n_states; i++) {
 		state.fid = *p++;
 		state.vid = *p++;