Ignore this. Better patch coming. Alex
On Tue, Oct 18, 2011 at 3:56 PM, <alexdeucher at gmail.com> wrote: > From: Alex Deucher <alexander.deucher at amd.com> > > Check access to the fb scratch array to avoid accessing > memory past the end of the array. > > Signed-off-by: Alex Deucher <alexander.deucher at amd.com> > Cc: stable at kernel.org > --- > ?drivers/gpu/drm/radeon/atom.c | ? 15 +++++++++++++-- > ?drivers/gpu/drm/radeon/atom.h | ? ?1 + > ?2 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c > index e88c644..f69b852 100644 > --- a/drivers/gpu/drm/radeon/atom.c > +++ b/drivers/gpu/drm/radeon/atom.c > @@ -277,7 +277,12 @@ static uint32_t atom_get_src_int(atom_exec_context *ctx, > uint8_t attr, > ? ? ? ?case ATOM_ARG_FB: > ? ? ? ? ? ? ? ?idx = U8(*ptr); > ? ? ? ? ? ? ? ?(*ptr)++; > - ? ? ? ? ? ? ? val = gctx->scratch[((gctx->fb_base + idx) / 4)]; > + ? ? ? ? ? ? ? if ((gctx->fb_base + idx) > gctx->scratch_size_bytes) { > + ? ? ? ? ? ? ? ? ? ? ? DRM_DEBUG_KMS("ATOM: fb read beyond scratch region: > %d vs. %d\n", > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gctx->fb_base + idx, > gctx->scratch_size_bytes); > + ? ? ? ? ? ? ? ? ? ? ? val = 0; > + ? ? ? ? ? ? ? } else > + ? ? ? ? ? ? ? ? ? ? ? val = gctx->scratch[((gctx->fb_base + idx) / 4)]; > ? ? ? ? ? ? ? ?if (print) > ? ? ? ? ? ? ? ? ? ? ? ?DEBUG("FB[0x%02X]", idx); > ? ? ? ? ? ? ? ?break; > @@ -531,7 +536,11 @@ static void atom_put_dst(atom_exec_context *ctx, int > arg, uint8_t attr, > ? ? ? ?case ATOM_ARG_FB: > ? ? ? ? ? ? ? ?idx = U8(*ptr); > ? ? ? ? ? ? ? ?(*ptr)++; > - ? ? ? ? ? ? ? gctx->scratch[((gctx->fb_base + idx) / 4)] = val; > + ? ? ? ? ? ? ? if ((gctx->fb_base + idx) > gctx->scratch_size_bytes) { > + ? ? ? ? ? ? ? ? ? ? ? DRM_DEBUG_KMS("ATOM: fb write beyond scratch region: > %d vs. %d\n", > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gctx->fb_base + idx, > gctx->scratch_size_bytes); > + ? ? ? ? ? ? ? } else > + ? ? ? ? ? ? ? ? ? ? ? gctx->scratch[((gctx->fb_base + idx) / 4)] = val; > ? ? ? ? ? ? ? ?DEBUG("FB[0x%02X]", idx); > ? ? ? ? ? ? ? ?break; > ? ? ? ?case ATOM_ARG_PLL: > @@ -1370,11 +1379,13 @@ int atom_allocate_fb_scratch(struct atom_context *ctx) > > ? ? ? ? ? ? ? ?usage_bytes = > firmware_usage->asFirmwareVramReserveInfo[0].usFirmwareUseInKb * 1024; > ? ? ? ?} > + ? ? ? ctx->scratch_size_bytes = 0; > ? ? ? ?if (usage_bytes == 0) > ? ? ? ? ? ? ? ?usage_bytes = 20 * 1024; > ? ? ? ?/* allocate some scratch memory */ > ? ? ? ?ctx->scratch = kzalloc(usage_bytes, GFP_KERNEL); > ? ? ? ?if (!ctx->scratch) > ? ? ? ? ? ? ? ?return -ENOMEM; > + ? ? ? ctx->scratch_size_bytes = usage_bytes; > ? ? ? ?return 0; > ?} > diff --git a/drivers/gpu/drm/radeon/atom.h b/drivers/gpu/drm/radeon/atom.h > index a589a55..93cfe20 100644 > --- a/drivers/gpu/drm/radeon/atom.h > +++ b/drivers/gpu/drm/radeon/atom.h > @@ -137,6 +137,7 @@ struct atom_context { > ? ? ? ?int cs_equal, cs_above; > ? ? ? ?int io_mode; > ? ? ? ?uint32_t *scratch; > + ? ? ? int scratch_size_bytes; > ?}; > > ?extern int atom_debug; > -- > 1.7.1.1 > >