]> git.saurik.com Git - apple/libinfo.git/commitdiff
Libinfo-538.tar.gz macos-1015 macos-10151 macos-10152 macos-10153 macos-10154 macos-10155 macos-10156 v538
authorApple <opensource@apple.com>
Wed, 5 Jun 2019 22:47:12 +0000 (22:47 +0000)
committerApple <opensource@apple.com>
Wed, 5 Jun 2019 22:47:12 +0000 (22:47 +0000)
Libinfo/pseudo_public.h
gen.subproj/configuration_profile.c
gen.subproj/vars.c
lookup.subproj/file_module.c
lookup.subproj/mdns_module.c
lookup.subproj/muser_module.c
lookup.subproj/si_compare.c
lookup.subproj/si_getaddrinfo.c
membership.subproj/membership.c
xcodescripts/Libinfo.xcconfig

index 6007b513d2440ee31a9dc570724a652998d04a1e..063b6a329898bc7c256141bd8289e7929ec56b72 100644 (file)
@@ -60,6 +60,7 @@ unsigned int                  if_nametoindex(const char *ifname);
 extern const struct in6_addr   in6addr_any;
 extern const struct in6_addr   in6addr_linklocal_allnodes;
 extern const struct in6_addr   in6addr_linklocal_allrouters;
 extern const struct in6_addr   in6addr_any;
 extern const struct in6_addr   in6addr_linklocal_allnodes;
 extern const struct in6_addr   in6addr_linklocal_allrouters;
+extern const struct in6_addr   in6addr_linklocal_allv2routers;
 extern const struct in6_addr   in6addr_loopback;
 extern const struct in6_addr   in6addr_nodelocal_allnodes;
 
 extern const struct in6_addr   in6addr_loopback;
 extern const struct in6_addr   in6addr_nodelocal_allnodes;
 
index 7ee5363ea7bd89452a9ebaed7ea165b0b3535b20..abdbd3eb532d33a1c842ee8a1feb3d5ef28efbed 100644 (file)
@@ -44,7 +44,7 @@ configuration_profile_create_notification_key(const char *ident)
                return out;
        }
 
                return out;
        }
 
-#if TARGET_OS_EMBEDDED
+#if (TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
        if (strchr(ident + 1, '/') != NULL) return NULL;
        asprintf(&out, "%s%s/%s.plist", NOTIFY_PATH_SERVICE, CPROF_PATH, ident);
 #endif
        if (strchr(ident + 1, '/') != NULL) return NULL;
        asprintf(&out, "%s%s/%s.plist", NOTIFY_PATH_SERVICE, CPROF_PATH, ident);
 #endif
@@ -68,7 +68,7 @@ configuration_profile_copy_property_list(const char *ident)
        {
                snprintf(path, sizeof(path), "%s", ident);
        }
        {
                snprintf(path, sizeof(path), "%s", ident);
        }
