summaryrefslogtreecommitdiffstats
path: root/mDNSResponder/mDNSShared/dnssd_clientstub.c
diff options
context:
space:
mode:
Diffstat (limited to 'mDNSResponder/mDNSShared/dnssd_clientstub.c')
-rw-r--r--mDNSResponder/mDNSShared/dnssd_clientstub.c98
1 files changed, 78 insertions, 20 deletions
diff --git a/mDNSResponder/mDNSShared/dnssd_clientstub.c b/mDNSResponder/mDNSShared/dnssd_clientstub.c
index 5e151d08..5e12e0b1 100644
--- a/mDNSResponder/mDNSShared/dnssd_clientstub.c
+++ b/mDNSResponder/mDNSShared/dnssd_clientstub.c
@@ -172,6 +172,19 @@ struct _DNSRecordRef_t
DNSServiceOp *sdr;
};
+#if !defined(USE_TCP_LOOPBACK)
+static void SetUDSPath(struct sockaddr_un *saddr, const char *path)
+{
+ size_t pathLen;
+
+ pathLen = strlen(path);
+ if (pathLen < sizeof(saddr->sun_path))
+ memcpy(saddr->sun_path, path, pathLen + 1);
+ else
+ saddr->sun_path[0] = '\0';
+}
+#endif
+
// Write len bytes. Return 0 on success, -1 on error
static int write_all(dnssd_sock_t sd, char *buf, size_t len)
{
@@ -185,7 +198,7 @@ static int write_all(dnssd_sock_t sd, char *buf, size_t len)
// Should never happen. If it does, it indicates some OS bug,
// or that the mDNSResponder daemon crashed (which should never happen).
#if !defined(__ppc__) && defined(SO_ISDEFUNCT)
- int defunct;
+ int defunct = 0;
socklen_t dlen = sizeof (defunct);
if (getsockopt(sd, SOL_SOCKET, SO_ISDEFUNCT, &defunct, &dlen) < 0)
syslog(LOG_WARNING, "dnssd_clientstub write_all: SO_ISDEFUNCT failed %d %s", dnssd_errno, dnssd_strerror(dnssd_errno));
@@ -272,6 +285,12 @@ static int more_bytes(dnssd_sock_t sd)
fd_set *fs;
int ret;
+#if defined(_WIN32)
+ fs = &readfds;
+ FD_ZERO(fs);
+ FD_SET(sd, fs);
+ ret = select((int)sd+1, fs, (fd_set*)NULL, (fd_set*)NULL, &tv);
+#else
if (sd < FD_SETSIZE)
{
fs = &readfds;
@@ -296,6 +315,7 @@ static int more_bytes(dnssd_sock_t sd)
ret = select((int)sd+1, fs, (fd_set*)NULL, (fd_set*)NULL, &tv);
if (fs != &readfds)
free(fs);
+#endif
return (ret > 0);
}
@@ -561,7 +581,7 @@ static DNSServiceErrorType ConnectToServer(DNSServiceRef *ref, DNSServiceFlags f
saddr.sin_port = htons(MDNS_TCP_SERVERPORT);
#else
saddr.sun_family = AF_LOCAL;
- strcpy(saddr.sun_path, uds_serverpath);
+ SetUDSPath(&saddr, uds_serverpath);
#if !defined(__ppc__) && defined(SO_DEFUNCTOK)
{
int defunct = 1;
@@ -671,7 +691,7 @@ static DNSServiceErrorType deliver_request(ipc_msg_hdr *hdr, DNSServiceOp *sdr)
#ifndef NOT_HAVE_SA_LEN
caddr.sun_len = sizeof(struct sockaddr_un);
#endif
- strcpy(caddr.sun_path, data);
+ SetUDSPath(&caddr, data);
mask = umask(0);
bindresult = bind(listenfd, (struct sockaddr *)&caddr, sizeof(caddr));
umask(mask);
@@ -852,7 +872,7 @@ cleanup:
return err;
}
-int DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdRef)
+dnssd_sock_t DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdRef)
{
if (!sdRef) { syslog(LOG_WARNING, "dnssd_clientstub DNSServiceRefSockFD called with NULL DNSServiceRef"); return dnssd_InvalidSocket; }
@@ -869,7 +889,7 @@ int DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdRef)
return dnssd_InvalidSocket;
}
- return (int) sdRef->sockfd;
+ return sdRef->sockfd;
}
#if _DNS_SD_LIBDISPATCH
@@ -1154,13 +1174,18 @@ void DNSSD_API DNSServiceRefDeallocate(DNSServiceRef sdRef)
DNSServiceErrorType DNSSD_API DNSServiceGetProperty(const char *property, void *result, uint32_t *size)
{
+ DNSServiceErrorType err;
char *ptr;
- size_t len = strlen(property) + 1;
+ size_t len;
ipc_msg_hdr *hdr;
DNSServiceOp *tmp;
uint32_t actualsize;
- DNSServiceErrorType err = ConnectToServer(&tmp, 0, getproperty_request, NULL, NULL, NULL);
+ if (!property || !result || !size)
+ return kDNSServiceErr_BadParam;
+
+ len = strlen(property) + 1;
+ err = ConnectToServer(&tmp, 0, getproperty_request, NULL, NULL, NULL);
if (err) return err;
hdr = create_hdr(getproperty_request, &len, &ptr, 0, tmp);
@@ -1280,7 +1305,7 @@ DNSServiceErrorType DNSSD_API DNSServiceResolve
ipc_msg_hdr *hdr;
DNSServiceErrorType err;
- if (!name || !regtype || !domain || !callBack) return kDNSServiceErr_BadParam;
+ if (!sdRef || !name || !regtype || !domain || !callBack) return kDNSServiceErr_BadParam;
// Need a real InterfaceID for WakeOnResolve
if ((flags & kDNSServiceFlagsWakeOnResolve) != 0 &&
@@ -1355,6 +1380,9 @@ DNSServiceErrorType DNSSD_API DNSServiceQueryRecord
ipc_msg_hdr *hdr;
DNSServiceErrorType err;
+ // NULL name handled below.
+ if (!sdRef || !callBack) return kDNSServiceErr_BadParam;
+
if ((interfaceIndex == kDNSServiceInterfaceIndexAny) && includeP2PWithIndexAny())
flags |= kDNSServiceFlagsIncludeP2P;
@@ -1464,7 +1492,7 @@ DNSServiceErrorType DNSSD_API DNSServiceGetAddrInfo
ipc_msg_hdr *hdr;
DNSServiceErrorType err;
- if (!hostname) return kDNSServiceErr_BadParam;
+ if (!sdRef || !hostname || !callBack) return kDNSServiceErr_BadParam;
err = ConnectToServer(sdRef, flags, addrinfo_request, handle_addrinfo_response, callBack, context);
if (err)
@@ -1518,6 +1546,9 @@ DNSServiceErrorType DNSSD_API DNSServiceBrowse
ipc_msg_hdr *hdr;
DNSServiceErrorType err;
+ // NULL domain handled below
+ if (!sdRef || !regtype || !callBack) return kDNSServiceErr_BadParam;
+
if ((interfaceIndex == kDNSServiceInterfaceIndexAny) && includeP2PWithIndexAny())
flags |= kDNSServiceFlagsIncludeP2P;
@@ -1546,11 +1577,16 @@ DNSServiceErrorType DNSSD_API DNSServiceBrowse
DNSServiceErrorType DNSSD_API DNSServiceSetDefaultDomainForUser(DNSServiceFlags flags, const char *domain);
DNSServiceErrorType DNSSD_API DNSServiceSetDefaultDomainForUser(DNSServiceFlags flags, const char *domain)
{
+ DNSServiceErrorType err;
DNSServiceOp *tmp;
char *ptr;
- size_t len = sizeof(flags) + strlen(domain) + 1;
+ size_t len;
ipc_msg_hdr *hdr;
- DNSServiceErrorType err = ConnectToServer(&tmp, 0, setdomain_request, NULL, NULL, NULL);
+
+ if (!domain) return kDNSServiceErr_BadParam;
+ len = sizeof(flags) + strlen(domain) + 1;
+
+ err = ConnectToServer(&tmp, 0, setdomain_request, NULL, NULL, NULL);
if (err) return err;
hdr = create_hdr(setdomain_request, &len, &ptr, 0, tmp);
@@ -1596,8 +1632,8 @@ DNSServiceErrorType DNSSD_API DNSServiceRegister
DNSServiceErrorType err;
union { uint16_t s; u_char b[2]; } port = { PortInNetworkByteOrder };
+ if (!sdRef || !regtype) return kDNSServiceErr_BadParam;
if (!name) name = "";
- if (!regtype) return kDNSServiceErr_BadParam;
if (!domain) domain = "";
if (!host) host = "";
if (!txtRecord) txtRecord = (void*)"";
@@ -1659,9 +1695,13 @@ DNSServiceErrorType DNSSD_API DNSServiceEnumerateDomains
size_t len;
ipc_msg_hdr *hdr;
DNSServiceErrorType err;
+ int f1;
+ int f2;
+
+ if (!sdRef || !callBack) return kDNSServiceErr_BadParam;
- int f1 = (flags & kDNSServiceFlagsBrowseDomains) != 0;
- int f2 = (flags & kDNSServiceFlagsRegistrationDomains) != 0;
+ f1 = (flags & kDNSServiceFlagsBrowseDomains) != 0;
+ f2 = (flags & kDNSServiceFlagsRegistrationDomains) != 0;
if (f1 + f2 != 1) return kDNSServiceErr_BadParam;
err = ConnectToServer(sdRef, flags, enumeration_request, handle_enumeration_response, callBack, context);
@@ -1736,10 +1776,13 @@ static void ConnectionResponse(DNSServiceOp *const sdr, const CallbackHeader *co
DNSServiceErrorType DNSSD_API DNSServiceCreateConnection(DNSServiceRef *sdRef)
{
+ DNSServiceErrorType err;
char *ptr;
size_t len = 0;
ipc_msg_hdr *hdr;
- DNSServiceErrorType err = ConnectToServer(sdRef, 0, connection_request, ConnectionResponse, NULL, NULL);
+
+ if (!sdRef) return kDNSServiceErr_BadParam;
+ err = ConnectToServer(sdRef, 0, connection_request, ConnectionResponse, NULL, NULL);
if (err) return err; // On error ConnectToServer leaves *sdRef set to NULL
hdr = create_hdr(connection_request, &len, &ptr, 0, *sdRef);
@@ -1757,6 +1800,7 @@ DNSServiceErrorType DNSSD_API DNSServiceCreateDelegateConnection(DNSServiceRef *
size_t len = 0;
ipc_msg_hdr *hdr;
+ if (!sdRef) return kDNSServiceErr_BadParam;
DNSServiceErrorType err = ConnectToServer(sdRef, 0, connection_delegate_request, ConnectionResponse, NULL, NULL);
if (err)
{
@@ -1846,7 +1890,11 @@ DNSServiceErrorType DNSSD_API DNSServiceRegisterRecord
if ((interfaceIndex == kDNSServiceInterfaceIndexAny) && includeP2PWithIndexAny())
flags |= kDNSServiceFlagsIncludeP2P;
- if (!sdRef) { syslog(LOG_WARNING, "dnssd_clientstub DNSServiceRegisterRecord called with NULL DNSServiceRef"); return kDNSServiceErr_BadParam; }
+ if (!sdRef || !RecordRef || !fullname || !rdata || !callBack)
+ {
+ syslog(LOG_WARNING, "dnssd_clientstub DNSServiceRegisterRecord called with NULL parameter");
+ return kDNSServiceErr_BadParam;
+ }
if (!DNSServiceRefValid(sdRef))
{
@@ -1927,8 +1975,11 @@ DNSServiceErrorType DNSSD_API DNSServiceAddRecord
DNSRecordRef rref;
DNSRecord **p;
- if (!sdRef) { syslog(LOG_WARNING, "dnssd_clientstub DNSServiceAddRecord called with NULL DNSServiceRef"); return kDNSServiceErr_BadParam; }
- if (!RecordRef) { syslog(LOG_WARNING, "dnssd_clientstub DNSServiceAddRecord called with NULL DNSRecordRef pointer"); return kDNSServiceErr_BadParam; }
+ if (!sdRef || !RecordRef || !rdata)
+ {
+ syslog(LOG_WARNING, "dnssd_clientstub DNSServiceAddRecord called with NULL parameter");
+ return kDNSServiceErr_BadParam;
+ }
if (sdRef->op != reg_service_request)
{
syslog(LOG_WARNING, "dnssd_clientstub DNSServiceAddRecord called with non-DNSServiceRegister DNSServiceRef %p %d", sdRef, sdRef->op);
@@ -1988,7 +2039,11 @@ DNSServiceErrorType DNSSD_API DNSServiceUpdateRecord
size_t len = 0;
char *ptr;
- if (!sdRef) { syslog(LOG_WARNING, "dnssd_clientstub DNSServiceUpdateRecord called with NULL DNSServiceRef"); return kDNSServiceErr_BadParam; }
+ if (!sdRef || !rdata)
+ {
+ syslog(LOG_WARNING, "dnssd_clientstub DNSServiceUpdateRecord called with NULL parameter");
+ return kDNSServiceErr_BadParam;
+ }
if (!DNSServiceRefValid(sdRef))
{
@@ -2064,12 +2119,15 @@ DNSServiceErrorType DNSSD_API DNSServiceReconfirmRecord
const void *rdata
)
{
+ DNSServiceErrorType err;
char *ptr;
size_t len;
ipc_msg_hdr *hdr;
DNSServiceOp *tmp;
- DNSServiceErrorType err = ConnectToServer(&tmp, flags, reconfirm_record_request, NULL, NULL, NULL);
+ if (!fullname || !rdata) return kDNSServiceErr_BadParam;
+
+ err = ConnectToServer(&tmp, flags, reconfirm_record_request, NULL, NULL, NULL);
if (err) return err;
len = sizeof(DNSServiceFlags);