]> git.saurik.com Git - apple/configd.git/blobdiff - SystemConfiguration.fproj/SCNetworkProtocol.c
configd-1061.40.2.tar.gz
[apple/configd.git] / SystemConfiguration.fproj / SCNetworkProtocol.c
index 33bf633384f0e6c1fbfe437da6ac879f785d301b..d0cd41ea214e662dac5fb60e54c5c5025f80d169 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004-2008, 2016 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2008, 2016-2018 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  *
@@ -116,10 +116,10 @@ __SCNetworkProtocolEqual(CFTypeRef cf1, CFTypeRef cf2)
                return FALSE;   // if not the same protocol type
 
        if (p1->service == p2->service)
-               return TRUE;    // if both point to the same service
+               return TRUE;    // if both point to the same service
 
        if ((p1->service != NULL) && (p2->service != NULL) && CFEqual(p1->service, p2->service))
-               return TRUE;    // if both effectively point to the same service
+               return TRUE;    // if both effectively point to the same service
 
        return FALSE;
 }
@@ -154,11 +154,11 @@ __SCNetworkProtocolCreatePrivate(CFAllocatorRef           allocator,
        pthread_once(&initialized, __SCNetworkProtocolInitialize);
 
        /* allocate target */
-       size           = sizeof(SCNetworkProtocolPrivate) - sizeof(CFRuntimeBase);
+       size            = sizeof(SCNetworkProtocolPrivate) - sizeof(CFRuntimeBase);
        protocolPrivate = (SCNetworkProtocolPrivateRef)_CFRuntimeCreateInstance(allocator,
-                                                                             __kSCNetworkProtocolTypeID,
-                                                                             size,
-                                                                             NULL);
+                                                                               __kSCNetworkProtocolTypeID,
+                                                                               size,
+                                                                               NULL);
        if (protocolPrivate == NULL) {
                return NULL;
        }
