]> git.saurik.com Git - apple/libinfo.git/commitdiff
Libinfo-503.tar.gz macos-1012 macos-10121 os-x-1012 v503
authorApple <opensource@apple.com>
Wed, 22 Jun 2016 20:52:23 +0000 (20:52 +0000)
committerApple <opensource@apple.com>
Wed, 22 Jun 2016 20:52:23 +0000 (20:52 +0000)
21 files changed:
gen.subproj/getifaddrs.c
gen.subproj/if_nameindex.c
lookup.subproj/ds_module.c
lookup.subproj/getaddrinfo.3
lookup.subproj/ils.c
lookup.subproj/libinfo.c
lookup.subproj/mdns_module.c
lookup.subproj/search_module.c
lookup.subproj/si_data.c
lookup.subproj/si_getaddrinfo.c
membership.subproj/mbr_check_membership.3
membership.subproj/mbr_uid_to_uuid.3
membership.subproj/membership.h
nis.subproj/getnetgrent.c
nis.subproj/yp_all.c
rpc.subproj/auth_unix.c
rpc.subproj/clnt_tcp.c
rpc.subproj/pmap_prot2.c
rpc.subproj/svc_tcp.c
rpc.subproj/svc_udp.c
xcodescripts/Libinfo.xcconfig

index 4de879ed71549cf606935cca842dcbc24f0c6ac2..be5d0accfc6da252b142f8602c5ed8251e5244d9 100644 (file)
@@ -402,24 +402,25 @@ getifaddrs(struct ifaddrs **pif)
        if (--ift >= ifa) {
                ift->ifa_next = NULL;
                *pif = ifa;
-       } else {
-               *pif = NULL;
-               free(ifa);
-       }
-
-       for (ift = ifa; ift != NULL; ift = ift->ifa_next)
-       {
-               if (ift->ifa_addr->sa_family == AF_INET6)
+               
+               for (ift = ifa; ift != NULL; ift = ift->ifa_next)
                {
-                       sin6 = (struct sockaddr_in6 *)ift->ifa_addr;
-                       if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) || IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))
+                       if (ift->ifa_addr->sa_family == AF_INET6)
                        {
-                               esid = ntohs(sin6->sin6_addr.__u6_addr.__u6_addr16[1]);
-                               sin6->sin6_addr.__u6_addr.__u6_addr16[1] = 0;
-                               if (sin6->sin6_scope_id == 0) sin6->sin6_scope_id = esid;
+                               sin6 = (struct sockaddr_in6 *)ift->ifa_addr;
+                               if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) || IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))
+                               {
+                                       esid = ntohs(sin6->sin6_addr.__u6_addr.__u6_addr16[1]);
+                                       sin6->sin6_addr.__u6_addr.__u6_addr16[1] = 0;
+                                       if (sin6->sin6_scope_id == 0) sin6->sin6_scope_id = esid;
+                               }
                        }
                }
        }
+       else {
+               *pif = NULL;
+               free(ifa);
+       }
 
        return (0);
 }