-#if TARGET_OS_EMBEDDED
+#if (TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
        else
        {
                if (strchr(ident + 1, '/') != NULL) return NULL;
        else
        {
                if (strchr(ident + 1, '/') != NULL) return NULL;
index 13fb5d0420741e00da7885387c9459e0dc1d92ad..78102eb5d6ddeffe244ca19cb5817b1ee1f27d9c 100644 (file)
@@ -45,4 +45,5 @@ LIBINFO_EXPORT const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
 LIBINFO_EXPORT const struct in6_addr in6addr_nodelocal_allnodes = IN6ADDR_NODELOCAL_ALLNODES_INIT;
 LIBINFO_EXPORT const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
 LIBINFO_EXPORT const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
 LIBINFO_EXPORT const struct in6_addr in6addr_nodelocal_allnodes = IN6ADDR_NODELOCAL_ALLNODES_INIT;
 LIBINFO_EXPORT const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
 LIBINFO_EXPORT const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
+LIBINFO_EXPORT const struct in6_addr in6addr_linklocal_allv2routers = IN6ADDR_LINKLOCAL_ALLV2ROUTERS_INIT;
 
 
index 57b1d906c7a4bdb8044bdbe550b76b7a5b05a478..4f56dbc22d8fe8e87370da631608dde627cda231 100644 (file)
@@ -341,7 +341,7 @@ _fsi_get_validation(si_mod_t *si, int vtype, const char *path, FILE *f, uint64_t
 static int
 _fsi_validate(si_mod_t *si, int cat, uint64_t va, uint64_t vb)
 {
 static int
 _fsi_validate(si_mod_t *si, int cat, uint64_t va, uint64_t vb)
 {
-#if !TARGET_OS_EMBEDDED
+#if !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
        struct stat sb;
        const char *path;
        uint32_t item_val, curr_val, vtype;
        struct stat sb;
        const char *path;
        uint32_t item_val, curr_val, vtype;
@@ -351,7 +351,7 @@ _fsi_validate(si_mod_t *si, int cat, uint64_t va, uint64_t vb)
 
        if (si == NULL) return 0;
 
 
        if (si == NULL) return 0;
 
-#if !TARGET_OS_EMBEDDED
+#if !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
        /* /etc is on a read-only filesystem, so no validation is required */
 
        pp = (file_si_private_t *)si->private;
        /* /etc is on a read-only filesystem, so no validation is required */
 
        pp = (file_si_private_t *)si->private;
@@ -1862,7 +1862,20 @@ _fsi_fs_root(si_mod_t *si)
                }
 
                root_spec = _fsi_get_device_path(rootstat.st_dev);
                }
 
                root_spec = _fsi_get_device_path(rootstat.st_dev);
-
+               
+               // In case root is mounted from snapshot, _fsi_get_device_path will return NULL as the device name does not comply to
+               // /dev/diskAAsBB, but in the format of snap@/dev/diskAAsBB, in that case f_mntfromname has the correct device name, so return it
+               if (root_spec == NULL) {
+                       const char *mntfromname = rootfsinfo.f_mntfromname;
+                       size_t len = sizeof(rootfsinfo.f_mntfromname);
+                       const char *p;
+                       while ((p = strnstr(mntfromname, "@", len))) {
+                               len -= p + 1 - mntfromname;
+                               mntfromname = p + 1;
+                       }
+                       root_spec = strndup(mntfromname, len);
+               }
+               
                rootfs = (si_item_t *)LI_ils_create("L4488sssss44", (unsigned long)si, CATEGORY_FS, 1, 0LL, 0LL, root_spec, root_path, rootfsinfo.f_fstypename, FSTAB_RW, FSTAB_RW, 0, 1);
                free(root_spec);
        });
                rootfs = (si_item_t *)LI_ils_create("L4488sssss44", (unsigned long)si, CATEGORY_FS, 1, 0LL, 0LL, root_spec, root_path, rootfsinfo.f_fstypename, FSTAB_RW, FSTAB_RW, 0, 1);
                free(root_spec);
        });