@@ -174,8 +174,7 @@ __SCNetworkProtocolCreatePrivate(CFAllocatorRef             allocator,
 __private_extern__ Boolean
 __SCNetworkProtocolIsValidType(CFStringRef protocolType)
 {
-       int                             i;
-       static const CFStringRef        *valid_types[]   = {
+       static const CFStringRef        *valid_types[]  = {
                &kSCNetworkProtocolTypeDNS,
                &kSCNetworkProtocolTypeIPv4,
                &kSCNetworkProtocolTypeIPv6,
@@ -185,7 +184,7 @@ __SCNetworkProtocolIsValidType(CFStringRef protocolType)
 #endif // !TARGET_OS_IPHONE
        };
 
-       for (i = 0; i < sizeof(valid_types)/sizeof(valid_types[0]); i++) {
+       for (size_t i = 0; i < sizeof(valid_types)/sizeof(valid_types[0]); i++) {
                if (CFEqual(protocolType, *valid_types[i])) {
                        // if known/valid protocol type
                        return TRUE;
@@ -209,12 +208,12 @@ static CFStringRef
 copyProtocolConfigurationPath(SCNetworkProtocolPrivateRef protocolPrivate)
 {
        CFStringRef                     path;
-       SCNetworkServicePrivateRef      servicePrivate;
+       SCNetworkServicePrivateRef      servicePrivate;
 
        servicePrivate = (SCNetworkServicePrivateRef)protocolPrivate->service;
        path = SCPreferencesPathKeyCreateNetworkServiceEntity(NULL,                             // allocator
                                                              servicePrivate->serviceID,        // service
-                                                             protocolPrivate->entityID);       // entity
+                                                             protocolPrivate->entityID);       // entity
        return path;
 }
 
@@ -223,6 +222,22 @@ copyProtocolConfigurationPath(SCNetworkProtocolPrivateRef protocolPrivate)
 #pragma mark SCNetworkProtocol APIs
 
 
+CFComparisonResult
+_SCNetworkProtocolCompare(const void *val1, const void *val2, void *context)
+{
+#pragma unused(context)
+       SCNetworkProtocolRef    p1      = (SCNetworkProtocolRef)val1;
+       SCNetworkProtocolRef    p2      = (SCNetworkProtocolRef)val2;
+       CFStringRef             type1;
+       CFStringRef             type2;
+
+       type1 = SCNetworkProtocolGetProtocolType(p1);
+       type2 = SCNetworkProtocolGetProtocolType(p2);
+
+       return CFStringCompare(type1, type2, 0);
+}
+
+
 CFTypeID
 SCNetworkProtocolGetTypeID()
 {
@@ -237,13 +252,14 @@ SCNetworkProtocolGetConfiguration(SCNetworkProtocolRef protocol)
        CFDictionaryRef                 config;
        CFStringRef                     path;
        SCNetworkProtocolPrivateRef     protocolPrivate = (SCNetworkProtocolPrivateRef)protocol;
-       SCNetworkServicePrivateRef      servicePrivate  = (SCNetworkServicePrivateRef)protocolPrivate->service;
+       SCNetworkServicePrivateRef      servicePrivate;
 
        if (!isA_SCNetworkProtocol(protocol)) {
                _SCErrorSet(kSCStatusInvalidArgument);
                return NULL;
        }
 
+       servicePrivate = (SCNetworkServicePrivateRef)protocolPrivate->service;
        path = copyProtocolConfigurationPath(protocolPrivate);
        config = __getPrefsConfiguration(servicePrivate->prefs, path);
        CFRelease(path);
@@ -258,13 +274,14 @@ SCNetworkProtocolGetEnabled(SCNetworkProtocolRef protocol)
        Boolean                         enabled;
        CFStringRef                     path;
        SCNetworkProtocolPrivateRef     protocolPrivate = (SCNetworkProtocolPrivateRef)protocol;
-       SCNetworkServicePrivateRef      servicePrivate  = (SCNetworkServicePrivateRef)protocolPrivate->service;
+       SCNetworkServicePrivateRef      servicePrivate;
 
        if (!isA_SCNetworkProtocol(protocol)) {
                _SCErrorSet(kSCStatusInvalidArgument);
                return FALSE;
        }
 
+       servicePrivate = (SCNetworkServicePrivateRef)protocolPrivate->service;
        path = copyProtocolConfigurationPath(protocolPrivate);
        enabled = __getPrefsEnabled(servicePrivate->prefs, path);
        CFRelease(path);
@@ -293,13 +310,25 @@ SCNetworkProtocolSetConfiguration(SCNetworkProtocolRef protocol, CFDictionaryRef
        Boolean                         ok;
        CFStringRef                     path;
        SCNetworkProtocolPrivateRef     protocolPrivate = (SCNetworkProtocolPrivateRef)protocol;
-       SCNetworkServicePrivateRef      servicePrivate  = (SCNetworkServicePrivateRef)protocolPrivate->service;
+       SCNetworkServiceRef             service;
+       SCNetworkServicePrivateRef      servicePrivate;
 
        if (!isA_SCNetworkProtocol(protocol)) {
                _SCErrorSet(kSCStatusInvalidArgument);
                return FALSE;
        }
 
+       service = protocolPrivate->service;
+       servicePrivate = (SCNetworkServicePrivateRef)service;
+       if (!__SCNetworkServiceExists(service)) {
+               SC_log(LOG_ERR, "SCNetworkProtocolSetConfiguration() w/removed service\n  protocol = %@\n  service = %@",
+                      protocolPrivate->entityID,
+                      servicePrivate);
+               _SC_crash_once("SCNetworkProtocolSetConfiguration() w/removed service", NULL, NULL);
+               _SCErrorSet(kSCStatusInvalidArgument);
+               return FALSE;
+       }
+
        path = copyProtocolConfigurationPath(protocolPrivate);
        ok = __setPrefsConfiguration(servicePrivate->prefs, path, config, TRUE);
        CFRelease(path);
@@ -320,13 +349,25 @@ SCNetworkProtocolSetEnabled(SCNetworkProtocolRef protocol, Boolean enabled)
        Boolean                         ok;
        CFStringRef                     path;
        SCNetworkProtocolPrivateRef     protocolPrivate = (SCNetworkProtocolPrivateRef)protocol;
-       SCNetworkServicePrivateRef      servicePrivate  = (SCNetworkServicePrivateRef)protocolPrivate->service;
+       SCNetworkServiceRef             service;
+       SCNetworkServicePrivateRef      servicePrivate;
 
        if (!isA_SCNetworkProtocol(protocol)) {
                _SCErrorSet(kSCStatusInvalidArgument);
                return FALSE;
        }
 
+       service = protocolPrivate->service;
+       servicePrivate = (SCNetworkServicePrivateRef)service;
+       if (!__SCNetworkServiceExists(service)) {
+               SC_log(LOG_ERR, "SCNetworkProtocolSetEnabled() w/removed service\n  protocol = %@\n  service = %@",
+                      protocolPrivate->entityID,
+                      servicePrivate);
+               _SC_crash_once("SCNetworkProtocolSetEnabled() w/removed service", NULL, NULL);
+               _SCErrorSet(kSCStatusInvalidArgument);
+               return FALSE;
+       }
+
        path = copyProtocolConfigurationPath(protocolPrivate);
        ok = __setPrefsEnabled(servicePrivate->prefs, path, enabled);
        CFRelease(path);