Index: src/OFXMLFactory.h ================================================================== --- src/OFXMLFactory.h +++ src/OFXMLFactory.h @@ -6,10 +6,13 @@ * * This file is part of libobjfw. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE included in * the packaging of this file. */ + +#import +#import #import "OFObject.h" /** * The OFXMLFactory class provides an easy way to create XML stanzas. Index: src/OFXMLFactory.m ================================================================== --- src/OFXMLFactory.m +++ src/OFXMLFactory.m @@ -10,10 +10,11 @@ */ #import "config.h" #import +#import #import #import #import #import "OFXMLFactory.h" @@ -107,11 +108,11 @@ + (char*)createStanza: (const char*)name withCloseTag: (BOOL)close andData: (const char*)data, ... { - char *arg, *val, *xml; + char *arg, *val, *xml, *esc_val; size_t i, len; va_list args; /* Start of tag */ len = strlen(name); @@ -126,24 +127,24 @@ i = 0; xml[i++] = '<'; memcpy(xml + i, name, strlen(name)); i += strlen(name); - /* Arguments */ - va_start(args, data); - while ((arg = va_arg(args, char*)) != NULL && - (val = va_arg(args, char*)) != NULL) { - char *esc_val = NULL; + /* + * Arguments + * + * va_start / va_end need to be INSIDE the @try block due to a bug in + * gcc 4.0.1. (Only in Apple gcc?) + */ + @try { + va_start(args, data); - @try { + while ((arg = va_arg(args, char*)) != NULL && + (val = va_arg(args, char*)) != NULL) { + esc_val = NULL; /* Needed for our @catch */ esc_val = [OFXMLFactory escapeCString: val]; - } @catch (OFException *e) { - free(xml); - @throw e; - } - @try { xf_resize_chars(&xml, &len, 1 + strlen(arg) + 2 + strlen(esc_val) + 1, self); xml[i++] = ' '; memcpy(xml + i, arg, strlen(arg)); @@ -151,15 +152,23 @@ xml[i++] = '='; xml[i++] = '\''; memcpy(xml + i, esc_val, strlen(esc_val)); i += strlen(esc_val); xml[i++] = '\''; - } @finally { + free(esc_val); } + + va_end(args); + } @catch (OFException *e) { + if (esc_val != NULL) + free(esc_val); + if (xml != NULL) + free(xml); + + @throw e; } - va_end(args); /* End of tag */ if (close) { if (data == NULL) { xf_resize_chars(&xml, &len, 2 - 1, self);