BEFORE_INSTALL += debug profile
override LINK_SUBPROJECTS = NO
-# for building 64-bit
-# <rdar://problem/3819761> Libinfo need to build with gcc-3.5 and 3-way fat
-export CCOMPILER = /usr/bin/gcc-3.5
+# export CCOMPILER = /usr/bin/gcc-X.X
*/
if ((isll != 0) || (issl != 0))
{
- ifnum = s6->sin6_addr.__u6_addr.__u6_addr16[1];
+ ifnum = ntohs(s6->sin6_addr.__u6_addr.__u6_addr16[1]);
if (ifnum == 0) ifnum = s6->sin6_scope_id;
else if ((s6->sin6_scope_id != 0) && (ifnum != s6->sin6_scope_id)) return EAI_FAIL;
if (family == AF_INET)
{
memmove(&(addr4.s_addr), addr, IPV4_ADDR_LEN);
- addr4.s_addr = htonl(addr4.s_addr);
address = (char *)&(addr4.s_addr);
proc = proc4;
}
v4addr = malloc(len);
memmove(v4addr, addr, len);
- v4addr->s_addr = htonl(v4addr->s_addr);
address = (void *)v4addr;
proc = proc4;
/* Encode NULL for xmission to lookupd. */
if (proto == NULL) proto = "";
+ /* convert to host order */
+ port = ntohs(port);
+
xdrmem_create(&outxdr, output_buf, sizeof(output_buf), XDR_ENCODE);
if (!xdr_int(&outxdr, &port) || !xdr__lu_string(&outxdr, (_lu_string *)&proto))
{
r->proc = proc;
r->request_buffer = malloc(len * BYTES_PER_XDR_UNIT);
+ if (r->request_buffer == NULL)
+ {
+ free(r);
+ return NULL;
+ }
+
memcpy(r->request_buffer, buf, len * BYTES_PER_XDR_UNIT);
r->request_buffer_len = len;
if (!xdr_int(inxdr, &nkeys)) return NULL;
l = (ni_proplist *)malloc(sizeof(ni_proplist));
+ if (l == NULL) return NULL;
+
NI_INIT(l);
l->ni_proplist_len = nkeys;
if (nkeys > 0)
{
l->ni_proplist_val = (ni_property *)calloc(nkeys, sizeof(ni_property));
+ if (l->ni_proplist_val == NULL)
+ {
+ free(l);
+ return NULL;
+ }
}
for (i = 0; i < nkeys; i++)
if (nvals > 0)
{
l->ni_proplist_val[i].nip_val.ni_namelist_val = (ni_name *)calloc(nvals, sizeof(ni_name));
+ if (l->ni_proplist_val[i].nip_val.ni_namelist_val == NULL)
+ {
+ ni_proplist_free(l);
+ return NULL;
+ }
}
for (j = 0; j < nvals; j++)
}
*out = (ni_proplist **)malloc(n * sizeof(ni_proplist *));
+ if (out == NULL)
+ {
+ xdr_destroy(&inxdr);
+ return 0;
+ }
for (i = 0; i < n; i++)
{
if (fmt[0] != 'k') return NULL;
l = (ni_proplist *)malloc(sizeof(ni_proplist));
+ if (l == NULL) return NULL;
+
NI_INIT(l);
na = 0;
if (cat != NULL)
{
l->ni_proplist_val = (ni_property *)malloc(sizeof(ni_property));
+ if (l->ni_proplist_val == NULL)
+ {
+ free(l);
+ return NULL;
+ }
+
p = &(l->ni_proplist_val[0]);
arg = "_lookup_category";
p->nip_name = strdup(arg);
+ if (p->nip_name == NULL)
+ {
+ ni_proplist_free(l);
+ return NULL;
+ }
+
p->nip_val.ni_namelist_len = 1;
p->nip_val.ni_namelist_val = (ni_name *)malloc(sizeof(ni_name));
+ if (p->nip_val.ni_namelist_val == NULL)
+ {
+ ni_proplist_free(l);
+ return NULL;
+ }
+
p->nip_val.ni_namelist_val[0] = strdup(cat);
-
+ if (p->nip_val.ni_namelist_val[0] == NULL)
+ {
+ ni_proplist_free(l);
+ return NULL;
+ }
+
l->ni_proplist_len++;
x++;
}
arg = va_arg(ap, char *);
if (*f == 'k')
{
- l->ni_proplist_val = (ni_property *)realloc(l->ni_proplist_val, (l->ni_proplist_len + 1) * sizeof(ni_property));
-
+ l->ni_proplist_val = (ni_property *)reallocf(l->ni_proplist_val, (l->ni_proplist_len + 1) * sizeof(ni_property));
+ if (l->ni_proplist_val == NULL)
+ {
+ ni_proplist_free(l);
+ return NULL;
+ }
+
p = &(l->ni_proplist_val[l->ni_proplist_len]);
p->nip_name = strdup(arg);
+ if (p->nip_name == NULL)
+ {
+ ni_proplist_free(l);
+ return NULL;
+ }
+
p->nip_val.ni_namelist_len = 0;
p->nip_val.ni_namelist_val = NULL;
}
else
{
- p->nip_val.ni_namelist_val = (ni_name *)realloc(p->nip_val.ni_namelist_val, (p->nip_val.ni_namelist_len + 1) * sizeof(ni_name));
+ p->nip_val.ni_namelist_val = (ni_name *)reallocf(p->nip_val.ni_namelist_val, (p->nip_val.ni_namelist_len + 1) * sizeof(ni_name));
+ }
+
+ if (p->nip_val.ni_namelist_val == NULL)
+ {
+ ni_proplist_free(l);
+ return NULL;
}
+
p->nip_val.ni_namelist_val[p->nip_val.ni_namelist_len] = strdup(arg);
+ if (p->nip_val.ni_namelist_val[p->nip_val.ni_namelist_len] == NULL)
+ {
+ ni_proplist_free(l);
+ return NULL;
+ }
+
p->nip_val.ni_namelist_len++;
}
}
if (addme == 1)
{
- a->nip_val.ni_namelist_val = (ni_name *)realloc(a->nip_val.ni_namelist_val, (a->nip_val.ni_namelist_len + 1) * sizeof(ni_name));
+ a->nip_val.ni_namelist_val = (ni_name *)reallocf(a->nip_val.ni_namelist_val, (a->nip_val.ni_namelist_len + 1) * sizeof(ni_name));
+ if (a->nip_val.ni_namelist_val == NULL) return;
+
a->nip_val.ni_namelist_val[a->nip_val.ni_namelist_len] = strdup(b->nip_val.ni_namelist_val[j]);
+ if (a->nip_val.ni_namelist_val[a->nip_val.ni_namelist_len] == NULL)
+ {
+ free(a->nip_val.ni_namelist_val);
+ a->nip_val.ni_namelist_val = NULL;
+ return;
+ }
+
a->nip_val.ni_namelist_len++;
}
}
}
if (addme == 1)
{
- a->ni_proplist_val = (ni_property *)realloc(a->ni_proplist_val, (a->ni_proplist_len + 1) * sizeof(ni_property));
+ a->ni_proplist_val = (ni_property *)reallocf(a->ni_proplist_val, (a->ni_proplist_len + 1) * sizeof(ni_property));
+ if (a->ni_proplist_val == NULL) return;
+
a->ni_proplist_val[a->ni_proplist_len].nip_name = strdup(b->ni_proplist_val[wb].nip_name);
+ if (a->ni_proplist_val[a->ni_proplist_len].nip_name == NULL)
+ {
+ free(a->ni_proplist_val);
+ a->ni_proplist_val = NULL;
+ return NULL;
+ }
+
a->ni_proplist_val[a->ni_proplist_len].nip_val.ni_namelist_len = 0;
a->ni_proplist_val[a->ni_proplist_len].nip_val.ni_namelist_val = NULL;
a->ni_proplist_len++;
if (libinfo_data != NULL) return libinfo_data;
libinfo_data = (struct _lu_data_s *)calloc(1, sizeof(struct _lu_data_s));
+ if (libinfo_data == NULL) return NULL;
pthread_setspecific(_info_key, libinfo_data);
return libinfo_data;
unsigned int i, n;
libinfo_data = _lu_data_get();
+ if (libinfo_data == NULL) return NULL;
for (i = 0; i < libinfo_data->icount; i++)
{
}
else
{
- libinfo_data->ikey = (unsigned int *)realloc(libinfo_data->ikey, n * sizeof(unsigned int));
- libinfo_data->idata = (void **)realloc(libinfo_data->idata, n * sizeof(void *));
- libinfo_data->idata_destructor = (void (**)(void *))realloc(libinfo_data->idata_destructor, n * sizeof(void (*)(void *)));
+ libinfo_data->ikey = (unsigned int *)reallocf(libinfo_data->ikey, n * sizeof(unsigned int));
+ libinfo_data->idata = (void **)reallocf(libinfo_data->idata, n * sizeof(void *));
+ libinfo_data->idata_destructor = (void (**)(void *))reallocf(libinfo_data->idata_destructor, n * sizeof(void (*)(void *)));
+ }
+
+ if ((libinfo_data->ikey == NULL) || (libinfo_data->idata == NULL) || (libinfo_data->idata_destructor == NULL))
+ {
+ if (libinfo_data->ikey != NULL) free(libinfo_data->ikey);
+ if (libinfo_data->idata != NULL) free(libinfo_data->idata);
+ if (libinfo_data->idata_destructor != NULL) free(libinfo_data->idata_destructor);
+ return NULL;
}
libinfo_data->ikey[i] = key;
unsigned int i;
libinfo_data = _lu_data_get();
+ if (libinfo_data == NULL) return;
i = _lu_data_index(key, libinfo_data);
if (i == (unsigned int)-1) return;
unsigned int i;
libinfo_data = _lu_data_get();
+ if (libinfo_data == NULL) return NULL;
i = _lu_data_index(key, libinfo_data);
if (i == (unsigned int)-1) return NULL;
*count = len;
x = (char **)calloc(len + 1, sizeof(char *));
+ if (x == NULL) return -1;
+
*val = x;
for (i = 0; i < len; i++)
/*
- * Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2004-2005 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
#include <mach/std_types.defs>
import "memberd_defines.h";
-type kauth_identity_extlookup = struct [50] of integer_t;
-type guid_t = struct [4] of uint32_t;
+type kauth_identity_extlookup = struct [200] of uint8_t;
+type guid_t = struct [16] of uint8_t;
type StatBlock = struct [16] of uint32_t;
#include <servers/bootstrap.h>
#include <mach/mach.h>
#include <stdlib.h>
+#import <libkern/OSByteOrder.h>
static mach_port_t GetServerPort()
{
struct kauth_identity_extlookup request;
int result = 0;
+ request.el_seqno = 1; // used as byte order field
request.el_flags = KAUTH_EXTLOOKUP_VALID_UID | KAUTH_EXTLOOKUP_WANT_UGUID;
request.el_uid = id;
result = _mbr_DoMembershipCall(GetServerPort(), &request);
kern_return_t result;
int error = 0;
+ request.el_seqno = 1; // used as byte order field
request.el_flags = KAUTH_EXTLOOKUP_VALID_GID | KAUTH_EXTLOOKUP_WANT_GGUID;
request.el_gid = id;
result = _mbr_DoMembershipCall(GetServerPort(), &request);
kern_return_t result;
int error = 0;
+ request.el_seqno = 1; // used as byte order field
request.el_flags = KAUTH_EXTLOOKUP_VALID_UGUID | KAUTH_EXTLOOKUP_VALID_GGUID |
KAUTH_EXTLOOKUP_WANT_UID | KAUTH_EXTLOOKUP_WANT_GID;
memcpy(&request.el_uguid, uu, sizeof(guid_t));
kern_return_t result;
int error = 0;
+ request.el_seqno = 1; // used as byte order field
request.el_flags = KAUTH_EXTLOOKUP_VALID_GSID | KAUTH_EXTLOOKUP_WANT_GGUID;
memset(&request.el_gsid, 0, sizeof(ntsid_t));
memcpy(&request.el_gsid, sid, KAUTH_NTSID_SIZE(sid));
kern_return_t result;
int error = 0;
+ request.el_seqno = 1; // used as byte order field
request.el_flags = KAUTH_EXTLOOKUP_VALID_GGUID | KAUTH_EXTLOOKUP_WANT_GSID;
memcpy(&request.el_gguid, uu, sizeof(guid_t));
result = _mbr_DoMembershipCall(GetServerPort(), &request);
kern_return_t result;
int error = 0;
+ request.el_seqno = 1; // used as byte order field
request.el_flags = KAUTH_EXTLOOKUP_VALID_UGUID | KAUTH_EXTLOOKUP_VALID_GGUID |
KAUTH_EXTLOOKUP_WANT_MEMBERSHIP;
memcpy(&request.el_uguid, user, sizeof(guid_t));
return error;
}
+int mbr_check_membership_refresh(uuid_t user, uuid_t group, int* ismember)
+{
+ struct kauth_identity_extlookup request;
+ kern_return_t result;
+ int error = 0;
+
+ request.el_seqno = 1; // used as byte order field
+ request.el_flags = KAUTH_EXTLOOKUP_VALID_UGUID | KAUTH_EXTLOOKUP_VALID_GGUID |
+ KAUTH_EXTLOOKUP_WANT_MEMBERSHIP | (1<<15);
+ memcpy(&request.el_uguid, user, sizeof(guid_t));
+ memcpy(&request.el_gguid, group, sizeof(guid_t));
+ result = _mbr_DoMembershipCall(GetServerPort(), &request);
+ if (result != KERN_SUCCESS)
+ return EIO;
+
+ if ((request.el_flags & KAUTH_EXTLOOKUP_VALID_MEMBERSHIP) != 0)
+ {
+ *ismember = ((request.el_flags & KAUTH_EXTLOOKUP_ISMEMBER) != 0);
+ }
+ else
+ error = ENOENT;
+
+ return error;
+}
+
int mbr_check_membership_by_id(uuid_t user, gid_t group, int* ismember)
{
struct kauth_identity_extlookup request;
kern_return_t result;
int error = 0;
+ request.el_seqno = 1; // used as byte order field
request.el_flags = KAUTH_EXTLOOKUP_VALID_UGUID | KAUTH_EXTLOOKUP_VALID_GID |
KAUTH_EXTLOOKUP_WANT_MEMBERSHIP;
memcpy(&request.el_uguid, user, sizeof(guid_t));
char* all_services = "com.apple.access_all_services";
char groupName[256];
uuid_t group_uu;
- int result;
+ int result, dummy;
if (strlen(servicename) > 255 - strlen(prefix))
return EINVAL;
}
if (result == 0)
- result = mbr_check_membership(user, group_uu, ismember);
+ result = mbr_check_membership_refresh(user, group_uu, ismember);
+ else
+ {
+ // just force cache update with bogus membership check
+ memset(group_uu, 0, sizeof(group_uu));
+ mbr_check_membership_refresh(user, group_uu, &dummy);
+ }
return result;
}
if (sid->sid_authcount > NTSID_MAX_AUTHORITIES)
return EINVAL;
- memcpy(((char*)&temp)+2, sid->sid_authority, 6);
+ for (i = 0; i < 6; i++)
+ temp = (temp << 8) | sid->sid_authority[i];
current[0] = 'S';
current[1] = '-';
if (*current == '\0') return EINVAL;
current++;
temp = strtoll(current, ¤t, 10);
+ // convert to BigEndian before copying
+ temp = OSSwapHostToBigInt64(temp);
memcpy(sid->sid_authority, ((char*)&temp)+2, 6);
while (*current != '\0' && count < NTSID_MAX_AUTHORITIES)
{