Skip to content

Commit

Permalink
drm/radeon: Fix 3 regressions - since buffer rework
Browse files Browse the repository at this point in the history
Commit b4fe945 introduced 3 bugs,
fix them:

* Use the right command dword for second packet offset in
  RADEON_CNTL_PAINT/BITBLT_MULTI.
* Don't leak memory if drm_buffer_copy_from_user() fails.
* Don't call drm_buffer_unprocessed() unless drm_buffer_alloc() and
  drm_buffer_copy_from_user() have been called successfully first.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Pauli Nieminen <suokkos@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Jean Delvare authored and Dave Airlie committed May 11, 2010
1 parent 8cfe92d commit c9ff04c
Showing 1 changed file with 10 additions and 9 deletions.
19 changes: 10 additions & 9 deletions drivers/gpu/drm/radeon/radeon_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,7 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
if ((*cmd & RADEON_GMC_SRC_PITCH_OFFSET_CNTL) &&
(*cmd & RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
u32 *cmd3 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 3);
offset = *cmd << 10;
offset = *cmd3 << 10;
if (radeon_check_and_fixup_offset
(dev_priv, file_priv, &offset)) {
DRM_ERROR("Invalid second packet offset\n");
Expand Down Expand Up @@ -2895,18 +2895,20 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data,
return rv;
rv = drm_buffer_copy_from_user(cmdbuf->buffer, buffer,
cmdbuf->bufsz);
if (rv)
if (rv) {
drm_buffer_free(cmdbuf->buffer);
return rv;
}
}
} else
goto done;

orig_nbox = cmdbuf->nbox;

if (dev_priv->microcode_version == UCODE_R300) {
int temp;
temp = r300_do_cp_cmdbuf(dev, file_priv, cmdbuf);

if (cmdbuf->bufsz != 0)
drm_buffer_free(cmdbuf->buffer);
drm_buffer_free(cmdbuf->buffer);

return temp;
}
Expand Down Expand Up @@ -3012,16 +3014,15 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data,
}
}

if (cmdbuf->bufsz != 0)
drm_buffer_free(cmdbuf->buffer);
drm_buffer_free(cmdbuf->buffer);

done:
DRM_DEBUG("DONE\n");
COMMIT_RING();
return 0;

err:
if (cmdbuf->bufsz != 0)
drm_buffer_free(cmdbuf->buffer);
drm_buffer_free(cmdbuf->buffer);
return -EINVAL;
}

Expand Down

0 comments on commit c9ff04c

Please sign in to comment.