index eb915849fa9387937588c5ffcb853b4e667d3ff2..a9cf005648e6710514c31a1f1ff6dc4a23c0fd9f 100644 (file)
@@ -78,7 +78,7 @@ if_nameindex(void)
 {
        struct ifaddrs *ifaddrs, *ifa;
        unsigned int ni;
-       int nbytes;
+       size_t nbytes;
        struct if_nameindex *ifni, *ifni2;
        char *cp;
 
index 35a7f704e1b95ac6634d5afd9d90b0f16d8f220d..e433ac4fe47b6c07d63d598a26c237d49fcf7909 100644 (file)
@@ -322,7 +322,7 @@ static si_list_t *
 _ds_list(si_mod_t *si, int cat, const char *procname, const void *extra, od_extract_t extract)
 {
        __block si_list_t *list;
-       uint64_t va, vb;
+       uint64_t va = 0, vb = 0;
        xpc_object_t reply, result;
 
        if (procname == NULL) return NULL;
@@ -353,7 +353,7 @@ static si_item_t *
 _ds_item(si_mod_t *si, int cat, const char *procname, const void *extra, od_extract_t extract, xpc_object_t payload)
 {
        xpc_object_t result;
-       uint64_t va, vb;
+       uint64_t va = 0, vb = 0;
        si_item_t *item = NULL;
 
        if (procname == NULL) return NULL;
index f8b341fded6622b636bcaf379986b26dd1b843e7..333fb40e934fac84f7a6d01bef713a0138c4d4ff 100644 (file)
@@ -393,6 +393,38 @@ and
 .Fa ai_flags
 set to
 .Dv AI_DEFAULT.
+.Pp
+Note that NAT64 address synthesis is always disabled for IPv4 addresses
+in the following ranges:
+0.0.0.0/8,
+127.0.0.0/8,
+169.254.0.0/16,
+192.0.0.0/29,
+192.88.99.0/24,
+224.0.0.0/4, and
+255.255.255.255/32.
+Additionally, NAT64 address synthesis is disabled when the network uses
+the well-known prefix (64:ff9b::/96)
+for IPv4 addresses in the following ranges:
+10.0.0.0/8,
+100.64.0.0/10,
+172.16.0.0/12, and
+192.168.0.0/16.
+.Pp
+Historically, passing a host's own hostname to 
+.Fn getaddrinfo 
+has been a popular 
+technique for determining that host's IP address(es), but this is fragile, 
+and doesn't work reliably in all cases. The appropriate way for software to 
+discover the IP address(es) of the host it is running on is to use 
+.Xr getifaddrs 3 .
+.Pp
+The 
+.Fn getaddrinfo 
+implementations on all versions of OS X and iOS are now, and always have been, 
+thread-safe. Previous versions of this man page incorrectly reported that 
+.Fn getaddrinfo 
+was not thread-safe.
 .Sh RETURN VALUES
 .Fn getaddrinfo
 returns zero on success or one of the error codes listed in
index 190086770e90967413981b1bf2a58fee0ef9b461..7a37fefeb54a85c2aa7f878787fac176b0ab244a 100644 (file)
@@ -41,7 +41,7 @@
 
 /* GLOBAL */
 
-#if __ARM_ARCH_7K__ && __BIGGEST_ALIGNMENT__ > 4
+#if __ARM_ARCH_7K__ || __ARM64_ARCH_8_32__
 static const uint32_t align_32[] = { 0, 1, 2, 0, 4, 0, 0, 0, 8 };
 #else
 static const uint32_t align_32[] = { 0, 1, 2, 0, 4, 0, 0, 0, 4 };
index 8dd06afe392d87bb5a6e43f3ab04fab414ea6ecd..6b5a50dc8e85ca9929f26b9199e3bdb1b31cb1d1 100644 (file)
@@ -659,7 +659,7 @@ getgrouplist_internal(const char *name, int basegid, gid_t *groups, uint32_t *ng
        groups[0] = basegid;
        *ngroups = 1;
 
-       item = si_grouplist(si_search(), name, max);
+       item = si_grouplist(si_search(), name, max+1);
        LI_set_thread_item(CATEGORY_GROUPLIST, item);
        if (item == NULL) return 0;
 
index 5c4c120c41bbc439dd37b4e1e6553e32a7b2e844..6b618d7929fada467ff14313f375c0e1d7409a85 100644 (file)
@@ -372,6 +372,7 @@ _mdns_hostent_append_addr(mdns_hostent_t *h, const uint8_t *addr, uint32_t len)
        if (h->host.h_addr_list == NULL)
        {
                h->addr_count = 0;
+               free(buf);
                return -1;
        }
 
@@ -1459,6 +1460,7 @@ _mdns_query_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t ifInde
                                if (rdlen < sizeof(mdns_rr_srv_t))
                                {
                                        malformed = 1;
+                                       free(srv);
                                        break;
                                }
 
@@ -1470,6 +1472,7 @@ _mdns_query_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t ifInde
                                if (srv->srv.target == NULL)
                                {
                                        malformed = 1;
+                                       free(srv);
                                        break;
                                }
 
index f45e0afb2941b5d381fe5280dfb79ea824e3e5f5..b9710f89dcdc929203bcc8337c0668db9c18c297 100644 (file)
@@ -62,7 +62,7 @@ extern char **_fsi_tokenize(char *data, const char *sep, int trailing_empty, int
 extern char *_fsi_get_line(FILE *fp);
 
 static void si_module_config_parse_line(search_si_private_t *pp, char *line);
-static void si_module_config_modules_for_category(search_si_private_t *pp, int cat, int ntokens, const char * const *tokens);
+static int si_module_config_modules_for_category(search_si_private_t *pp, int cat, int ntokens, const char * const *tokens);
 
 static si_mod_t *
 search_get_module(search_si_private_t *pp, int cat, int *n)
@@ -864,6 +864,8 @@ search_is_valid(si_mod_t *si, si_item_t *item)
 si_mod_t *
 si_module_static_search(void)
 {
+       static bool result = false;
+
        static const struct si_mod_vtable_s search_vtable =
        {
                .sim_close = &search_close,
@@ -963,7 +965,16 @@ si_module_static_search(void)
                };
 
                int count = sizeof(modules) / sizeof(char *);
-               si_module_config_modules_for_category(pp, CATEGORY_DEFAULT, count, modules);
+               if (si_module_config_modules_for_category(pp, CATEGORY_DEFAULT, count, modules) != 0)
+               {
+                       free(si.name);
+                       si.name = NULL;
+                       free(pp);
+                       si.private = NULL;
+                       result = true;
+                       return;
+               }
+
                pp->cache = pp->search_list[CATEGORY_DEFAULT].module[0];
 
                char *check = getenv("SYSINFO_CONF_ENABLE");
@@ -987,7 +998,7 @@ si_module_static_search(void)
                }
        });
 
-       return &si;
+       return (!result) ? &si : NULL;
 }
 
 static void
@@ -1026,14 +1037,14 @@ si_module_config_parse_line(search_si_private_t *pp, char *line)
        free(tokens);
 }
 
-static void
+static int
 si_module_config_modules_for_category(search_si_private_t *pp, int cat, int ntokens, const char * const *tokens)
 {
        int count = ntokens - 1;
        pp->search_list[cat].count = count;
        if (count == 0)
        {
-               return;
+               return -1;
        }
 
        pp->search_list[cat].module = (si_mod_t **)calloc(pp->search_list[cat].count, sizeof(si_mod_t *));
@@ -1042,7 +1053,7 @@ si_module_config_modules_for_category(search_si_private_t *pp, int cat, int ntok
        {
                free(pp->search_list[cat].module);
                free(pp->search_list[cat].module_flags);
-               return;
+               return -1;
        }
 
        int i, j;
@@ -1060,4 +1071,5 @@ si_module_config_modules_for_category(search_si_private_t *pp, int cat, int ntok
                        }
                }
        }
+       return 0;
 }
