diff --git a/ChangeLog b/ChangeLog index a001f51e7..04516ca32 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-02-27 Doug Simons + Merged to trunk by: greg.casamento@gmail.com + + * Source/NSXMLDocument.m: Fix bugs in setCharacterEncoding: and + copyWithZone: that cause a memory crash when tree is freed. + Doug Simons + 2012-02-27 Fred Kiefer * Source/NSXMLNode.m (+_objectForNode:): Get the actual class from diff --git a/Source/NSXMLDocument.m b/Source/NSXMLDocument.m index a7c4cd4b2..55f604c95 100644 --- a/Source/NSXMLDocument.m +++ b/Source/NSXMLDocument.m @@ -53,6 +53,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); - (void) _addSubNode:(NSXMLNode *)subNode; - (void) _removeSubNode:(NSXMLNode *)subNode; - (void) _insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index; +- (id) _initWithNode:(xmlNodePtr)node kind:(NSXMLNodeKind)kind; @end @implementation NSXMLDocument @@ -228,7 +229,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); - (void) setCharacterEncoding: (NSString*)encoding { - MY_DOC->encoding = XMLSTRING(encoding); + MY_DOC->encoding = xmlStrdup(XMLSTRING(encoding)); } - (void) setDocumentContentKind: (NSXMLDocumentContentKind)kind @@ -474,10 +475,12 @@ extern void clearPrivatePointers(xmlNodePtr aNode); - (id) copyWithZone: (NSZone *)zone { - NSXMLDocument *c = (NSXMLDocument*)[super copyWithZone: zone]; - internal->node = (xmlDoc *)xmlCopyDoc(MY_DOC, 1); // copy recursively - clearPrivatePointers(internal->node); // clear out all of the _private pointers in the entire tree - ((xmlNodePtr)internal->node)->_private = c; + id c = [[self class] allocWithZone: zone]; + xmlDocPtr newNode = xmlCopyDoc(MY_DOC, 1); // make a deep copy + clearPrivatePointers((xmlNodePtr)newNode); + + c = [c _initWithNode:(xmlNodePtr)newNode kind:internal->kind]; + return c; }