--- a/sys/dev/drm/radeon/r100.c +++ b/sys/dev/drm/radeon/r100.c @@ -1950,6 +1950,10 @@ break; case 0x23: /* 3D_RNDR_GEN_INDX_PRIM on r100/r200 */ + if (pkt->count < 3) { + DRM_ERROR("Malformed 3D_RNDR_GEN_INDX_PRIM packet\n"); + return -EINVAL; + } r = radeon_cs_packet_next_reloc(p, &reloc, 0); if (r) { DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); @@ -1972,6 +1976,10 @@ return r; break; case PACKET3_3D_DRAW_IMMD: + if (pkt->count < 1) { + DRM_ERROR("Malformed DRAW_IMMD packet\n"); + return -EINVAL; + } if (((radeon_get_ib_value(p, idx + 1) >> 4) & 0x3) != 3) { DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); return -EINVAL; @@ -2011,6 +2019,10 @@ break; /* triggers drawing using indices to vertex buffer */ case PACKET3_3D_DRAW_VBUF: + if (pkt->count < 1) { + DRM_ERROR("Malformed DRAW_VBUF packet\n"); + return -EINVAL; + } track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); r = r100_cs_track_check(p->rdev, track); if (r) @@ -2018,6 +2030,10 @@ break; /* triggers drawing of vertex buffers setup elsewhere */ case PACKET3_3D_DRAW_INDX: + if (pkt->count < 1) { + DRM_ERROR("Malformed DRAW_INDX packet\n"); + return -EINVAL; + } track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); r = r100_cs_track_check(p->rdev, track); if (r)