Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c4814f9001a8dd28e39311a919beac34f778f76d
Commit:     c4814f9001a8dd28e39311a919beac34f778f76d
Parent:     777c7738a598c6e8d4b850181a509757fb79cf36
Author:     Michel Dänzer <[EMAIL PROTECTED]>
AuthorDate: Sat May 26 04:37:08 2007 +1000
Committer:  Dave Airlie <[EMAIL PROTECTED]>
CommitDate: Sat May 26 04:37:08 2007 +1000

    drm: make sure the drawable code doesn't call malloc(0).
    
    Signed-off-by: Michel Dänzer <[EMAIL PROTECTED]>
    Signed-off-by: Dave Airlie <[EMAIL PROTECTED]>
---
 drivers/char/drm/drm_drawable.c |   41 ++++++++++++++++++++++++--------------
 1 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/drivers/char/drm/drm_drawable.c b/drivers/char/drm/drm_drawable.c
index de37d5f..b33313b 100644
--- a/drivers/char/drm/drm_drawable.c
+++ b/drivers/char/drm/drm_drawable.c
@@ -172,38 +172,49 @@ int drm_rmdraw(DRM_IOCTL_ARGS)
 
                bitfield_length = idx + 1;
 
-               if (idx != id / (8 * sizeof(*bitfield)))
-                       bitfield = drm_alloc(bitfield_length *
-                                            sizeof(*bitfield), DRM_MEM_BUFS);
+               bitfield = NULL;
 
-               if (!bitfield && bitfield_length) {
-                       bitfield = dev->drw_bitfield;
-                       bitfield_length = dev->drw_bitfield_length;
+               if (bitfield_length) {
+                       if (bitfield_length != dev->drw_bitfield_length)
+                               bitfield = drm_alloc(bitfield_length *
+                                                    sizeof(*bitfield),
+                                                    DRM_MEM_BUFS);
+
+                       if (!bitfield) {
+                               bitfield = dev->drw_bitfield;
+                               bitfield_length = dev->drw_bitfield_length;
+                       }
                }
        }
 
        if (bitfield != dev->drw_bitfield) {
                info_length = 8 * sizeof(*bitfield) * bitfield_length;
 
-               info = drm_alloc(info_length * sizeof(*info), DRM_MEM_BUFS);
+               if (info_length) {
+                       info = drm_alloc(info_length * sizeof(*info),
+                                        DRM_MEM_BUFS);
 
-               if (!info && info_length) {
-                       info = dev->drw_info;
-                       info_length = dev->drw_info_length;
-               }
+                       if (!info) {
+                               info = dev->drw_info;
+                               info_length = dev->drw_info_length;
+                       }
+               } else
+                       info = NULL;
 
                spin_lock_irqsave(&dev->drw_lock, irqflags);
 
-               memcpy(bitfield, dev->drw_bitfield, bitfield_length *
-                      sizeof(*bitfield));
+               if (bitfield)
+                       memcpy(bitfield, dev->drw_bitfield, bitfield_length *
+                              sizeof(*bitfield));
                drm_free(dev->drw_bitfield, sizeof(*bitfield) *
                         dev->drw_bitfield_length, DRM_MEM_BUFS);
                dev->drw_bitfield = bitfield;
                dev->drw_bitfield_length = bitfield_length;
 
                if (info != dev->drw_info) {
-                       memcpy(info, dev->drw_info, info_length *
-                              sizeof(*info));
+                       if (info)
+                               memcpy(info, dev->drw_info, info_length *
+                                      sizeof(*info));
                        drm_free(dev->drw_info, sizeof(*info) *
                                 dev->drw_info_length, DRM_MEM_BUFS);
                        dev->drw_info = info;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to