Author: rfm
Date: Fri Mar 28 17:01:13 2014
New Revision: 37776

URL: http://svn.gna.org/viewcvs/gnustep?rev=37776&view=rev
Log:
cause parse error on encountering bytes which can't be utf-8

Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/NSXMLParser.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=37776&r1=37775&r2=37776&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Fri Mar 28 17:01:13 2014
@@ -1,3 +1,8 @@
+2014-03-28  Richard Frith-Macdonald <[email protected]>
+
+       * Source/NSXMLParser.m: If parsing something which contains data
+       which can't be utf-8, generate a parse error.
+
 2014-03-26  Richard Frith-Macdonald <[email protected]>
 
        * Source/NSConnection.m: handle invalidation of connection while

Modified: libs/base/trunk/Source/NSXMLParser.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSXMLParser.m?rev=37776&r1=37775&r2=37776&view=diff
==============================================================================
--- libs/base/trunk/Source/NSXMLParser.m        (original)
+++ libs/base/trunk/Source/NSXMLParser.m        Fri Mar 28 17:01:13 2014
@@ -388,8 +388,8 @@
   [self error: e];
 }
 - (void) fatalError: (NSString*)e
-       colNumber: (NSInteger)colNumber
-      lineNumber: (NSInteger)lineNumber
+          colNumber: (NSInteger)colNumber
+         lineNumber: (NSInteger)lineNumber
 {
   e = [NSString stringWithFormat: @"at line: %d column: %d ... %@",
     (int)lineNumber, (int)colNumber, e];
@@ -591,12 +591,28 @@
 
 - (NSString *) _stringByExpandingXMLEntities
 {
-  NSMutableString *t=[NSMutableString stringWithString: self];
-  [t replaceOccurrencesOfString: @"&" withString: @"&amp;" options: 0 range: 
NSMakeRange(0, [t length])];  // must be first!
-  [t replaceOccurrencesOfString: @"<" withString: @"&lt;" options: 0 range: 
NSMakeRange(0, [t length])];
-  [t replaceOccurrencesOfString: @">" withString: @"&gt;" options: 0 range: 
NSMakeRange(0, [t length])];
-  [t replaceOccurrencesOfString: @"\"" withString: @"&quot;" options: 0 range: 
NSMakeRange(0, [t length])];
-  [t replaceOccurrencesOfString: @"'" withString: @"&apos;" options: 0 range: 
NSMakeRange(0, [t length])];
+  NSMutableString       *t = [NSMutableString stringWithString: self];
+
+  [t replaceOccurrencesOfString: @"&"
+                     withString: @"&amp;"
+                        options: 0
+                          range: NSMakeRange(0, [t length])];  // must be 
first!
+  [t replaceOccurrencesOfString: @"<"
+                     withString: @"&lt;"
+                        options: 0
+                          range: NSMakeRange(0, [t length])];
+  [t replaceOccurrencesOfString: @">"
+                     withString: @"&gt;"
+                        options: 0
+                          range: NSMakeRange(0, [t length])];
+  [t replaceOccurrencesOfString: @"\""
+                     withString: @"&quot;"
+                        options: 0
+                          range: NSMakeRange(0, [t length])];
+  [t replaceOccurrencesOfString: @"'"
+                     withString: @"&apos;"
+                        options: 0
+                          range: NSMakeRange(0, [t length])];
   return t;
 }
 
@@ -1019,6 +1035,12 @@
       c = cget(); // scan name to delimiting character
     }
   decl = [NewUTF8STR(tp, this->cp - tp - 1) autorelease];
+  if (nil == decl)
+    {
+      [self _parseError: @"invalid character in declaraction"
+                   code: NSXMLParserInvalidCharacterError];
+      return;
+    }
 #if EXTRA_DEBUG
   NSLog(@"decl=%@ - %02x %c", decl, c, isprint(c)?c: ' ');
 #endif
@@ -1033,6 +1055,12 @@
       c = cget(); // scan name to delimiting character
     }
   name = [NewUTF8STR(tp, this->cp - tp - 1) autorelease];
+  if (nil == name)
+    {
+      [self _parseError: @"invalid character in declaraction name"
+                   code: NSXMLParserInvalidCharacterError];
+      return;
+    }
 #if EXTRA_DEBUG
   NSLog(@"name=%@ - %02x %c", name, c, isprint(c)?c: ' ');
 #endif
@@ -1074,6 +1102,12 @@
              c = cget(); // scan name to delimiting character
            }
          name = NewUTF8STR(tp, this->cp - tp - 1);
+          if (nil == name)
+            {
+              [self _parseError: @"invalid character in declaration attr"
+                           code: NSXMLParserInvalidCharacterError];
+              return;
+            }
 #if 1 || EXTRA_DEBUG
 NSLog(@"name=%@ - %02x %c", name, c, isprint(c)?c: ' ');
 #endif
@@ -1088,6 +1122,12 @@
              c = cget(); // scan name to delimiting character
            }
          type = NewUTF8STR(tp, this->cp - tp - 1);
+          if (nil == type)
+            {
+              [self _parseError: @"invalid character in declaration type"
+                           code: NSXMLParserInvalidCharacterError];
+              return;
+            }
 #if 1 || EXTRA_DEBUG
 NSLog(@"type=%@ - %02x %c", type, c, isprint(c)?c: ' ');
 #endif
@@ -1414,6 +1454,11 @@
        }
     }
   entity = NewUTF8STR(ep, len);
+  if (nil == entity)
+    {
+      [self _parseError: @"invalid character in entity name"
+                   code: NSXMLParserInvalidCharacterError];
+    }
 
 #if 1
   NSLog(@"NSXMLParser: unrecognized entity: &%@;", entity);
