Changeset 25567 in webkit


Ignore:
Timestamp:
Sep 14, 2007 1:42:32 PM (17 years ago)
Author:
darin
Message:

Reviewed by Geoff Garen and Tim Hatcher.

  • fixed <rdar://problem/5482745> initFromCoder: and initWithPropertyList: functions should guard against incorrect types
  • WebView/WebArchive.m: (isArrayOfClass): Added helper function. (-[WebArchive _initWithPropertyList:]): Tweaked function to remove the need for a type cast. (-[WebArchive initWithCoder:]): Added type checking for the main resource, subresources array, and subframe archives array. Also replaced NS_DURING with @try.
  • WebView/WebPreferences.m: (-[WebPreferences initWithCoder:]): Added type checking for the identifier and the values dictionary, including ensuring that it's a mutable dictionary.
  • WebView/WebResource.mm: (-[WebResource initWithCoder:]): Added type checking for all the fields. (-[WebResource _initWithPropertyList:]): Added type checking for the NSURLResponse.
  • WebKit.exp: Removed accidentally exported internal symbol; I checked and it's not used anywhere.
Location:
trunk/WebKit
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit/ChangeLog

    r25547 r25567  
     12007-09-14  Darin Adler  <darin@apple.com>
     2
     3        Reviewed by Geoff Garen and Tim Hatcher.
     4
     5        - fixed <rdar://problem/5482745> initFromCoder: and initWithPropertyList: functions
     6          should guard against incorrect types
     7
     8        * WebView/WebArchive.m:
     9        (isArrayOfClass): Added helper function.
     10        (-[WebArchive _initWithPropertyList:]): Tweaked function to remove the need for a
     11        type cast.
     12        (-[WebArchive initWithCoder:]): Added type checking for the main resource,
     13        subresources array, and subframe archives array. Also replaced NS_DURING with @try.
     14        * WebView/WebPreferences.m: (-[WebPreferences initWithCoder:]): Added type checking
     15        for the identifier and the values dictionary, including ensuring that it's a mutable
     16        dictionary.
     17        * WebView/WebResource.mm:
     18        (-[WebResource initWithCoder:]): Added type checking for all the fields.
     19        (-[WebResource _initWithPropertyList:]): Added type checking for the NSURLResponse.
     20
     21        * WebKit.exp: Removed accidentally exported internal symbol; I checked and it's not
     22        used anywhere.
     23
    1242007-09-13  Darin Adler  <darin@apple.com>
    225
  • trunk/WebKit/WebKit.exp

    r25476 r25567  
    7373_WebKitErrorPlugInPageURLStringKey
    7474_WebLocalizedString
    75 _WebMainResourceKey
    7675_WebPlugInAttributesKey
    7776_WebPlugInBaseURLKey
  • trunk/WebKit/WebView/WebArchive.m

    r11962 r25567  
    11/*
    2  * Copyright (C) 2005 Apple Computer, Inc. All rights reserved.
     2 * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2727 */
    2828
    29 #import <WebKit/WebArchive.h>
    30 
    31 #import <WebKit/WebKitLogging.h>
    32 #import <WebKit/WebResourcePrivate.h>
    33 
    34 NSString *WebArchivePboardType =            @"Apple Web Archive pasteboard type";
    35 NSString *WebMainResourceKey =              @"WebMainResource";
    36 NSString *WebSubresourcesKey =              @"WebSubresources";
    37 NSString *WebSubframeArchivesKey =          @"WebSubframeArchives";
    38 
    39 #define WebArchiveVersion 1
     29#import "WebArchive.h"
     30
     31#import "WebKitLogging.h"
     32#import "WebResourcePrivate.h"
     33
     34NSString *WebArchivePboardType = @"Apple Web Archive pasteboard type";
     35
     36static NSString * const WebMainResourceKey = @"WebMainResource";
     37static NSString * const WebSubresourcesKey = @"WebSubresources";
     38static NSString * const WebSubframeArchivesKey = @"WebSubframeArchives";
    4039
    4140@interface WebArchivePrivate : NSObject
     
    6059@end
    6160
     61static BOOL isArrayOfClass(id object, Class elementClass)
     62{
     63    if (![object isKindOfClass:[NSArray class]])
     64        return NO;
     65    NSArray *array = (NSArray *)object;
     66    NSUInteger count = [array count];
     67    for (NSUInteger i = 0; i < count; ++i)
     68        if (![[array objectAtIndex:i] isKindOfClass:elementClass])
     69            return NO;
     70    return YES;
     71}
     72
    6273@implementation WebArchive
    6374
     
    109120   
    110121    NSEnumerator *enumerator = [[propertyList objectForKey:WebSubframeArchivesKey] objectEnumerator];
    111     _private->subframeArchives = [[NSMutableArray alloc] init];
     122    NSMutableArray *subframeArchives = [[NSMutableArray alloc] init];
    112123    NSDictionary *archivePropertyList;
    113124    while ((archivePropertyList = [enumerator nextObject]) != nil) {
    114125        WebArchive *archive = [[WebArchive alloc] _initWithPropertyList:archivePropertyList];
    115126        if (archive) {
    116             [(NSMutableArray *)_private->subframeArchives addObject:archive];
     127            [subframeArchives addObject:archive];
    117128            [archive release];
    118129        }
    119130    }
    120            
     131    _private->subframeArchives = subframeArchives;
     132
    121133    return self;
    122134}
     
    145157    if (!self)
    146158        return nil;
    147        
    148     NS_DURING
    149         _private->mainResource = [[decoder decodeObjectForKey:WebMainResourceKey] retain];
    150         _private->subresources = [[decoder decodeObjectForKey:WebSubresourcesKey] retain];
    151         _private->subframeArchives = [[decoder decodeObjectForKey:WebSubframeArchivesKey] retain];
    152     NS_HANDLER
    153         [self release];
    154         return nil;
    155     NS_ENDHANDLER
     159
     160    @try {
     161        id object = [decoder decodeObjectForKey:WebMainResourceKey];
     162        if ([object isKindOfClass:[WebResource class]])
     163            _private->mainResource = [object retain];
     164        object = [decoder decodeObjectForKey:WebSubresourcesKey];
     165        if (isArrayOfClass(object, [WebResource class]))
     166            _private->subresources = [object retain];
     167        object = [decoder decodeObjectForKey:WebSubframeArchivesKey];
     168        if (isArrayOfClass(object, [WebArchive class]))
     169            _private->subframeArchives = [object retain];
     170    } @catch(...) {
     171        [self release];
     172        return nil;
     173    }
     174
     175    if (!_private->mainResource) {
     176        [self release];
     177        return nil;
     178    }
     179
    156180    return self;
    157181}
  • trunk/WebKit/WebView/WebPreferences.m

    r25432 r25567  
    11/*
    2  * Copyright (C) 2005 Apple Computer, Inc. All rights reserved.
     2 * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved.
    33 *           (C) 2006 Graham Dennis (graham.dennis@gmail.com)
    44 *
     
    218218- (id)initWithCoder:(NSCoder *)decoder
    219219{
    220     volatile id result = nil;
    221 
    222 NS_DURING
    223 
    224     int version;
     220    self = [super init];
     221    if (!self)
     222        return nil;
    225223
    226224    _private = [[WebPreferencesPrivate alloc] init];
    227225    _private->IBCreatorID = [[WebPreferences _IBCreatorID] retain];
    228226    _private->automaticallyDetectsCacheModel = YES;
    229    
    230     if ([decoder allowsKeyedCoding]){
    231         _private->identifier = [[decoder decodeObjectForKey:@"Identifier"] retain];
    232         _private->values = [[decoder decodeObjectForKey:@"Values"] retain];
    233         LOG (Encoding, "Identifier = %@, Values = %@\n", _private->identifier, _private->values);
    234     }
    235     else {
    236         [decoder decodeValueOfObjCType:@encode(int) at:&version];
    237         if (version == 1){
    238             _private->identifier = [[decoder decodeObject] retain];
    239             _private->values = [[decoder decodeObject] retain];
     227
     228    @try {
     229        id identifier = nil;
     230        id values = nil;
     231        if ([decoder allowsKeyedCoding]) {
     232            identifier = [decoder decodeObjectForKey:@"Identifier"];
     233            values = [decoder decodeObjectForKey:@"Values"];
     234        } else {
     235            int version;
     236            [decoder decodeValueOfObjCType:@encode(int) at:&version];
     237            if (version == 1) {
     238                identifier = [decoder decodeObject];
     239                values = [decoder decodeObject];
     240            }
    240241        }
    241     }
    242    
     242
     243        if ([identifier isKindOfClass:[NSString class]])
     244            _private->identifier = [identifier copy];
     245        if ([values isKindOfClass:[NSDictionary class]])
     246            _private->values = [values mutableCopy]; // ensure dictionary is mutable
     247
     248        LOG(Encoding, "Identifier = %@, Values = %@\n", _private->identifier, _private->values);
     249    } @catch(...) {
     250        [self release];
     251        return nil;
     252    }
     253
    243254    // If we load a nib multiple times, or have instances in multiple
    244255    // nibs with the same name, the first guy up wins.
    245256    WebPreferences *instance = [[self class] _getInstanceForIdentifier:_private->identifier];
    246     if (instance){
     257    if (instance) {
    247258        [self release];
    248         result = [instance retain];
    249     }
    250     else {
     259        self = [instance retain];
     260    } else {
    251261        [[self class] _setInstance:self forIdentifier:_private->identifier];
    252         result = self;
    253     }
    254    
    255 NS_HANDLER
    256 
    257     result = nil;
    258     [self release];
    259    
    260 NS_ENDHANDLER
    261 
    262     return result;
     262    }
     263
     264    return self;
    263265}
    264266
  • trunk/WebKit/WebView/WebResource.mm

    r20965 r25567  
    11/*
    2  * Copyright (C) 2005 Apple Computer, Inc. All rights reserved.
     2 * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2727 */
    2828
    29 #import <WebKit/WebFrameBridge.h>
    30 #import <WebKit/WebResourcePrivate.h>
    31 #import <WebKit/WebNSDictionaryExtras.h>
    32 #import <WebKit/WebNSURLExtras.h>
    33 
    34 NSString *WebResourceDataKey =              @"WebResourceData";
    35 NSString *WebResourceFrameNameKey =         @"WebResourceFrameName";
    36 NSString *WebResourceMIMETypeKey =          @"WebResourceMIMEType";
    37 NSString *WebResourceURLKey =               @"WebResourceURL";
    38 NSString *WebResourceTextEncodingNameKey =  @"WebResourceTextEncodingName";
    39 NSString *WebResourceResponseKey =          @"WebResourceResponse";
     29#import "WebResourcePrivate.h"
     30
     31#import "WebFrameBridge.h"
     32#import "WebNSDictionaryExtras.h"
     33#import "WebNSURLExtras.h"
     34
     35static NSString * const WebResourceDataKey =              @"WebResourceData";
     36static NSString * const WebResourceFrameNameKey =         @"WebResourceFrameName";
     37static NSString * const WebResourceMIMETypeKey =          @"WebResourceMIMEType";
     38static NSString * const WebResourceURLKey =               @"WebResourceURL";
     39static NSString * const WebResourceTextEncodingNameKey =  @"WebResourceTextEncodingName";
     40static NSString * const WebResourceResponseKey =          @"WebResourceResponse";
    4041
    4142#define WebResourceVersion 1
     
    9192        return nil;
    9293
    93     NS_DURING
    94         _private->data = [[decoder decodeObjectForKey:WebResourceDataKey] retain];
    95         _private->URL = [[decoder decodeObjectForKey:WebResourceURLKey] retain];
    96         _private->MIMEType = [[decoder decodeObjectForKey:WebResourceMIMETypeKey] retain];
    97         _private->textEncodingName = [[decoder decodeObjectForKey:WebResourceTextEncodingNameKey] retain];
    98         _private->frameName = [[decoder decodeObjectForKey:WebResourceFrameNameKey] retain];
    99         _private->response = [[decoder decodeObjectForKey:WebResourceResponseKey] retain];
    100     NS_HANDLER
    101         [self release];
    102         return nil;
    103     NS_ENDHANDLER
     94    @try {
     95        id object = [decoder decodeObjectForKey:WebResourceDataKey];
     96        if ([object isKindOfClass:[NSData class]])
     97            _private->data = [object retain];
     98        object = [decoder decodeObjectForKey:WebResourceURLKey];
     99        if ([object isKindOfClass:[NSURL class]])
     100            _private->URL = [object retain];
     101        object = [decoder decodeObjectForKey:WebResourceMIMETypeKey];
     102        if ([object isKindOfClass:[NSString class]])
     103            _private->MIMEType = [object retain];
     104        object = [decoder decodeObjectForKey:WebResourceTextEncodingNameKey];
     105        if ([object isKindOfClass:[NSString class]])
     106            _private->textEncodingName = [object retain];
     107        object = [decoder decodeObjectForKey:WebResourceFrameNameKey];
     108        if ([object isKindOfClass:[NSString class]])
     109            _private->frameName = [object retain];
     110        object = [decoder decodeObjectForKey:WebResourceResponseKey];
     111        if ([object isKindOfClass:[NSURLResponse class]])
     112            _private->response = [object retain];
     113    } @catch(...) {
     114        [self release];
     115        return nil;
     116    }
     117
    104118    return self;
    105119}
     
    259273    if ([responseData isKindOfClass:[NSData class]]) {
    260274        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:responseData];
    261         response = [unarchiver decodeObjectForKey:WebResourceResponseKey];
    262         [unarchiver finishDecoding];
    263         [unarchiver release];   
     275        @try {
     276            id responseObject = [unarchiver decodeObjectForKey:WebResourceResponseKey];
     277            if ([responseObject isKindOfClass:[NSURLResponse class]])
     278                response = responseObject;
     279            [unarchiver finishDecoding];
     280        } @catch(...) {
     281            response = nil;
     282        }
     283        [unarchiver release];
    264284    }
    265285
Note: See TracChangeset for help on using the changeset viewer.