Search whole range for safe parser detection

This commit is contained in:
relikd
2019-02-12 22:37:14 +01:00
parent 804bc1a6c7
commit f9a3c1c831

View File

@@ -33,7 +33,7 @@
@implementation RSXMLData @implementation RSXMLData
static const NSUInteger minNumberOfBytesToSearch = 20; static const NSUInteger minNumberOfBytesToSearch = 20;
static const NSInteger numberOfCharactersToSearch = 4096; static const NSUInteger numberOfCharactersToSearch = 4096;
- (instancetype)initWithData:(NSData *)data urlString:(NSString *)urlString { - (instancetype)initWithData:(NSData *)data urlString:(NSString *)urlString {
self = [super init]; self = [super init];
@@ -158,17 +158,13 @@ static const NSInteger numberOfCharactersToSearch = 4096;
return nil; return nil;
} }
NSRange rangeToSearch = NSMakeRange(0, numberOfCharactersToSearch); NSRange wholeRange = NSMakeRange(0, s.length);
if (s.length < numberOfCharactersToSearch) {
rangeToSearch.length = s.length;
}
for (Class parserClass in [self listOfParserClasses]) { for (Class parserClass in [self listOfParserClasses]) {
NSArray<const NSString *> *tags = [parserClass parserRequireOrderedTags]; NSArray<const NSString *> *tags = [parserClass parserRequireOrderedTags];
NSUInteger oldPos = 0; NSUInteger oldPos = 0;
for (NSString *tag in tags) { for (NSString *tag in tags) {
NSUInteger newPos = [s rangeOfString:tag options:NSCaseInsensitiveSearch range:rangeToSearch].location; NSUInteger newPos = [s rangeOfString:tag options:NSCaseInsensitiveSearch range:wholeRange].location;
if (newPos == NSNotFound || newPos < oldPos) { if (newPos == NSNotFound || newPos < oldPos) {
oldPos = NSNotFound; oldPos = NSNotFound;
break; break;