You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by "Scott Cantor (JIRA)" <xe...@xml.apache.org> on 2015/02/28 01:53:05 UTC

[jira] [Resolved] (XERCESC-1979) OutOfMemoryException being thrown on creation of an LS Serializer

     [ https://issues.apache.org/jira/browse/XERCESC-1979?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Scott Cantor resolved XERCESC-1979.
-----------------------------------
    Resolution: Fixed

> OutOfMemoryException being thrown on creation of an LS Serializer
> -----------------------------------------------------------------
>
>                 Key: XERCESC-1979
>                 URL: https://issues.apache.org/jira/browse/XERCESC-1979
>             Project: Xerces-C++
>          Issue Type: Bug
>          Components: DOM
>    Affects Versions: 3.1.1
>         Environment: AIX 6.1 and AIX 7.1
> 32-bit binary distribution libraries of Xerces 3.1.1
> Compiler (on AIX 6.1):
> IBM XL C/C++ for AIX, V11.1 (5724-X13)
> Version: 11.01.0000.0000
> Driver Version: 11.01(C/C++) Level: 100304
> C Front End Version: 11.00(C/C++) Level: 100301
> C++ Front End Version: 11.01(C/C++) Level: 100304
> High-Level Optimizer Version: 11.01(C/C++) and 13.01(Fortran) Level: 100301
> Low-Level Optimizer Version: 11.01(C/C++) and 13.01(Fortran) Level: 100304
>            Reporter: Matt Dissinger
>            Assignee: Alberto Massari
>             Fix For: 3.1.2, 3.2.0
>
>         Attachments: Xerces MemoryManagerImpl Patch.zip
>
>
> I am seeing with one of my companies' unit test binaries an OutOfMemoryException being thrown when attempting to create an LS serializer.
> The program code in question is:
> {code}
> xercesc::DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("LS"));
> impl->createLSSerializer();
> {code}
> We are currently only seeing this with one of our unit test binaries, and only on AIX.  We haven't seen this yet on our production binaries or on Solaris, RedHat Enterprise Linux, or Windows.  The root cause is an allocation of 0 bytes for which the ::operator new is returning a NULL pointer, and the MemoryManagerImpl throws an OutOfMemoryException when this occurs.  This happens as a result of the DOMLSSerializerImpl object allocating a RefVectorOf with an initial size of 0, and the base class BaseRefVectorOf's constructor calling allocate with 0 bytes.
> Even though the C++ standard does allow for allocations of 0 bytes, it is a potential point of failure that can be avoided by not attempting the 0 byte allocation.  Since the standard does define that dereferencing a pointer returned as a request for zero size is undefined, it should be safe to return NULL for 0 byte allocations (3.7.4.1 - Allocation functions, point 2, from the draft version here: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3035.pdf).
> I've tested a change to the MemoryManagerImpl class which checks for 0 byte allocations and immediately returns NULL rather than attempting an ::operator new (0), and it has fixed the issue in our AIX environments.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: c-dev-help@xerces.apache.org