Page MenuHomeFreeBSD

D59568.diff
No OneTemporary

D59568.diff

diff --git a/sys/dev/acpica/acpi_spmc.c b/sys/dev/acpica/acpi_spmc.c
--- a/sys/dev/acpica/acpi_spmc.c
+++ b/sys/dev/acpica/acpi_spmc.c
@@ -724,6 +724,18 @@
struct acpi_spmc_constraint *constraint;
ACPI_OBJECT *name_obj;
+ if (object->Type != ACPI_TYPE_PACKAGE) {
+ device_printf(sc->dev, "AMD: Constraints: object not "
+ "package.\n");
+ return (ENXIO);
+ }
+ if (object->Package.Count != 3) {
+ device_printf(sc->dev,
+ "AMD: Constraints: Package has %d elements\n",
+ object->Package.Count);
+ return (ENXIO);
+ }
+
/*
* First element in the package is unknown.
* Second element is the number of device constraints.
@@ -732,6 +744,11 @@
constraint_count = object->Package.Elements[1].Integer.Value;
constraints = &object->Package.Elements[2];
+ if (constraints->Type != ACPI_TYPE_PACKAGE) {
+ device_printf(sc->dev,
+ "AMD: Constraints: Third element not a package\n");
+ return (ENXIO);
+ }
if (constraints->Package.Count != constraint_count) {
device_printf(sc->dev,
"AMD: Constraints: Count mismatch (%d to %zu)\n",
@@ -743,28 +760,43 @@
sc->constraints = malloc(constraint_count * sizeof *sc->constraints,
M_TEMP, M_WAITOK | M_ZERO);
- for (size_t i = 0; i < constraint_count; i++) {
+ for (size_t i = 0, j = 0; i < constraint_count; i++) {
/* Parse the constraint package. */
constraint_obj = &constraints->Package.Elements[i];
+ constraint = &sc->constraints[j];
+
+ if (constraint_obj->Type != ACPI_TYPE_PACKAGE) {
+ device_printf(sc->dev,
+ "AMD: Constraint %zu not a package\n", i);
+ goto skip;
+ }
if (constraint_obj->Package.Count != 4) {
device_printf(sc->dev,
"AMD: Constraint %zu has %d elements, not 4\n",
i, constraint_obj->Package.Count);
- acpi_spmc_free_constraints(sc);
- return (ENXIO);
+ goto skip;
}
- constraint = &sc->constraints[i];
constraint->enabled =
constraint_obj->Package.Elements[0].Integer.Value;
-
name_obj = &constraint_obj->Package.Elements[1];
- constraint->name = strdup(name_obj->String.Pointer, M_TEMP);
+ if (name_obj->Type != ACPI_TYPE_STRING) {
+ device_printf(sc->dev,
+ "AMD: Constraint %zu's name is not string.\n", i);
+ goto skip;
+ }
+
+ constraint->name = strdup(name_obj->String.Pointer, M_TEMP);
constraint->function_states =
constraint_obj->Package.Elements[2].Integer.Value;
constraint->min_d_state =
constraint_obj->Package.Elements[3].Integer.Value;
+
+ j++;
+ continue;
+skip:
+ sc->constraint_count--;
}
return (0);

File Metadata

Mime Type
text/plain
Expires
Sun, Sep 13, 3:10 PM (14 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38852974
Default Alt Text
D59568.diff (2 KB)

Event Timeline