summaryrefslogtreecommitdiffstats
path: root/sys/dev/drm/drm_context.c
diff options
context:
space:
mode:
authorrnoland <rnoland@FreeBSD.org>2009-06-20 16:40:48 +0000
committerrnoland <rnoland@FreeBSD.org>2009-06-20 16:40:48 +0000
commit36023fcd0281ea8e5b75983968d2738a6e73204f (patch)
tree2ecbbc1c0ab4536180cc894b2ed5c531452a84ec /sys/dev/drm/drm_context.c
parent97ecde77c287998641d1fdf94fe72a9c24effc79 (diff)
downloadFreeBSD-src-36023fcd0281ea8e5b75983968d2738a6e73204f.zip
FreeBSD-src-36023fcd0281ea8e5b75983968d2738a6e73204f.tar.gz
realloc() behaves identically to malloc when passed a NULL object pointer
If an error does occur we would have left max_context with an incorrect value. MFC after: 3 days
Diffstat (limited to 'sys/dev/drm/drm_context.c')
-rw-r--r--sys/dev/drm/drm_context.c41
1 files changed, 15 insertions, 26 deletions
diff --git a/sys/dev/drm/drm_context.c b/sys/dev/drm/drm_context.c
index 41ac0c6..398008b 100644
--- a/sys/dev/drm/drm_context.c
+++ b/sys/dev/drm/drm_context.c
@@ -72,34 +72,23 @@ int drm_ctxbitmap_next(struct drm_device *dev)
}
set_bit(bit, dev->ctx_bitmap);
- DRM_DEBUG("drm_ctxbitmap_next bit : %d\n", bit);
+ DRM_DEBUG("bit : %d\n", bit);
if ((bit+1) > dev->max_context) {
- dev->max_context = (bit+1);
- if (dev->context_sareas != NULL) {
- drm_local_map_t **ctx_sareas;
-
- ctx_sareas = realloc(dev->context_sareas,
- dev->max_context * sizeof(*dev->context_sareas),
- DRM_MEM_SAREA, M_NOWAIT);
- if (ctx_sareas == NULL) {
- clear_bit(bit, dev->ctx_bitmap);
- DRM_UNLOCK();
- return -1;
- }
- dev->context_sareas = ctx_sareas;
- dev->context_sareas[bit] = NULL;
- } else {
- /* max_context == 1 at this point */
- dev->context_sareas = malloc(dev->max_context *
- sizeof(*dev->context_sareas), DRM_MEM_SAREA,
- M_NOWAIT);
- if (dev->context_sareas == NULL) {
- clear_bit(bit, dev->ctx_bitmap);
- DRM_UNLOCK();
- return -1;
- }
- dev->context_sareas[bit] = NULL;
+ drm_local_map_t **ctx_sareas;
+ int max_ctx = (bit+1);
+
+ ctx_sareas = realloc(dev->context_sareas,
+ max_ctx * sizeof(*dev->context_sareas),
+ DRM_MEM_SAREA, M_NOWAIT);
+ if (ctx_sareas == NULL) {
+ clear_bit(bit, dev->ctx_bitmap);
+ DRM_DEBUG("failed to allocate bit : %d\n", bit);
+ DRM_UNLOCK();
+ return -1;
}
+ dev->max_context = max_ctx;
+ dev->context_sareas = ctx_sareas;
+ dev->context_sareas[bit] = NULL;
}
DRM_UNLOCK();
return bit;
OpenPOWER on IntegriCloud