index be9b5410397e6ea4f77f44432b8dbbb31b123859..5278077bb406e2218a53583579ff5c54b7baabcb 100644 (file)
@@ -95,6 +95,7 @@ si_list_concat(si_list_t *l, si_list_t *x)
                else
                {
                        l->count = 0;
+                       free(l);
                        l = NULL;
                }
        }
index 49a14c603b95342ef16571ef6383181ff55ae980..c0176b5dc1302d9c684cb1080d7c675658bec848 100644 (file)
@@ -355,6 +355,7 @@ si_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *inte
                                        {
                                                /* ENXIO */
                                                if (err != NULL) *err = SI_STATUS_EAI_FAIL;
+                                               free(serv);
                                                return NULL;
                                        }
                                }
@@ -871,6 +872,11 @@ _gai_simple(si_mod_t *si, const void *nodeptr, const void *servptr, uint32_t fam
 
        if ((flags & AI_NUMERICSERV) != 0)
        {
+               if (servptr == NULL)
+               {
+                       if (err) *err = SI_STATUS_H_ERRNO_NO_RECOVERY;
+                       return NULL;
+               }
                port = *(uint16_t*)servptr;
        }
        else
@@ -1024,7 +1030,7 @@ _gai_srv(si_mod_t *si, const char *node, const char *serv, uint32_t family, uint
 }
 
 static si_list_t *
-_gai_nat64_synthesis(si_mod_t *si, const char *node, const char *serv, int numericserv,
+_gai_nat64_synthesis(si_mod_t *si, const char *node, const void *servptr, int numericserv,
                                         uint32_t family, uint32_t socktype, uint32_t proto, uint32_t flags, const char *interface)
 {
        if (NULL == node)
@@ -1051,6 +1057,13 @@ _gai_nat64_synthesis(si_mod_t *si, const char *node, const char *serv, int numer
                return NULL;
        }
 
+       /* validate that IPv4 address is eligible for NAT64 synthesis */
+#if defined(NW_NAT64_API_VERSION) && NW_NAT64_API_VERSION >= 2
+       if (!nw_nat64_can_v4_address_be_synthesized(&a4)) {
+               return NULL;
+       }
+#endif // NW_NAT64_API_VERSION
+
        /* validate that there is at least an IPv6 address configured */
        uint32_t num_inet6 = 0;
        if ((si_inet_config(NULL, &num_inet6) < 0) || (0 == num_inet6))
@@ -1073,7 +1086,7 @@ _gai_nat64_synthesis(si_mod_t *si, const char *node, const char *serv, int numer
        uint16_t port = 0;
        if (0 == numericserv)
        {
-               if (_gai_serv_to_port(serv, proto, &port) != 0)
+               if (_gai_serv_to_port((const char *)servptr, proto, &port) != 0)
                {
                        return NULL;
                }
@@ -1082,6 +1095,10 @@ _gai_nat64_synthesis(si_mod_t *si, const char *node, const char *serv, int numer
                        flags |= AI_NUMERICSERV;
                }
        }
+       else if (NULL != servptr)
+       {
+               port = *((const uint16_t *)servptr);
+       }
 
        /* query NAT64 prefixes */
        nw_nat64_prefix_t *prefixes = NULL;
@@ -1276,7 +1293,7 @@ si_addrinfo(si_mod_t *si, const char *node, const char *serv, uint32_t family, u
        }
 
        /* NAT64 IPv6 address synthesis support */
-       si_list_t *nat64_list = _gai_nat64_synthesis(si, node, serv, numericserv, family, socktype, proto, flags, interface);
+       si_list_t *nat64_list = _gai_nat64_synthesis(si, node, servptr, numericserv, family, socktype, proto, flags, interface);
        if (NULL != nat64_list)
        {
                return nat64_list;
index 7467ad8bc2878487512b1ea3aa320e5a4984ed52..b8ce81886b5e3428662c5b9c5e236276b11aaead 100644 (file)
@@ -89,7 +89,7 @@ codes on failure:
 .Bl -tag -width Er
 .It Bq Er EIO
 Communication with
-.Xr openditectoryd 8
+.Xr opendirectoryd 8
 failed.
 .It Bq Er ENOENT
 .Fa user
index 9ca8ec9dab5784926da475df257ba8c25e6bff98..7529d7e60f89f5f45ebe2e658e2e57496b73bd03 100644 (file)
@@ -60,7 +60,7 @@ Additionally, if the user or group is hosted on a PDC
 or Active Directory server, it will have a 128 bit or larger sid.
 .Pp
 These routines communicate with
-.Xr openditectoryd 8 .
+.Xr opendirectoryd 8 .
 .Pp
 .Fn mbr_uid_to_uuid
 takes a uid and looks up the associated user account.
@@ -82,7 +82,7 @@ is set to ID_TYPE_UID or ID_TYPE_GID to indicate which type was found.
 Note that
 .Fn mbr_uuid_to_id
 always returns an id even if the uuid is not found.
-This returned id is not persistant, 
+This returned id is not persistent,
 but can be used to map back to the uuid during runtime.
 To determine if the uuid exists, the returned id can be used in a call to
 .Xr getpwuid 3
@@ -112,13 +112,13 @@ These functions return 0 on success or one of the following error codes on failu
 .Bl -tag -width Er
 .It Bq Er EIO
 Communication with
-.Xr openditectoryd 8
+.Xr opendirectoryd 8
 failed.
 .It Bq Er ENOENT
 The mapping can not be performed.
 .It Bq Er EAUTH
 Communication with
-.Xr openditectoryd 8
+.Xr opendirectoryd 8
 failed due to an authentication error.
 .It Bq Er EINVAL
 Invalid arguments were provided.
@@ -134,4 +134,4 @@ return 0 (success), even if the user/group does not exist.
 .Xr getpwuid 3 ,
 .Xr getgrgid 3 ,
 .Xr mbr_check_membership 3 ,
-.Xr openditectoryd 8
+.Xr opendirectoryd 8
index 193f8dd5561128b9e394017564ed40f89400648b..aeafd83eed61e24ebf812896f47d19c2955134e6 100644 (file)
@@ -177,7 +177,7 @@ int mbr_identifier_to_uuid(int id_type, const void *identifier, size_t identifie
                                the type of ID (ID_TYPE_UID or ID_TYPE_GID).  Synthesized
                                UUID values will be directly translated to corresponding ID.
                                A UID will always be returned even if the UUID is not found.  
-                               The returned ID is not persistant, but can be used to map back
+                               The returned ID is not persistent, but can be used to map back
                                to the UUID during runtime.
        @param          uu is the UUID to be resolved
        @param          uid_or_gid is the UID or GID found for the UUID
index 04b0acc1523b533e186b9ee2d401bf1e94974a90..6977c8591ce23e193585cc17f65ff2493bfcfb4f 100644 (file)
@@ -46,7 +46,7 @@ static struct grouplist {             /* also used by pwlib */
        char    *gl_name;
        char    *gl_domain;
        struct  grouplist *gl_nxt;
-} *grouplist, *grlist;
+} *grouplist;
 
 
 struct list {                  /* list of names to check for loops */
@@ -59,65 +59,8 @@ static       char *fill();
 static char *match();
 
 static char *domain;
-static char *oldgrp;
 
 char   *NETGROUP = "netgroup";
-
-void _old_endnetgrent(void);
-void _old_setnetgrent(char *);
-
-void _old_setnetgrent(grp)
-       char *grp;
-{
-       
-       if (oldgrp == NULL)
-               oldgrp = (char *)calloc(1,256);
-               if (oldgrp == NULL) return;
-       if (strcmp(oldgrp, grp) == 0)
-               grlist = grouplist;
-       else {
-               if (grouplist != NULL)
-                       _old_endnetgrent();
-               doit(grp, (struct list *) NULL);
-               grlist = grouplist;
-               (void) strcpy(oldgrp, grp);
-       }
-}
-
-void _old_endnetgrent()
-{
-       register struct grouplist *gl;
-       
-       for (gl = grouplist; gl != NULL; gl = gl->gl_nxt) {
-               if (gl->gl_name)
-                       free(gl->gl_name);
-               if (gl->gl_domain)
-                       free(gl->gl_domain);
-               if (gl->gl_machine)
-                       free(gl->gl_machine);
-               free((char *) gl);
-       }
-       grouplist = NULL;
-       grlist = NULL;
-       if (oldgrp) {
-               free(oldgrp);
-               oldgrp = 0;
-       }
-}
-
-int _old_getnetgrent(machinep, namep, domainp)
-       char **machinep, **namep, **domainp;
-{
-
-       if (grlist == 0)
-               return (0);
-       *machinep = grlist->gl_machine;
-       *namep = grlist->gl_name;
-       *domainp = grlist->gl_domain;
-       grlist = grlist->gl_nxt;
-       return (1);
-}
-
 /*
  * recursive function to find the members of netgroup "group". "list" is
  * the path followed through the netgroups so far, to check for cycles.
@@ -175,7 +118,7 @@ doit(group,list)
                        grouplist = gpls;
                } else {
                        q = strpbrk(p, " \t\n#");
-                       if (q && *q == '#')
+                       if (q == NULL || *q == '#')
                                break;
                        *q = 0;
                        doit(p,list);
@@ -186,6 +129,7 @@ doit(group,list)
        return;
  
 syntax_error:
+       free(gpls);
        (void) fprintf(stderr,"syntax error in /etc/netgroup\n");
        (void) fprintf(stderr,"--- %s\n",val);
        return;
index e08a981c4738494fcdc52852e3e33fbc6151cfec..645df97e4dc3f206e01d833044087e1b5f9376db 100644 (file)
@@ -120,8 +120,11 @@ u_long *objp;
                        }
                        xdr_free((xdrproc_t)xdr_ypresp_all, (char *)&out);
 
-                       if (key == NULL || val == NULL)
+                       if (key == NULL || val == NULL) {
+                               free(key);
+                               free(val);
                                return FALSE;
+                       }
 
                        r = (*ypresp_allfn)(status, key,
                            out.ypresp_all_u.val.key.keydat_len, val,
index e8ae5fdd6349c319d6e0413edf84a5cce714de86..85318d55f6f4d3e812947c2195ccbf1e9155ceb5 100644 (file)
@@ -151,6 +151,7 @@ authunix_create(machname, uid, gid, len, aup_gids)
        au = (struct audata *)mem_alloc(sizeof(*au));
 #ifndef KERNEL
        if (au == NULL) {
+               mem_free(auth, sizeof(*auth));
                (void)fprintf(stderr, "authunix_create: out of memory\n");
                return (NULL);
        }
@@ -183,6 +184,8 @@ authunix_create(machname, uid, gid, len, aup_gids)
        au->au_origcred.oa_base = mem_alloc((u_int) len);
 #else
        if ((au->au_origcred.oa_base = mem_alloc((u_int) len)) == NULL) {
+               mem_free(auth, sizeof(*auth));
+               mem_free(au, sizeof(*au));
                (void)fprintf(stderr, "authunix_create: out of memory\n");
                return (NULL);
        }
index fa3c20d213e11de661cd794a6319c8d4c9d52686..89aae16a9731a02e5fc3e728471bd2e379f3ba26 100644 (file)
@@ -317,8 +317,8 @@ clnttcp_call(h, proc, xdr_args, args_ptr, xdr_results, results_ptr, timeout)
        }
 
        shipnow =
-           (xdr_results == (xdrproc_t)0 && timeout.tv_sec == 0
-           && timeout.tv_usec == 0) ? FALSE : TRUE;
+           (xdr_results == (xdrproc_t)NULLPROC || (timeout.tv_sec == 0
+           && timeout.tv_usec == 0)) ? FALSE : TRUE;
 
 call_again:
        xdrs->x_op = XDR_ENCODE;
index 6c286c7d6652f4ce8a229f90b668e0d16aa834f7..99be5047ec8a9905fab8f95efe5289eb5cad175d 100644 (file)
@@ -121,7 +121,7 @@ xdr_pmaplist(xdrs, rp)
        register struct pmaplist **next = NULL;
 
        while (TRUE) {
-               more_elements = (bool_t)(*rp != NULL);
+               more_elements = (bool_t)(!(rp == NULL || *rp == NULL));
                if (! xdr_bool(xdrs, &more_elements))
                        return (FALSE);
                if (! more_elements)
@@ -132,7 +132,7 @@ xdr_pmaplist(xdrs, rp)
                 * before we free the current object ...
                 */
                if (freeing)
-                       next = &((*rp)->pml_next); 
+                       next = &((*rp)->pml_next);
                if (! xdr_reference(xdrs, (caddr_t *)rp, (u_int)sizeof(struct pmaplist), (xdrproc_t)xdr_pmap))
                        return (FALSE);
                rp = (freeing) ? next : &((*rp)->pml_next);
index adeb66d96f745ccc3585effe0b3ba5e1d494404f..2aee38943e37d82a401136d1424544b820ffb9aa 100644 (file)
@@ -193,6 +193,7 @@ svctcp_create(sock, sendsize, recvsize)
        r->recvsize = recvsize;
        xprt = (SVCXPRT *)mem_alloc(sizeof(SVCXPRT));
        if (xprt == NULL) {
+               mem_free(r, sizeof(*r));
                (void) fprintf(stderr, "svctcp_create: out of memory\n");
                return (NULL);
        }
index edccf6a914a4a483f5693a695533c6459b44daf5..ac83afc41fbf2daed63ffc0b74708defd52110bb 100644 (file)
@@ -162,11 +162,14 @@ svcudp_bufcreate(sock, sendsz, recvsz)
        }
        su = (struct svcudp_data *)mem_alloc(sizeof(*su));
        if (su == NULL) {
+               mem_free(xprt, sizeof(SVCXPRT));
                (void)fprintf(stderr, "svcudp_create: out of memory\n");
                return (NULL);
        }
        su->su_iosz = ((MAX(sendsz, recvsz) + 3) / 4) * 4;
        if ((rpc_buffer(xprt) = mem_alloc(su->su_iosz)) == NULL) {
+               mem_free(xprt, sizeof(SVCXPRT));
+               mem_free(su, sizeof(*su));
                (void)fprintf(stderr, "svcudp_create: out of memory\n");
                return (NULL);
        }
@@ -429,12 +432,15 @@ svcudp_enablecache(transp, size)
        uc->uc_nextvictim = 0;
        uc->uc_entries = ALLOC(cache_ptr, size * SPARSENESS);
        if (uc->uc_entries == NULL) {
+               mem_free(uc, sizeof(*uc));
                CACHE_PERROR("enablecache: could not allocate cache data");
                return(0);
        }
        BZERO(uc->uc_entries, cache_ptr, size * SPARSENESS);
        uc->uc_fifo = ALLOC(cache_ptr, size);
        if (uc->uc_fifo == NULL) {
+               mem_free(uc->uc_entries, sizeof(struct udp_cache)*size * SPARSENESS);
+               mem_free(uc, sizeof(struct udp_cache));
                CACHE_PERROR("enablecache: could not allocate cache fifo");
                return(0);
        }
@@ -488,6 +494,7 @@ cache_set(xprt, replylen)
                }
                newbuf = mem_alloc(su->su_iosz);
                if (newbuf == NULL) {
+                       mem_free(victim, sizeof(*victim));
                        CACHE_PERROR("cache_set: could not allocate new rpc_buffer");
                        return;
                }
index 9105e0d496775fd3ad32e1ea935733ec6e4eff65..bb447ff93adb6773bebaefff5ea5fb10bfaa0c9b 100644 (file)
@@ -16,16 +16,14 @@ ORDER_FILE[sdk=iphoneos*] = $(SDKROOT)/$(APPLE_INTERNAL_DIR)/OrderFiles/libsyste
 
 LINK_WITH_STANDARD_LIBRARIES = NO
 
+SIM_SUFFIX[sdk=*simulator*] = _sim
+
 LIBCOMPILER_RT_LDFLAGS = -lcompiler_rt
 LIBMALLOC_LDFLAGS = -lsystem_malloc
-LIBPLATFORM_LDFLAGS = -lsystem_platform
-LIBPLATFORM_LDFLAGS[sdk=iphonesimulator*] = -lsystem_sim_platform
-LIBPTHREAD_LDFLAGS = -lsystem_pthread
-LIBPTHREAD_LDFLAGS[sdk=iphonesimulator*] = -lsystem_sim_pthread
-LIBSYSCALL_LDFLAGS = -lsystem_kernel
-LIBSYSCALL_LDFLAGS[sdk=iphonesimulator*] = -lsystem_sim_kernel
+LIBPLATFORM_LDFLAGS = -lsystem$(SIM_SUFFIX)_platform
+LIBPTHREAD_LDFLAGS = -lsystem$(SIM_SUFFIX)_pthread
+LIBSYSCALL_LDFLAGS = -lsystem$(SIM_SUFFIX)_kernel
 LIBM_LDFLAGS = -lsystem_m
-LIBM_LDFLAGS[sdk=iphonesimulator*] = -lsystem_sim_m
 LIBDYLD_LDFLAGS = -ldyld
 LIBC_LDFLAGS = -lsystem_c
 LIBDISPATCH_LDFLAGS = -ldispatch
@@ -35,6 +33,6 @@ LIBBLOCKS_LDFLAGS = -lsystem_blocks
 LIBDNSD_LDFLAGS = -lsystem_dnssd
 LIBNOTIFY_LDFLAGS = -lsystem_notify
 LIBXPC_LDFLAGS = -lxpc
-LIBNETWORK_LDFLAGS = -Wl,-upward-lsystem_network
+LIBNETWORK_LDFLAGS = -lsystem_network
 
 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) $(LIBNETWORK_LDFLAGS)