Your message dated Tue, 22 Jun 2010 04:17:24 +0000
with message-id <[email protected]>
and subject line Bug#583804: fixed in gnustep-base 1.20.1-1
has caused the Debian Bug report #583804,
regarding Bug in gnustep-base1.19.3 (source): whitespace erroneously stripped 
from XML property lists
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
583804: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=583804
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package:        libgnustep-base1.19
Version:        > 1.19.1


When loading an XML Property List (plist) which contains leading or
trailing whitespace in a string property, or whitespace surrounding an
XML entity, this whitespace is incorrectly stripped.

eg. <string> A &amp; B </string>
-> "A&B"

This bug specifically affects the game Oolite on systems with these
faulty versions of libgnustep-base.  Oolite is packaged and shipped with
Debian.

This bug has been fixed by GNUstep in their trunk revision #30454 and
they will backport the fix to the 1.20 version of gnustep-base.  They
have indicated they will not backport the fix to 1.19.x
See: https://savannah.gnu.org/bugs/index.php?29955

The bug has also been raised for Ubuntu:
See: https://bugs.launchpad.net/ubuntu/+source/gnustep-base/+bug/585179

Please find attached a backported patch for gnustep-base-1.19.3.  This
patch has been used to build PPA versions of libgnustep-base1.19 for
Ubuntu Lucid and Ubuntu Maverick.
See:
https://launchpad.net/~3-launchpad-micha-michaelwerle-com/+archive/ppa

Please also find attached a test program (supplied by Jens Ayton) which
illustrates this issue.  Specifically, Tests #1, #2, and #6 are
affected.

Many thanks,
 - Micha.
diff -u -r gnustep-base-1.19.3.orig/Source/NSPropertyList.m gnustep-base-1.19.3/Source/NSPropertyList.m
--- gnustep-base-1.19.3.orig/Source/NSPropertyList.m	2009-08-04 09:08:52.000000000 +0100
+++ gnustep-base-1.19.3/Source/NSPropertyList.m	2010-05-29 20:20:02.733659340 +0100
@@ -81,6 +81,7 @@
   NSString				*key;
   BOOL					inArray;
   BOOL					inDictionary;
+  BOOL					inString;
   BOOL					parsed;
   BOOL					success;
   id					plist;
@@ -129,10 +130,15 @@
 }
 
 - (void) parser: (NSXMLParser *)parser
-  foundCharacters: (NSString *)string
+foundCharacters: (NSString *)string
 {
-  string = [string stringByTrimmingSpaces];
-  if ([string length] > 0)
+  [value appendString: string];
+}
+
+- (void) parser: (NSXMLParser *)parser
+foundIgnorableWhitespace: (NSString *)string
+{
+  if (YES == inString)
     {
       [value appendString: string];
     }
@@ -176,6 +182,10 @@
       inArray = YES;
       inDictionary = NO;
     }
+  else if ([elementName isEqualToString: @"string"] == YES)
+    {
+      inString = YES;
+    }
 }
 
 - (void) parser: (NSXMLParser *)parser
@@ -185,11 +195,12 @@
 {
   BOOL	inContainer = NO;
 
+  inString = NO;
   if ([elementName isEqualToString: @"dict"] == YES)
     {
       inContainer = YES;
     }
-  if ([elementName isEqualToString: @"array"] == YES)
+  else if ([elementName isEqualToString: @"array"] == YES)
     {
       inContainer = YES;
     }
diff -u -r gnustep-base-1.19.3.orig/Source/NSXMLParser.m gnustep-base-1.19.3/Source/NSXMLParser.m
--- gnustep-base-1.19.3.orig/Source/NSXMLParser.m	2009-08-04 08:47:58.000000000 +0100
+++ gnustep-base-1.19.3/Source/NSXMLParser.m	2010-05-29 20:16:10.553667187 +0100
@@ -620,6 +620,8 @@
   int line;				// current line (counts from 0)
   int column;				// current column (counts from 0)
   BOOL abort;				// abort parse loop
+  BOOL ignorable;			// whitespace is ignorable
+  BOOL whitespace;			// had only whitespace in current data
   BOOL shouldProcessNamespaces;
   BOOL shouldReportNamespacePrefixes;
   BOOL shouldResolveExternalEntities;
@@ -631,6 +633,7 @@
   IMP	foundCDATA;
   IMP	foundCharacters;
   IMP	foundComment;
+  IMP	foundIgnorable;
   
 } NSXMLParserIvars;
 
