Skip to content

Commit

Permalink
drm/nouveau/bios/bitP: check that table is long enough for optional p…
Browse files Browse the repository at this point in the history
…ointers

Fixes OOB VBIOS accesses on some boards.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
  • Loading branch information
Ben Skeggs committed Apr 29, 2017
1 parent eef4988 commit a7cb78b
Show file tree
Hide file tree
Showing 5 changed files with 5 additions and 5 deletions.
2 changes: 1 addition & 1 deletion drivers/gpu/drm/nouveau/nvkm/subdev/bios/boost.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ nvbios_boostTe(struct nvkm_bios *bios,
u32 boost = 0;

if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 2)
if (bit_P.version == 2 && bit_P.length >= 0x34)
boost = nvbios_rd32(bios, bit_P.offset + 0x30);

if (boost) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/nouveau/nvkm/subdev/bios/cstep.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ nvbios_cstepTe(struct nvkm_bios *bios,
u32 cstep = 0;

if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 2)
if (bit_P.version == 2 && bit_P.length >= 0x38)
cstep = nvbios_rd32(bios, bit_P.offset + 0x34);

if (cstep) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/nouveau/nvkm/subdev/bios/fan.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ nvbios_fan_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
u32 fan = 0;

if (!bit_entry(bios, 'P', &bit_P)) {
if (bit_P.version == 2 && bit_P.length >= 0x5a)
if (bit_P.version == 2 && bit_P.length >= 0x5c)
fan = nvbios_rd32(bios, bit_P.offset + 0x58);

if (fan) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/nouveau/nvkm/subdev/bios/power_budget.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ nvbios_power_budget_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt,
u32 power_budget;

if (bit_entry(bios, 'P', &bit_P) || bit_P.version != 2 ||
bit_P.length < 0x2c)
bit_P.length < 0x30)
return 0;

power_budget = nvbios_rd32(bios, bit_P.offset + 0x2c);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/nouveau/nvkm/subdev/bios/vpstate.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ nvbios_vpstate_offset(struct nvkm_bios *b)
struct bit_entry bit_P;

if (!bit_entry(b, 'P', &bit_P)) {
if (bit_P.version == 2)
if (bit_P.version == 2 && bit_P.length >= 0x3c)
return nvbios_rd32(b, bit_P.offset + 0x38);
}

Expand Down

0 comments on commit a7cb78b

Please sign in to comment.