@@ -1461,6 +1506,7 @@
   int c = cget();  // refetch first character
   int len;
   BOOL containsEntity = NO;
+  NSString *qs;
 
 #if EXTRA_DEBUG
   NSLog(@"_newQarg: %02x %c", c, isprint(c)?c: ' ');
@@ -1537,6 +1583,12 @@
           if (ptr > start)
             {
               seg = NewUTF8STR(start, ptr - start);
+              if (nil == seg)
+                {
+                  [self _parseError: @"invalid character in quoted string"
+                               code: NSXMLParserInvalidCharacterError];
+                  return nil;
+                }
               [m appendString: seg];
               RELEASE(seg);
               start = ptr;
@@ -1559,7 +1611,14 @@
         }
       return m;
     }
-  return NewUTF8STR(ap, len);
+  qs = NewUTF8STR(ap, len);
+  if (nil == qs)
+    {
+      [self _parseError: @"invalid character in quoted string"
+                   code: NSXMLParserInvalidCharacterError];
+      return nil;
+    }
+  return qs;
 }
 
 - (BOOL) parse
@@ -1627,11 +1686,20 @@
                          if (this->foundCharacters != 0)
                            {
                              s = NewUTF8STR(vp, p - vp);
-                             /* Process this data as characters
-                              */
-                             (*this->foundCharacters)(_del,
-                               foundCharactersSel, self, s);
-                             [s release];
+                              if (nil == s)
+                                {
+                                  [self _parseError: @"invalid character data"
+                                     code: NSXMLParserInvalidCharacterError];
+                                  continue;
+                                }
+                              else
+                                {
+                                  /* Process this data as characters
+                                   */
+                                  (*this->foundCharacters)(_del,
+                                    foundCharactersSel, self, s);
+                                  [s release];
+                                }
                            }
                        }
                      if (p < this->cp - 1)
@@ -1639,20 +1707,36 @@
                          if (this->foundIgnorable != 0)
                            {
                              s = NewUTF8STR(p, this->cp - p - 1);
-                             /* Process data as ignorable whitespace
-                              */
-                             (*this->foundIgnorable)(_del,
-                               foundIgnorableSel, self, s);
-                             [s release];
+                              if (nil == s)
+                                {
+                                  [self _parseError: @"invalid whitespace data"
+                                     code: NSXMLParserInvalidCharacterError];
+                                }
+                              else
+                                {
+                                  /* Process data as ignorable whitespace
+                                   */
+                                  (*this->foundIgnorable)(_del,
+                                    foundIgnorableSel, self, s);
+                                  [s release];
+                                }
                            }
                          else if (this->foundCharacters != 0)
                            {
                              s = NewUTF8STR(p, this->cp - p - 1);
-                             /* Process data as characters
-                              */
-                             (*this->foundCharacters)(_del,
-                               foundCharactersSel, self, s);
-                             [s release];
+                              if (nil == s)
+                                {
+                                  [self _parseError: @"invalid character data"
+                                     code: NSXMLParserInvalidCharacterError];
+                                }
+                              else
+                                {
+                                  /* Process data as characters
+                                   */
+                                  (*this->foundCharacters)(_del,
+                                    foundCharactersSel, self, s);
+                                  [s release];
+                                }
                            }
                        }
                    }
@@ -1676,16 +1760,32 @@
                    if (this->foundIgnorable != 0)
                      {
                        s = NewUTF8STR(vp, this->cp - vp - 1);
-                       (*this->foundIgnorable)(_del,
-                         foundIgnorableSel, self, s);
-                       [s release];
+                        if (nil == s)
+                          {
+                            [self _parseError: @"invalid whitespace data"
+                               code: NSXMLParserInvalidCharacterError];
+                          }
+                        else
+                          {
+                            (*this->foundIgnorable)(_del,
+                              foundIgnorableSel, self, s);
+                            [s release];
+                          }
                      }
                    else if (this->foundCharacters != 0)
                      {
                        s = NewUTF8STR(vp, this->cp - vp - 1);
-                       (*this->foundCharacters)(_del,
-                         foundCharactersSel, self, s);
-                       [s release];
+                        if (nil == s)
+                          {
+                            [self _parseError: @"invalid character data"
+                               code: NSXMLParserInvalidCharacterError];
+                          }
+                        else
+                          {
+                            (*this->foundCharacters)(_del,
+                              foundCharactersSel, self, s);
+                            [s release];
+                        }
                      }
                    vp = this->cp - 1;
                  }
@@ -1788,9 +1888,17 @@
                    {
                      NSString  *c = NewUTF8STR(tp, this->cp - tp);
 
-                     (*this->foundComment)(_del,
-                       foundCommentSel, self, c);
-                     [c release];
+                      if (nil == c)
+                        {
+                          [self _parseError: @"invalid comment data"
+                             code: NSXMLParserInvalidCharacterError];
+                        }
+                      else
+                        {
+                          (*this->foundComment)(_del,
+                            foundCommentSel, self, c);
+                          [c release];
+                        }
                    }
                   this->cp += 3;       // might go beyond cend ... ok
                   vp = this->cp;       // value might continue
@@ -1865,6 +1973,11 @@
               else
                 {
                   tag = NewUTF8STR(tp, this->cp - tp - 1);
+                }
+              if (nil == tag)
+                {
+                  [self _parseError: @"invalid character in tag"
+                     code: NSXMLParserInvalidCharacterError];
                 }
 #if EXTRA_DEBUG
               NSLog(@"tag=%@ - %02x %c", tag, c, isprint(c)?c: ' ');


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to