index 34468a8b4303ebe85cc2b381a7d18dc675f1f274..f5b4d30bab5dccf064e446123556f8f1f6b2469a 100644 (file)
@@ -1790,10 +1790,10 @@ _mdns_search_ex(const char *name, int class, int type, uint32_t ifindex, DNSServ
 
        if (name == NULL) return -1;
 
 
        if (name == NULL) return -1;
 
-#if TARGET_OS_EMBEDDED
+#if (TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
        /* log a warning for queries from the main thread */
        if (pthread_is_threaded_np() && pthread_main_np()) os_log(OS_LOG_DEFAULT, "Warning: Libinfo call to mDNSResponder on main thread");
        /* log a warning for queries from the main thread */
        if (pthread_is_threaded_np() && pthread_main_np()) os_log(OS_LOG_DEFAULT, "Warning: Libinfo call to mDNSResponder on main thread");
-#endif /* TARGET_OS_EMBEDDED */
+#endif /* (TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR) */
 
        /*
         * Timeout Logic
 
        /*
         * Timeout Logic
@@ -1881,7 +1881,7 @@ _mdns_search_ex(const char *name, int class, int type, uint32_t ifindex, DNSServ
                        if (err != 0) _mdns_debug_message(";; initialization error %d\n", err);
 
                        /* try to reinitialize */
                        if (err != 0) _mdns_debug_message(";; initialization error %d\n", err);
 
                        /* try to reinitialize */
-                       if ((err == kDNSServiceErr_Unknown) || (err == kDNSServiceErr_ServiceNotRunning) || (err == kDNSServiceErr_BadReference))
+                       if ((err == kDNSServiceErr_Unknown) || (err == kDNSServiceErr_ServiceNotRunning) || (err == kDNSServiceErr_BadReference) || (err == kDNSServiceErr_DefunctConnection))
                        {
                                if (_mdns_sdref != NULL)
                                {
                        {
                                if (_mdns_sdref != NULL)
                                {
@@ -1938,7 +1938,7 @@ _mdns_search_ex(const char *name, int class, int type, uint32_t ifindex, DNSServ
                        _mdns_debug_message(";; _mdns_search calling DNSServiceProcessResult\n", err);
                        err = DNSServiceProcessResult(_mdns_sdref);
                        _mdns_debug_message(";; DNSServiceProcessResult -> %s\n", err);
                        _mdns_debug_message(";; _mdns_search calling DNSServiceProcessResult\n", err);
                        err = DNSServiceProcessResult(_mdns_sdref);
                        _mdns_debug_message(";; DNSServiceProcessResult -> %s\n", err);
-                       if ((err == kDNSServiceErr_ServiceNotRunning) || (err == kDNSServiceErr_BadReference))
+                       if ((err == kDNSServiceErr_ServiceNotRunning) || (err == kDNSServiceErr_BadReference) || (err == kDNSServiceErr_DefunctConnection))
                        {
                                _mdns_debug_message(";; DNSServiceProcessResult status %d [ctx %p %p]\n", err, (n_ctx > 0) ? &(ctx[0]) : NULL, (n_ctx > 1) ? &(ctx[1]) : NULL);
                                err = 0;
                        {
                                _mdns_debug_message(";; DNSServiceProcessResult status %d [ctx %p %p]\n", err, (n_ctx > 0) ? &(ctx[0]) : NULL, (n_ctx > 1) ? &(ctx[1]) : NULL);
                                err = 0;
index 8d4d5cb111ad5a2e6ced85ea42f257384f2a0f74..9de0993da5465118abe3166b178cee7df0984fa2 100644 (file)
@@ -138,7 +138,7 @@ _muser_xpc_pipe(bool reset)
        }
 
        if (__muser_pipe == NULL) {
        }
 
        if (__muser_pipe == NULL) {
-               __muser_pipe = xpc_pipe_create(kLibinfoMultiuserPortName, 0);
+               __muser_pipe = xpc_pipe_create(kLibinfoMultiuserPortName, XPC_PIPE_USE_SYNC_IPC_OVERRIDE | XPC_PIPE_PROPAGATE_QOS);
                if (!_si_muser_disabled) { _si_muser_disabled = _muser_xpc_pipe_disabled(__muser_pipe); }
        }
 
                if (!_si_muser_disabled) { _si_muser_disabled = _muser_xpc_pipe_disabled(__muser_pipe); }
        }
 
index e7e1994395d524938246f878b60253d0ee96e0a2..e879c2ef0c0ce450bb4579243398bb51ce6ca8cf 100644 (file)
@@ -24,6 +24,7 @@
 #include <os/log.h>
 #include <mach/mach_time.h>
 #include <net/ntstat.h>
 #include <os/log.h>
 #include <mach/mach_time.h>
 #include <net/ntstat.h>
+#include <ifaddrs.h>
 
 enum
 {
 
 enum
 {
@@ -83,8 +84,6 @@ static uint64_t                       cache_timeout = 0ULL;
 static os_log_t                        si_destination_log = OS_LOG_DEFAULT;
 static DestCompareSettings     si_compare_settings = {};
 
 static os_log_t                        si_destination_log = OS_LOG_DEFAULT;
 static DestCompareSettings     si_compare_settings = {};
 
-static const uint32_t  kLoopbackIndex = 1;
-
 #ifndef TCP_RTT_SCALE
 #define TCP_RTT_SCALE 32 // see netinet/tcp_var.h
 #endif // defined(TCP_RTT_SCALE)
 #ifndef TCP_RTT_SCALE
 #define TCP_RTT_SCALE 32 // see netinet/tcp_var.h
 #endif // defined(TCP_RTT_SCALE)
@@ -107,6 +106,8 @@ static void
 si_destination_compare_child_has_forked(void)
 {
        cache_lock = OS_UNFAIR_LOCK_INIT;
 si_destination_compare_child_has_forked(void)
 {
        cache_lock = OS_UNFAIR_LOCK_INIT;
+       // Cannot use os_log_t object from parent process in child process.
+       si_destination_log = OS_LOG_DEFAULT;
 }
 
 static void
 }
 
 static void
@@ -297,12 +298,40 @@ si_destination_fill_netsrc(Destination *d)
 
 #pragma mark -- Statistics --
 
 
 #pragma mark -- Statistics --
 
+static uint32_t        kLoopbackIndex = 1;
+
+// Only update kLoopbackIndex from the default value of 1 if an entry with the IFF_LOOPBACK flag set is found.
+void
+set_loopback_ifindex()
+{
+    struct ifaddrs *ifaddrs, *ifa;
+
+    if (getifaddrs(&ifaddrs) < 0)
+        return;
+
+    for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
+        if (ifa->ifa_addr &&
+            ifa->ifa_addr->sa_family == AF_LINK &&
+            (ifa->ifa_flags & IFF_LOOPBACK) != 0) {
+            kLoopbackIndex = (unsigned int)((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index;
+            break;
+        }
+    }
+
+    freeifaddrs(ifaddrs);
+    return;
+}
+
 static int
 si_destination_compare_statistics(
        Destination     *dst1,
        Destination     *dst2)
 {
        int slightPreference = kPrefer_Equal;
 static int
 si_destination_compare_statistics(
        Destination     *dst1,
        Destination     *dst2)
 {
        int slightPreference = kPrefer_Equal;
+       // Initialize kLoopbackIndex value
+       static pthread_once_t   once = PTHREAD_ONCE_INIT;
+       pthread_once(&once, set_loopback_ifindex);
+
        // If we have min round trip times for both, use that
        if (dst1->d_min_rtt && dst2->d_min_rtt)
        {
        // If we have min round trip times for both, use that
        if (dst1->d_min_rtt && dst2->d_min_rtt)
        {
index 6f6930c99bca8c7488c3f26866cffa53a089e0a4..dc7677a7a67083928cc52b4df0d7a729e6cb5e69 100644 (file)
@@ -76,10 +76,18 @@ typedef struct {
        uint64_t ttl;
 } build_hostent_t;
 
        uint64_t ttl;
 } build_hostent_t;
 
+static void
+gai_child_has_forked(void)
+{
+       // Cannot use os_log_t object from parent process in child process.
+       _gai_log = OS_LOG_DEFAULT;
+}
+
 static void
 gai_log_init(void)
 {
        _gai_log = os_log_create("com.apple.network.libinfo", "getaddrinfo");
 static void
 gai_log_init(void)
 {
        _gai_log = os_log_create("com.apple.network.libinfo", "getaddrinfo");
+       (void)pthread_atfork(NULL, NULL, gai_child_has_forked);
 }
 
 static os_log_t
 }
 
 static os_log_t
index 55c6a3e4c0aa4212fc258bde862affcda3d9940f..2186a8bcd4c6b8c417587575da29605b0daf467d 100644 (file)
@@ -283,6 +283,7 @@ mbr_identifier_translate(int id_type, const void *identifier, size_t identifier_
                                        (*result) = tempRes;
                                        return 0;
                                }
                                        (*result) = tempRes;
                                        return 0;
                                }
+                               free(tempRes);
                        }
                        break;
                        
                        }
                        break;
                        
@@ -648,7 +649,10 @@ mbr_reset_cache()
 {
 #ifdef DS_AVAILABLE
        MBR_OS_ACTIVITY("Membership API: Flush the membership cache");
 {
 #ifdef DS_AVAILABLE
        MBR_OS_ACTIVITY("Membership API: Flush the membership cache");
-       _od_rpc_call("mbr_cache_flush", NULL, _mbr_xpc_pipe);
+       xpc_object_t result = _od_rpc_call("mbr_cache_flush", NULL, _mbr_xpc_pipe);
+       if (result) {
+               xpc_release(result);
+       }
        return 0;
 #else
        return EIO;
        return 0;
 #else
        return EIO;
index 3e5caf0a9ace1e052bab9a247f74d797eab2c4f3..da29a65e034148064c62e1c7aa05fd1bac1ddb85 100644 (file)
@@ -37,7 +37,6 @@ LIBM_LDFLAGS = -lsystem_m
 LIBDYLD_LDFLAGS = -ldyld
 LIBC_LDFLAGS = -lsystem_c
 LIBDISPATCH_LDFLAGS = -ldispatch
 LIBDYLD_LDFLAGS = -ldyld
 LIBC_LDFLAGS = -lsystem_c
 LIBDISPATCH_LDFLAGS = -ldispatch
-LIBLAUNCH_LDFLAGS = -llaunch
 LIBASL_LDFLAGS = -lsystem_asl
 LIBBLOCKS_LDFLAGS = -lsystem_blocks
 LIBDNSD_LDFLAGS = -lsystem_dnssd
 LIBASL_LDFLAGS = -lsystem_asl
 LIBBLOCKS_LDFLAGS = -lsystem_blocks
 LIBDNSD_LDFLAGS = -lsystem_dnssd
@@ -76,7 +75,7 @@ OTHER_CFLAGS = -DDEBUG=1
 
 DYLIB_COMPATIBILITY_VERSION = 1
 
 
 DYLIB_COMPATIBILITY_VERSION = 1
 
-OTHER_LDFLAGS = -all_load -umbrella System -L/usr/lib/system $(LIBCOMPILER_RT_LDFLAGS) $(LIBDYLD_LDFLAGS) $(LIBSYSCALL_LDFLAGS) $(LIBMALLOC_LDFLAGS) $(LIBPLATFORM_LDFLAGS) $(LIBPTHREAD_LDFLAGS) $(LIBC_LDFLAGS) $(LIBDISPATCH_LDFLAGS) $(LIBLAUNCH_LDFLAGS) $(LIBASL_LDFLAGS) $(LIBBLOCKS_LDFLAGS) $(LIBDNSD_LDFLAGS) $(LIBNOTIFY_LDFLAGS) $(LIBXPC_LDFLAGS) $(LIBTRACE_LDFLAGS)
+OTHER_LDFLAGS = -all_load -umbrella System -L/usr/lib/system $(LIBCOMPILER_RT_LDFLAGS) $(LIBDYLD_LDFLAGS) $(LIBSYSCALL_LDFLAGS) $(LIBMALLOC_LDFLAGS) $(LIBPLATFORM_LDFLAGS) $(LIBPTHREAD_LDFLAGS) $(LIBC_LDFLAGS) $(LIBDISPATCH_LDFLAGS) $(LIBASL_LDFLAGS) $(LIBBLOCKS_LDFLAGS) $(LIBDNSD_LDFLAGS) $(LIBNOTIFY_LDFLAGS) $(LIBXPC_LDFLAGS) $(LIBTRACE_LDFLAGS)
 
 // Text-Based API settings
 
 
 // Text-Based API settings