From f04abf6236182402beb599510c519b5533741b08 Mon Sep 17 00:00:00 2001 From: iska Date: Sun, 26 Oct 2014 22:29:23 +0100 Subject: [PATCH] Fix numeric entity replacement bug where wrong variable and valid-range were used --- HTMLKit/HTMLTokenizer.m | 8 ++++---- HTMLKit/HTMLTokenizerCharacters.h | 13 ++++++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/HTMLKit/HTMLTokenizer.m b/HTMLKit/HTMLTokenizer.m index e159ec1..24968fc 100644 --- a/HTMLKit/HTMLTokenizer.m +++ b/HTMLKit/HTMLTokenizer.m @@ -264,20 +264,20 @@ [self emitParseError:@"Missing semicolon in numeric entity"]; } - unichar numericReplacement = NumericReplacementCharacter(character); + unichar numericReplacement = NumericReplacementCharacter(number); if (numericReplacement != NULL_CHAR) { [self emitParseError:@"Invalid numeric entity (a defenied replacement exists)"]; return StringFromUniChar(numericReplacement); } - if (isValidNumericRange(character)) { + if (isInvalidNumericRange(number)) { [self emitParseError:@"Invalid numeric entity (invalid Unicode range)"]; return StringFromUniChar(REPLACEMENT_CHAR); } - if (isControlOrUndefinedCharacter(character)) { + if (isControlOrUndefinedCharacter(number)) { [self emitParseError:@"Invalid numeric entity (control or undefined character)"]; } - return StringFromUTF32Char(character); + return StringFromUTF32Char(number); } - (NSString *)attemptToConsumeNamedCharacterReferenceInAttribute:(BOOL)inAttribute diff --git a/HTMLKit/HTMLTokenizerCharacters.h b/HTMLKit/HTMLTokenizerCharacters.h index bfdd4e8..403509d 100644 --- a/HTMLKit/HTMLTokenizerCharacters.h +++ b/HTMLKit/HTMLTokenizerCharacters.h @@ -85,7 +85,7 @@ NUMERIC_REPLACEMENT_CHARACTERS NS_INLINE BOOL isControlOrUndefinedCharacter(UTF32Char character) { return ((character >= 0x0001 && character <= 0x0008) || - (character >= 0x000E && character <= 0x001F) || + (character >= 0x000D && character <= 0x001F) || (character >= 0x007F && character <= 0x009F) || (character >= 0xFDD0 && character <= 0xFDEF) || character == 0x000B || @@ -144,7 +144,14 @@ NS_INLINE BOOL isAlphanumeric(UTF32Char character) (character >= LATIN_SMALL_LETTER_A && character <= LATIN_SMALL_LETTER_Z)); } -NS_INLINE BOOL isValidNumericRange(UTF32Char character) +NS_INLINE BOOL isStringAlphanumeric(NSString *string) +{ + NSCharacterSet *set = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; + + return ([string rangeOfCharacterFromSet:set].location == NSNotFound); +} + +NS_INLINE BOOL isInvalidNumericRange(UTF32Char character) { return ((character >= 0xD800 && character <= 0xDFFF) || character > 0x10FFFF); @@ -157,7 +164,7 @@ NS_INLINE unichar NumericReplacementCharacter(UTF32Char character) } else if (character >= 0x0080 && character <= 0x009F) { return NumericReplacementTable[character - 0x0080]; } else { - return character; + return NULL_CHAR; } }