Author: rnoland
Date: Tue Jun 23 16:12:40 2009
New Revision: 194736
URL: http://svn.freebsd.org/changeset/base/194736

Log:
  Merge 194539 from HEAD
  
  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.

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/drm/drm_context.c

Modified: stable/7/sys/dev/drm/drm_context.c
==============================================================================
--- stable/7/sys/dev/drm/drm_context.c  Tue Jun 23 16:11:44 2009        
(r194735)
+++ stable/7/sys/dev/drm/drm_context.c  Tue Jun 23 16:12:40 2009        
(r194736)
@@ -72,34 +72,23 @@ int drm_ctxbitmap_next(struct drm_device
        }
 
        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;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to