@@ -641,6 +644,7 @@
 static SEL	foundCDATASel;
 static SEL	foundCharactersSel;
 static SEL	foundCommentSel;
+static SEL	foundIgnorableSel;
 
 @implementation SloppyXMLParser
 
@@ -674,6 +678,8 @@
 	= @selector(parser:foundCharacters:);
       foundCommentSel
 	= @selector(parser:foundComment:);
+      foundIgnorableSel
+	= @selector(parser:foundIgnorableWhitespace:);
     }
 }
 
@@ -813,6 +819,16 @@
 	{
 	  this->foundComment = 0;
 	}
+
+      if ([_del respondsToSelector: foundIgnorableSel])
+	{
+	  this->foundIgnorable
+	    = [_del methodForSelector: foundIgnorableSel];
+	}
+      else
+	{
+	  this->foundIgnorable = 0;
+	}
     }
 }
 
@@ -1220,6 +1236,10 @@
       return [self _parseError: @"missing <?xml > preamble"
 	code: NSXMLParserDocumentStartError];
     }
+  /* Start by accumulating ignorable whitespace.
+   */
+  this->ignorable = YES;
+  this->whitespace = YES;
   c = cget();  // get first character
   while (!this->abort)
     {
@@ -1237,26 +1257,55 @@
             this->column = 0;
 	    break;
 
+          case '<':
+	    /* Whitespace immediately before an element is always ignorable.
+	     */
+	    this->ignorable = YES; /* Fall through to push out data */
           case EOF: 
-          case '<': 
           case '&': 
             {
               /* push out any characters that have been collected so far
                */
               if (this->cp - vp > 1)
                 {
-                  /* check for whitespace only - might set/reset
-                   * a flag to indicate so
-                   */
-                  if (this->foundCharacters != 0)
-                    {
-		      NSString	*s;
+		  const unsigned char	*p;
+		  NSString		*s;
 
-		      s = NewUTF8STR(vp, this->cp - vp - 1);
+		  p = this->cp - 1;
+		  if (YES == this->ignorable)
+		    {
+		      if (YES == this->whitespace)
+			{
+			  p = vp;	// all whitespace
+			}
+		      else
+			{
+			  /* step through trailing whitespace (if any)
+			   */
+			  while (p > vp && isspace(p[-1]))
+			    {
+			      p--;
+			    }
+			}
+		    }
+                  if (p - vp > 0 && this->foundCharacters != 0)
+                    {
+		      /* Process initial data as characters
+		       */
+		      s = NewUTF8STR(vp, p - vp);
                       (*this->foundCharacters)(_del,
 			foundCharactersSel, self, s);
 		      [s release];
                     }
+		  if (p < this->cp - 1 && this->foundIgnorable != 0)
+		    {
+		      /* Process data as ignorable whitespace
+		       */
+		      s = NewUTF8STR(p, this->cp - p - 1);
+		      (*this->foundIgnorable)(_del,
+			foundIgnorableSel, self, s);
+		      [s release];
+		    }
                   vp = this->cp;
                 }
             }
@@ -1265,6 +1314,30 @@
       switch(c)
         {
           default: 
+	    if (YES == this->whitespace && !isspace(c))
+	      {
+		if (YES == this->ignorable && this->cp - vp > 1)
+		  {
+		    /* We have accumulated ignorable whitespace ...
+		     * push it out.
+		     */
+		    if (this->foundIgnorable != 0)
+		      {
+			NSString	*s;
+
+			s = NewUTF8STR(vp, this->cp - vp - 1);
+			(*this->foundIgnorable)(_del,
+			  foundIgnorableSel, self, s);
+			[s release];
+		      }
+		    vp = this->cp - 1;
+		  }
+		/* We have read non-space data, so whitespace is no longer
+		 * ignorable, and the buffer no loinger contains only space.
+		 */
+		this->ignorable = NO;
+		this->whitespace = NO;
+	      }
             c = cget();  // just collect until we push out (again)
             continue;
 
@@ -1306,6 +1379,12 @@
             {
               NSString  *entity;
 
+	      /* After any entity, whitespace is no longer ignorable, but
+	       * we will have an empty buffer to accumulate it.
+	       */
+	      this->ignorable = NO;
+	      this->whitespace = YES;
+
               if ([self _parseEntity: &entity] == NO)
                 {
                   return [self _parseError: @"empty entity name"
@@ -1329,6 +1408,12 @@
               NSString                  *arg;
               const unsigned char       *tp = this->cp;  // tag pointer
 
+	      /* After processing a tag, whitespace will be ignorable and
+	       * we can start accumulating it in our buffer.
+	       */
+	      this->ignorable = YES;
+	      this->whitespace = YES;
+
               if (this->cp < this->cend-3
                 && strncmp((char *)this->cp, "!--", 3) == 0)
                 {
#import <Foundation/Foundation.h>


#define kTestCaseCount		(6)

typedef struct
{
	const char			*plist;
	size_t				plistLength;
	const char			*text;
	size_t				textLength;
} TestCase;


static const TestCase sTestCases[kTestCaseCount];


static void RunTestCase(const TestCase *testCase, unsigned idx);


int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
	
	unsigned i;
	for (i = 0; i < kTestCaseCount; i++)
	{
		RunTestCase(&sTestCases[i], i + 1);
	}
	
    [pool release];
    return 0;
}


static void RunTestCase(const TestCase *testCase, unsigned idx)
{
	NSData			*data = nil;
	NSString		*errorDesc = nil;
	id				plist = nil;
	NSString		*plistValue = nil;
	NSString		*expectedValue = nil;
	
	NS_DURING
	
	data = [NSData dataWithBytes:testCase->plist length:testCase->plistLength];
	if (data == nil)
	{
		NSLog(@"Test case %u FAILED: could not construct plist data.", idx);
		NS_VOIDRETURN;
	}
	
	plist = [NSPropertyListSerialization propertyListFromData:data
											 mutabilityOption:NSPropertyListImmutable
													   format:NULL
											 errorDescription:&errorDesc];
	
	if (plist == nil)
	{
		NSLog(@"Test case %u FAILED: could not parse property list. Error string: %@", idx, errorDesc);
		NS_VOIDRETURN;
	}
	
	if (![plist isKindOfClass:[NSArray class]] || [plist count] != 1)
	{
		NSLog(@"Test case %u FAILED: plist content is not array with one member.", idx);
		NS_VOIDRETURN;
	}
	
	plistValue = [plist objectAtIndex:0];
	if (![plistValue isKindOfClass:[NSString class]])
	{
		NSLog(@"Test case %u FAILED: plist content is not an array with one string.", idx);
		NS_VOIDRETURN;
	}
	
	data = [NSData dataWithBytes:testCase->text length:testCase->textLength];
	if (data == nil)
	{
		NSLog(@"Test case %u FAILED: could not construct string data.", idx);
		NS_VOIDRETURN;
	}
	
	expectedValue = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
	[expectedValue autorelease];
	if (expectedValue == nil)
	{
		NSLog(@"Test case %u FAILED: could not construct string from data (must be UTF-8).", idx);
		NS_VOIDRETURN;
	}
	
	if ([plistValue compare:expectedValue options:0] != NSOrderedSame)
	{
		NSLog(@"Test case %u FAILED: read string is wrong (expected \"%...@\", got \"%...@\").", idx, expectedValue, plistValue);
		NS_VOIDRETURN;
	}
	
	NS_HANDLER
	
	NSLog(@"Test case %u FAILED: exception thrown - %@ : %@", idx, [localException name], [localException reason]);
	return;
	
	NS_ENDHANDLER
	
	NSLog(@"Test case %u succeeded.", idx);
}


/*	Test data follows. Data entries are UTF-8 strings, expressed as byte
	arrays to minimize risk of encoding problems.
*/

// Cyrillic string.
static const char sTestPlist1[] =
{
	0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
	0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22,
	0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
	0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49,
	0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73,
	0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F,
	0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A,
	0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73,
	0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C,
	0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D,
	0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74,
	0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22,
	0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72,
	0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69,
	0x6E, 0x67, 0x3E, 0xD0, 0x93, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0,
	0xBE, 0xD1, 0x80, 0xD0, 0xB8, 0xD1, 0x82, 0x20, 0xD1, 0x81,
	0xD1, 0x82, 0xD0, 0xB0, 0xD0, 0xBD, 0xD1, 0x86, 0xD0, 0xB8,
	0xD1, 0x8F, 0x20, 0x4C, 0x61, 0x65, 0x6E, 0x69, 0x6E, 0x2E,
	0x20, 0xD0, 0x9C, 0xD1, 0x8B, 0x20, 0xD0, 0xB7, 0xD0, 0xB0,
	0xD0, 0xB3, 0xD1, 0x80, 0xD1, 0x83, 0xD0, 0xB7, 0xD0, 0xB8,
	0xD0, 0xBB, 0xD0, 0xB8, 0x20, 0xD1, 0x81, 0xD1, 0x82, 0xD1,
	0x8B, 0xD0, 0xBA, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xBE, 0xD1,
	0x87, 0xD0, 0xBD, 0xD1, 0x8B, 0xD0, 0xB5, 0x20, 0xD0, 0xB8,
	0xD0, 0xBD, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x80, 0xD1, 0x83,
	0xD0, 0xBA, 0xD1, 0x86, 0xD0, 0xB8, 0xD0, 0xB8, 0x20, 0xD0,
	0xBD, 0xD0, 0xB0, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69,
	0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72, 0x72, 0x61,
	0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74,
	0x3E, 0x0A
};
static const char sTestText1[] =
{
	0xD0, 0x93, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xBE, 0xD1, 0x80,
	0xD0, 0xB8, 0xD1, 0x82, 0x20, 0xD1, 0x81, 0xD1, 0x82, 0xD0,
	0xB0, 0xD0, 0xBD, 0xD1, 0x86, 0xD0, 0xB8, 0xD1, 0x8F, 0x20,
	0x4C, 0x61, 0x65, 0x6E, 0x69, 0x6E, 0x2E, 0x20, 0xD0, 0x9C,
	0xD1, 0x8B, 0x20, 0xD0, 0xB7, 0xD0, 0xB0, 0xD0, 0xB3, 0xD1,
	0x80, 0xD1, 0x83, 0xD0, 0xB7, 0xD0, 0xB8, 0xD0, 0xBB, 0xD0,
	0xB8, 0x20, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x8B, 0xD0, 0xBA,
	0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xBE, 0xD1, 0x87, 0xD0, 0xBD,
	0xD1, 0x8B, 0xD0, 0xB5, 0x20, 0xD0, 0xB8, 0xD0, 0xBD, 0xD1,
	0x81, 0xD1, 0x82, 0xD1, 0x80, 0xD1, 0x83, 0xD0, 0xBA, 0xD1,
	0x86, 0xD0, 0xB8, 0xD0, 0xB8, 0x20, 0xD0, 0xBD, 0xD0, 0xB0,
	0x20
};


// "A & B", using &amp;
static const char sTestPlist2[] =
{
	0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
	0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22,
	0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
	0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49,
	0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73,
	0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F,
	0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A,
	0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73,
	0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C,
	0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D,
	0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74,
	0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22,
	0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72,
	0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69,
	0x6E, 0x67, 0x3E, 0x41, 0x20, 0x26, 0x61, 0x6D, 0x70, 0x3B,
	0x20, 0x42, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
	0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E,
	0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x3E, 0x0A
};
static const char sTestText2[] =
{
	0x41, 0x20, 0x26, 0x20, 0x42
};


// Euro symbol (U+20AC), literal
static const char sTestPlist3[] =
{
	0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
	0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22,
	0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
	0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49,
	0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73,
	0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F,
	0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A,
	0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73,
	0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C,
	0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D,
	0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74,
	0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22,
	0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72,
	0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69,
	0x6E, 0x67, 0x3E, 0xE2, 0x82, 0xAC, 0x3C, 0x2F, 0x73, 0x74,
	0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72,
	0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69,
	0x73, 0x74, 0x3E, 0x0A
};
static const char sTestText3[] =
{
	0xE2, 0x82, 0xAC
};


// Euro symbol (U+20AC), escaped as &#8364;
static const char sTestPlist4[] =
{
	0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
	0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22,
	0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
	0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49,
	0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73,
	0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F,
	0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A,
	0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73,
	0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C,
	0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D,
	0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74,
	0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22,
	0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72,
	0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69,
	0x6E, 0x67, 0x3E, 0xE2, 0x82, 0xAC, 0x3C, 0x2F, 0x73, 0x74,
	0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72,
	0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69,
	0x73, 0x74, 0x3E, 0x0A
};
static const char sTestText4[] =
{
	0xE2, 0x82, 0xAC
};


// Cruzeiro symbol (U+20A2), literal
static const char sTestPlist5[] =
{
	0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
	0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22,
	0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
	0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49,
	0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73,
	0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F,
	0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A,
	0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73,
	0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C,
	0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D,
	0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74,
	0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22,
	0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72,
	0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69,
	0x6E, 0x67, 0x3E, 0xE2, 0x82, 0xA2, 0x3C, 0x2F, 0x73, 0x74,
	0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72,
	0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69,
	0x73, 0x74, 0x3E, 0x0A
};
static const char sTestText5[] =
{
	0xE2, 0x82, 0xA2
};


// "test " with trailing space
static const char sTestPlist6[] =
{
	0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
	0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22,
	0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C,
	0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49,
	0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73,
	0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F,
	0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A,
	0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73,
	0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C,
	0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D,
	0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74,
	0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22,
	0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72,
	0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69,
	0x6E, 0x67, 0x3E, 0x74, 0x65, 0x73, 0x74, 0x20, 0x3C, 0x2F,
	0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F,
	0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70,
	0x6C, 0x69, 0x73, 0x74, 0x3E, 0x0A
};
static const char sTestText6[] =
{
	0x74, 0x65, 0x73, 0x74, 0x20
};


static const TestCase sTestCases[kTestCaseCount] =
{
	{
		sTestPlist1, sizeof sTestPlist1,
		sTestText1, sizeof sTestText1
	},
	{
		sTestPlist2, sizeof sTestPlist2,
		sTestText2, sizeof sTestText2
	},
	{
		sTestPlist3, sizeof sTestPlist3,
		sTestText3, sizeof sTestText3
	},
	{
		sTestPlist4, sizeof sTestPlist4,
		sTestText4, sizeof sTestText4
	},
	{
		sTestPlist5, sizeof sTestPlist5,
		sTestText5, sizeof sTestText5
	},
	{
		sTestPlist6, sizeof sTestPlist6,
		sTestText6, sizeof sTestText6
	}
};

Attachment: signature.asc
Description: This is a digitally signed message part


--- End Message ---
--- Begin Message ---
Source: gnustep-base
Source-Version: 1.20.1-1

We believe that the bug you reported is fixed in the latest version of
gnustep-base, which is due to be installed in the Debian FTP archive:

gnustep-base-common_1.20.1-1_all.deb
  to main/g/gnustep-base/gnustep-base-common_1.20.1-1_all.deb
gnustep-base-doc_1.20.1-1_all.deb
  to main/g/gnustep-base/gnustep-base-doc_1.20.1-1_all.deb
gnustep-base-examples_1.20.1-1_all.deb
  to main/g/gnustep-base/gnustep-base-examples_1.20.1-1_all.deb
gnustep-base-runtime_1.20.1-1_i386.deb
  to main/g/gnustep-base/gnustep-base-runtime_1.20.1-1_i386.deb
gnustep-base_1.20.1-1.diff.gz
  to main/g/gnustep-base/gnustep-base_1.20.1-1.diff.gz
gnustep-base_1.20.1-1.dsc
  to main/g/gnustep-base/gnustep-base_1.20.1-1.dsc
gnustep-base_1.20.1.orig.tar.gz
  to main/g/gnustep-base/gnustep-base_1.20.1.orig.tar.gz
libgnustep-base-dev_1.20.1-1_i386.deb
  to main/g/gnustep-base/libgnustep-base-dev_1.20.1-1_i386.deb
libgnustep-base1.20-dbg_1.20.1-1_i386.deb
  to main/g/gnustep-base/libgnustep-base1.20-dbg_1.20.1-1_i386.deb
libgnustep-base1.20_1.20.1-1_i386.deb
  to main/g/gnustep-base/libgnustep-base1.20_1.20.1-1_i386.deb



A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to [email protected],
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Yavor Doganov <[email protected]> (supplier of updated gnustep-base package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing [email protected])


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Format: 1.8
Date: Mon, 21 Jun 2010 19:57:31 +0300
Source: gnustep-base
Binary: gnustep-base-common gnustep-base-runtime libgnustep-base1.20 
libgnustep-base-dev libgnustep-base1.20-dbg gnustep-base-examples 
gnustep-base-doc
Architecture: source all i386
Version: 1.20.1-1
Distribution: experimental
Urgency: low
Maintainer: Debian GNUstep maintainers 
<[email protected]>
Changed-By: Yavor Doganov <[email protected]>
Description: 
 gnustep-base-common - GNUstep Base library - common files
 gnustep-base-doc - Documentation for the GNUstep Base Library
 gnustep-base-examples - Examples using the GNUstep Base Library
 gnustep-base-runtime - GNUstep Base library - daemons and tools
 libgnustep-base-dev - GNUstep Base header files and development libraries
 libgnustep-base1.20 - GNUstep Base library
 libgnustep-base1.20-dbg - GNUstep Base library - debugging symbols
Closes: 583804 583825
Changes: 
 gnustep-base (1.20.1-1) experimental; urgency=low
 .
   * New upstream bugfix release:
     + Fixes whitespace handling in XML property lists (Closes: #583804).
     + Fixes FTBFS on GNU/kFreeBSD (Closes: #583825).
   * debian/patches/avoid-nsl-linkage.patch: Refresh.
   * debian/patches/autoreconf.patch: Regenerate.
   * debian/rules (LDFLAGS): Revert last change; gnustep_base_user_main is
     declared `weak' as of this release, so this should allow
     -Wl,--no-undefined.
     (install-common): Delete a useless backup file.
   * debian/watch: Track only stable releases.
Checksums-Sha1: 
 43513c51ba90e560a5f7c5d3bedd7fac1ccf6a06 1693 gnustep-base_1.20.1-1.dsc
 5aff36405aa712473d51877ab77156d231297744 2612827 
gnustep-base_1.20.1.orig.tar.gz
 a0211cba47385dadc9db7a613714db680807dafe 142077 gnustep-base_1.20.1-1.diff.gz
 ec8e972a6afe1c1f912e9014007de54eef76d1c6 174476 
gnustep-base-common_1.20.1-1_all.deb
 24b6df87f76089ebd685e4ba935cc6e61373cf17 16586 
gnustep-base-examples_1.20.1-1_all.deb
 cb9599c2c7e8cbf963cb7d70c4fdb44f81c16c00 1797772 
gnustep-base-doc_1.20.1-1_all.deb
 33f034bef8e20feb796898653c8fea7ef059dbb2 222916 
gnustep-base-runtime_1.20.1-1_i386.deb
 760bcc8d325f8866e9e28b61c206da8fc6a9085b 1227006 
libgnustep-base1.20_1.20.1-1_i386.deb
 b429158b09a82afc3c960975719985638a533241 2088212 
libgnustep-base-dev_1.20.1-1_i386.deb
 113c62e96145230ddb64699cecd7eb6bb3077e30 1860588 
libgnustep-base1.20-dbg_1.20.1-1_i386.deb
Checksums-Sha256: 
 9f191c6a2de13ce6d43c275cb1dea5296ef1e76cea693d66ee8fea18b057d3d9 1693 
gnustep-base_1.20.1-1.dsc
 fd495d7d800078f7fea7528472d5683899fb93f0270fe7e70f92cf310cd43610 2612827 
gnustep-base_1.20.1.orig.tar.gz
 6322de683841d79aa3e2c9e85474d60ba4254c1e32cf4f5a40ca249310305ef0 142077 
gnustep-base_1.20.1-1.diff.gz
 902ceac5be8029f0046018f715fc8a0da5429995d43670bf413be93f911a9ad9 174476 
gnustep-base-common_1.20.1-1_all.deb
 cf2d4a4f5b72d5401316c0171da041328c4e332293714200735039778657e63e 16586 
gnustep-base-examples_1.20.1-1_all.deb
 c47b32a386e5062c3ff7f7eecbd5ba0aef3407dc630c3a6aaf915893fa46fc33 1797772 
gnustep-base-doc_1.20.1-1_all.deb
 84880329bfabcea91e27429c28eaec7d419e66d498fed2ab71b51afd5c56354a 222916 
gnustep-base-runtime_1.20.1-1_i386.deb
 988e2dd10127e7df6f6d85a5fad30af9322b904d1e932547291510b7b21f4001 1227006 
libgnustep-base1.20_1.20.1-1_i386.deb
 87be7ce04bcbbe7f9e733246668b15f66630d48b7d8b93e7a991112021a4694d 2088212 
libgnustep-base-dev_1.20.1-1_i386.deb
 7a9833c60152c72d1210ac8a44516ce4f3462124373c8900786247cf5a0b0747 1860588 
libgnustep-base1.20-dbg_1.20.1-1_i386.deb
Files: 
 ac2559038e2578cf5e33532a800f66b8 1693 gnustep optional 
gnustep-base_1.20.1-1.dsc
 8ade7c698159df7a43c7b5052321e4e0 2612827 gnustep optional 
gnustep-base_1.20.1.orig.tar.gz
 9fd3174e7960fe03126ff41c0a99fab6 142077 gnustep optional 
gnustep-base_1.20.1-1.diff.gz
 01e2bf1dd9df4e7196b2127803835710 174476 gnustep optional 
gnustep-base-common_1.20.1-1_all.deb
 0aa164f64fbaee9e7fe5d07300246142 16586 gnustep optional 
gnustep-base-examples_1.20.1-1_all.deb
 1ae90d66d3f893dfdaa3352674b65627 1797772 doc optional 
gnustep-base-doc_1.20.1-1_all.deb
 203356ec27d68413507e1006a8669cf1 222916 gnustep optional 
gnustep-base-runtime_1.20.1-1_i386.deb
 c5f8389e4f6b79c593fb4b976bdd2b35 1227006 libs optional 
libgnustep-base1.20_1.20.1-1_i386.deb
 5d195e66b9fec31a75c9bd74fbdba0a5 2088212 libdevel optional 
libgnustep-base-dev_1.20.1-1_i386.deb
 d5650b4a8fa1f7aa2432236ab6e5a5a8 1860588 debug extra 
libgnustep-base1.20-dbg_1.20.1-1_i386.deb

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEARECAAYFAkwgOAYACgkQ5ItltUs5T37HGwCfe4ES85sBsaGYun6WBPcyAa4l
B3sAn0aRILpAGZHyCBuI2QV3cv4B4Aef
=/Wsz
-----END PGP SIGNATURE-----



--- End Message ---

Reply via email to