bug-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug #44057] -[NSBitmapImageRep copy] can cause image corruption (overla


From: Josh Freeman
Subject: [bug #44057] -[NSBitmapImageRep copy] can cause image corruption (overlapping memory pointers)
Date: Wed, 21 Jan 2015 03:44:06 +0000
User-agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:35.0) Gecko/20100101 Firefox/35.0

URL:
  <http://savannah.gnu.org/bugs/?44057>

                 Summary: -[NSBitmapImageRep copy] can cause image corruption
(overlapping memory pointers)
                 Project: GNUstep
            Submitted by: tedge
            Submitted on: Wed 21 Jan 2015 03:44:05 AM GMT
                Category: Gui/AppKit
                Severity: 3 - Normal
              Item Group: Bug
                  Status: None
                 Privacy: Public
             Assigned to: None
             Open/Closed: Open
         Discussion Lock: Any

    _______________________________________________________

Details:

    Setup: VirtualBox 4.3 + Ubuntu 14.04 guest, GNUstep from current SVN trunk
(used script:
http://lists.gnu.org/archive/html/discuss-gnustep/2014-05/msg00049.html )

    NSBitmapImageRep member, _imageData, is declared as NSData, however it is
initialized as NSMutableData:
-initWithBitmapDataPlanes:.. (NSBitmapImageRep.m:532).
-initWithFocusedViewRect: (sets it to the NSMutableData object from the dict
returned by -[NSGraphicsContext GSReadRect:], NSBitmapImageRep.m:347)

    -[NSBitmapImageRep copyWithZone:] returns an instance with the _imageData
member set to immutable data, because it copies _imageData using
-copyWithZone: (returns an immutable object) instead of -mutableCopyWithZone:
(returns a mutable one). (NBitmapImageRep.m:1765)

    The returned copy seems to work OK despite _imageData being immutable,
however, any additional copies made from this copy will not only have
immutable _imageData, but will also share the same pointer for data memory.
(Calling -copyWithZone: on immutable data only copies the original's data
pointer instead of allocating more memory & copying the bytes).

    Writing pixels to any bitmap copy that has overlapping _imageData memory
will unexpectedly change (corrupt) the pixel data in the other copies as
well.
    
    The attached patch fixes the issue by copying _imageData as a mutable
object instead of immutable: changed the call from -copyWithZone: to
-mutableCopyWithZone:. Test program is also attached.




    _______________________________________________________

File Attachments:


-------------------------------------------------------
Date: Wed 21 Jan 2015 03:44:05 AM GMT  Name: nsbitmapimagerep_copy_test.m 
Size: 2kB   By: tedge

<http://savannah.gnu.org/bugs/download.php?file_id=32879>
-------------------------------------------------------
Date: Wed 21 Jan 2015 03:44:05 AM GMT  Name: NSBitmapImageRep_Copy.patch 
Size: 491B   By: tedge

<http://savannah.gnu.org/bugs/download.php?file_id=32880>

    _______________________________________________________

Reply to this item at:

  <http://savannah.gnu.org/bugs/?44057>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.gnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]