/* * Copyright (c) 2015 - present Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import #import BOOL ExampleSanitizer(NSURL * u, int f) { if (f) __set_untaint_attribute(u); return f; } @interface ExampleViewController : NSObject - (void)loadURL:(NSURL *)URL trackingCodes:(NSArray *)trackingCodes; @end @implementation ExampleViewController - (void)loadURL:(NSURL *)URL trackingCodes: (NSArray *)trackingCodes { // Require untainted URL }; @end @interface B : NSObject - (void) another_url_pass: (NSURL *) u; @end @implementation B - (void) another_url_pass: (NSURL *) u { ExampleViewController *vc = [[ExampleViewController alloc] init]; [vc loadURL:u trackingCodes:nil]; } @end @interface A : NSObject - (void) pass_url_arond:(NSURL *) u; @end @implementation A - (void) pass_url_arond: (NSURL *) u { B* b = [[B alloc] init]; [b another_url_pass:u]; } @end @interface ExampleDelegate : NSObject - (BOOL)application: (UIApplication *)application openURL: (NSURL *)URL sourceApplication: (NSString *)sourceApplication annotation: (id)annotation; @end @implementation ExampleDelegate - (BOOL)application: (UIApplication *)application openURL: (NSURL *)URL sourceApplication: (NSString *)sourceApplication annotation: (id)annotation { // Assume tainted URL; A* a = [[A alloc] init]; if (!ExampleSanitizer(URL, 0 )) { [a pass_url_arond:URL]; // report taint } if (!ExampleSanitizer(URL, 1 )) { [a pass_url_arond:URL]; // No taint } return YES; } @end