summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdns_sd/common/dnssd_clientstub.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdns_sd/common/dnssd_clientstub.c')
-rw-r--r--usr/src/lib/libdns_sd/common/dnssd_clientstub.c114
1 files changed, 57 insertions, 57 deletions
diff --git a/usr/src/lib/libdns_sd/common/dnssd_clientstub.c b/usr/src/lib/libdns_sd/common/dnssd_clientstub.c
index 6c44dae48d..b0fd9f9983 100644
--- a/usr/src/lib/libdns_sd/common/dnssd_clientstub.c
+++ b/usr/src/lib/libdns_sd/common/dnssd_clientstub.c
@@ -1,6 +1,6 @@
/* -*- Mode: C; tab-width: 4 -*-
*
- * Copyright (c) 2003-2004, Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2003-2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -10,7 +10,7 @@
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of its
+ * 3. Neither the name of Apple Inc. ("Apple") nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
@@ -30,14 +30,15 @@
#include <stdlib.h>
#include <fcntl.h>
+#include "dnssd_ipc.h"
+
#if APPLE_OSX_mDNSResponder
#include <mach-o/dyld.h>
#include <uuid/uuid.h>
#include <TargetConditionals.h>
+#include "dns_sd_private.h"
#endif
-#include "dnssd_ipc.h"
-
#if defined(_WIN32)
#define _SSIZE_T
@@ -75,7 +76,7 @@ static void syslog( int priority, const char * message, ...)
va_start( args, message );
len = _vscprintf( message, args ) + 1;
buffer = malloc( len * sizeof(char) );
- if ( buffer ) { vsprintf( buffer, message, args ); OutputDebugString( buffer ); free( buffer ); }
+ if ( buffer ) { vsnprintf( buffer, len, message, args ); OutputDebugString( buffer ); free( buffer ); }
WSASetLastError( err );
}
#else
@@ -285,7 +286,7 @@ static int more_bytes(dnssd_sock_t sd)
// two ints and not just one.
int nfdbits = sizeof (int) * 8;
int nints = (sd/nfdbits) + 1;
- fs = (fd_set *)calloc(nints, sizeof(int));
+ fs = (fd_set *)calloc(nints, (size_t)sizeof(int));
if (fs == NULL)
{
syslog(LOG_WARNING, "dnssd_clientstub more_bytes: malloc failed");
@@ -356,7 +357,7 @@ static ipc_msg_hdr *create_hdr(uint32_t op, size_t *len, char **data_start, int
struct timeval tv;
if (gettimeofday(&tv, NULL) < 0)
{ syslog(LOG_WARNING, "dnssd_clientstub create_hdr: gettimeofday failed %d %s", dnssd_errno, dnssd_strerror(dnssd_errno)); return NULL; }
- sprintf(ctrl_path, "%s%d-%.3lx-%.6lu", CTL_PATH_PREFIX, (int)getpid(),
+ snprintf(ctrl_path, sizeof(ctrl_path), "%s%d-%.3lx-%.6lu", CTL_PATH_PREFIX, (int)getpid(),
(unsigned long)(tv.tv_sec & 0xFFF), (unsigned long)(tv.tv_usec));
*len += strlen(ctrl_path) + 1;
#else
@@ -406,7 +407,11 @@ static void FreeDNSServiceOp(DNSServiceOp *x)
// We don't use our DNSServiceRefValid macro here because if we're cleaning up after a socket() call failed
// then sockfd could legitimately contain a failing value (e.g. dnssd_InvalidSocket)
if ((x->sockfd ^ x->validator) != ValidatorBits)
+ {
+ static DNSServiceOp *op_were_not_going_to_free_but_we_need_to_fool_the_analyzer;
syslog(LOG_WARNING, "dnssd_clientstub attempt to dispose invalid DNSServiceRef %p %08X %08X", x, x->sockfd, x->validator);
+ op_were_not_going_to_free_but_we_need_to_fool_the_analyzer = x;
+ }
else
{
x->next = NULL;
@@ -531,6 +536,11 @@ static DNSServiceErrorType ConnectToServer(DNSServiceRef *ref, DNSServiceFlags f
char* uds_serverpath = getenv(MDNS_UDS_SERVERPATH_ENVVAR);
if (uds_serverpath == NULL)
uds_serverpath = MDNS_UDS_SERVERPATH;
+ else if (strlen(uds_serverpath) >= MAX_CTLPATH)
+ {
+ uds_serverpath = MDNS_UDS_SERVERPATH;
+ syslog(LOG_WARNING, "dnssd_clientstub ConnectToServer: using default path since env len is invalid");
+ }
#endif
*ref = NULL;
sdr->sockfd = socket(AF_DNSSD, SOCK_STREAM, 0);
@@ -579,8 +589,10 @@ static DNSServiceErrorType ConnectToServer(DNSServiceRef *ref, DNSServiceFlags f
}
else
{
+ #if !defined(USE_TCP_LOOPBACK)
syslog(LOG_WARNING, "dnssd_clientstub ConnectToServer: connect() failed path:%s Socket:%d Err:%d Errno:%d %s",
uds_serverpath, sdr->sockfd, err, dnssd_errno, dnssd_strerror(dnssd_errno));
+ #endif
dnssd_close(sdr->sockfd);
FreeDNSServiceOp(sdr);
return kDNSServiceErr_ServiceNotRunning;
@@ -598,21 +610,25 @@ static DNSServiceErrorType ConnectToServer(DNSServiceRef *ref, DNSServiceFlags f
static DNSServiceErrorType deliver_request(ipc_msg_hdr *hdr, DNSServiceOp *sdr)
{
+ if (!hdr)
+ {
+ syslog(LOG_WARNING, "dnssd_clientstub deliver_request: !hdr");
+ return kDNSServiceErr_Unknown;
+ }
+
uint32_t datalen = hdr->datalen; // We take a copy here because we're going to convert hdr->datalen to network byte order
#if defined(USE_TCP_LOOPBACK) || defined(USE_NAMED_ERROR_RETURN_SOCKET)
char *const data = (char *)hdr + sizeof(ipc_msg_hdr);
#endif
dnssd_sock_t listenfd = dnssd_InvalidSocket, errsd = dnssd_InvalidSocket;
DNSServiceErrorType err = kDNSServiceErr_Unknown; // Default for the "goto cleanup" cases
- int MakeSeparateReturnSocket = 0;
// Note: need to check hdr->op, not sdr->op.
// hdr->op contains the code for the specific operation we're currently doing, whereas sdr->op
// contains the original parent DNSServiceOp (e.g. for an add_record_request, hdr->op will be
// add_record_request but the parent sdr->op will be connection_request or reg_service_request)
- if (sdr->primary ||
- hdr->op == reg_record_request || hdr->op == add_record_request || hdr->op == update_record_request || hdr->op == remove_record_request)
- MakeSeparateReturnSocket = 1;
+ const int MakeSeparateReturnSocket = (sdr->primary ||
+ hdr->op == reg_record_request || hdr->op == add_record_request || hdr->op == update_record_request || hdr->op == remove_record_request);
if (!DNSServiceRefValid(sdr))
{
@@ -622,12 +638,6 @@ static DNSServiceErrorType deliver_request(ipc_msg_hdr *hdr, DNSServiceOp *sdr)
return kDNSServiceErr_BadReference;
}
- if (!hdr)
- {
- syslog(LOG_WARNING, "dnssd_clientstub deliver_request: !hdr");
- return kDNSServiceErr_Unknown;
- }
-
if (MakeSeparateReturnSocket)
{
#if defined(USE_TCP_LOOPBACK)
@@ -637,21 +647,21 @@ static DNSServiceErrorType deliver_request(ipc_msg_hdr *hdr, DNSServiceOp *sdr)
dnssd_socklen_t len = (dnssd_socklen_t) sizeof(caddr);
listenfd = socket(AF_DNSSD, SOCK_STREAM, 0);
if (!dnssd_SocketValid(listenfd)) {
- deliver_request_bailout("TCP socket");
- }
+ deliver_request_bailout("TCP socket");
+ }
caddr.sin_family = AF_INET;
caddr.sin_port = 0;
caddr.sin_addr.s_addr = inet_addr(MDNS_TCP_SERVERADDR);
if (bind(listenfd, (struct sockaddr*) &caddr, sizeof(caddr)) < 0) {
- deliver_request_bailout("TCP bind");
- }
- if (getsockname(listenfd, (struct sockaddr*) &caddr, &len) < 0) {
- deliver_request_bailout("TCP getsockname");
- }
- if (listen(listenfd, 1) < 0) {
- deliver_request_bailout("TCP listen");
- }
+ deliver_request_bailout("TCP bind");
+ }
+ if (getsockname(listenfd, (struct sockaddr*) &caddr, &len) < 0) {
+ deliver_request_bailout("TCP getsockname");
+ }
+ if (listen(listenfd, 1) < 0) {
+ deliver_request_bailout("TCP listen");
+ }
port.s = caddr.sin_port;
data[0] = port.b[0]; // don't switch the byte order, as the
data[1] = port.b[1]; // daemon expects it in network byte order
@@ -663,8 +673,8 @@ static DNSServiceErrorType deliver_request(ipc_msg_hdr *hdr, DNSServiceOp *sdr)
dnssd_sockaddr_t caddr;
listenfd = socket(AF_DNSSD, SOCK_STREAM, 0);
if (!dnssd_SocketValid(listenfd)) {
- deliver_request_bailout("USE_NAMED_ERROR_RETURN_SOCKET socket");
- }
+ deliver_request_bailout("USE_NAMED_ERROR_RETURN_SOCKET socket");
+ }
caddr.sun_family = AF_LOCAL;
// According to Stevens (section 3.2), there is no portable way to
@@ -676,19 +686,19 @@ static DNSServiceErrorType deliver_request(ipc_msg_hdr *hdr, DNSServiceOp *sdr)
mask = umask(0);
bindresult = bind(listenfd, (struct sockaddr *)&caddr, sizeof(caddr));
umask(mask);
- if (bindresult < 0) {
- deliver_request_bailout("USE_NAMED_ERROR_RETURN_SOCKET bind");
- }
+ if (bindresult < 0) {
+ deliver_request_bailout("USE_NAMED_ERROR_RETURN_SOCKET bind");
+ }
if (listen(listenfd, 1) < 0) {
- deliver_request_bailout("USE_NAMED_ERROR_RETURN_SOCKET listen");
- }
+ deliver_request_bailout("USE_NAMED_ERROR_RETURN_SOCKET listen");
+ }
}
#else
{
dnssd_sock_t sp[2];
if (socketpair(AF_DNSSD, SOCK_STREAM, 0, sp) < 0) {
- deliver_request_bailout("socketpair");
- }
+ deliver_request_bailout("socketpair");
+ }
else
{
errsd = sp[0]; // We'll read our four-byte error code from sp[0]
@@ -756,7 +766,7 @@ static DNSServiceErrorType deliver_request(ipc_msg_hdr *hdr, DNSServiceOp *sdr)
errsd = accept(listenfd, (struct sockaddr *)&daddr, &len);
if (!dnssd_SocketValid(errsd)) {
deliver_request_bailout("accept");
- }
+ }
#else
struct iovec vec = { ((char *)hdr) + sizeof(ipc_msg_hdr) + datalen, 1 }; // Send the last byte along with the SCM_RIGHTS
@@ -1176,6 +1186,8 @@ DNSServiceErrorType DNSSD_API DNSServiceGetProperty(const char *property, void *
put_string(property, &ptr);
err = deliver_request(hdr, tmp); // Will free hdr for us
+ if (err) { DNSServiceRefDeallocate(tmp); return err; }
+
if (read_all(tmp->sockfd, (char*)&actualsize, (int)sizeof(actualsize)) < 0)
{ DNSServiceRefDeallocate(tmp); return kDNSServiceErr_ServiceNotRunning; }
@@ -1200,24 +1212,17 @@ DNSServiceErrorType DNSSD_API DNSServiceGetPID(const uint16_t srcport, int32_t *
size_t len = sizeof(int32_t);
DNSServiceErrorType err = ConnectToServer(&tmp, 0, getpid_request, NULL, NULL, NULL);
- if (err)
- return err;
+ if (err) return err;
hdr = create_hdr(getpid_request, &len, &ptr, 0, tmp);
- if (!hdr)
- {
- DNSServiceRefDeallocate(tmp);
- return kDNSServiceErr_NoMemory;
- }
+ if (!hdr) { DNSServiceRefDeallocate(tmp); return kDNSServiceErr_NoMemory; }
put_uint16(srcport, &ptr);
err = deliver_request(hdr, tmp); // Will free hdr for us
+ if (err) { DNSServiceRefDeallocate(tmp); return err; }
if (read_all(tmp->sockfd, (char*)pid, sizeof(int32_t)) < 0)
- {
- DNSServiceRefDeallocate(tmp);
- return kDNSServiceErr_ServiceNotRunning;
- }
+ { DNSServiceRefDeallocate(tmp); return kDNSServiceErr_ServiceNotRunning; }
DNSServiceRefDeallocate(tmp);
return kDNSServiceErr_NoError;
@@ -1399,16 +1404,17 @@ DNSServiceErrorType DNSSD_API DNSServiceQueryRecord
static void handle_addrinfo_response(DNSServiceOp *const sdr, const CallbackHeader *const cbh, const char *data, const char *const end)
{
char hostname[kDNSServiceMaxDomainName];
- uint16_t rrtype, rdlen;
+ uint16_t rrtype, rrclass, rdlen;
const char *rdata;
uint32_t ttl;
get_string(&data, end, hostname, kDNSServiceMaxDomainName);
rrtype = get_uint16(&data, end);
- (void) get_uint16(&data, end); /* class is not used */
+ rrclass = get_uint16(&data, end);
rdlen = get_uint16(&data, end);
rdata = get_rdata (&data, end, rdlen);
ttl = get_uint32(&data, end);
+ (void)rrclass; // Unused
// We only generate client callbacks for A and AAAA results (including NXDOMAIN results for
// those types, if the client has requested those with the kDNSServiceFlagsReturnIntermediates).
@@ -1631,13 +1637,7 @@ DNSServiceErrorType DNSSD_API DNSServiceRegister
hdr = create_hdr(reg_service_request, &len, &ptr, (*sdRef)->primary ? 1 : 0, *sdRef);
if (!hdr) { DNSServiceRefDeallocate(*sdRef); *sdRef = NULL; return kDNSServiceErr_NoMemory; }
-
- // If it is going over a shared connection, then don't set the IPC_FLAGS_NOREPLY
- // as it affects all the operations over the shared connection. This is not
- // a normal case and hence receiving the response back from the daemon and
- // discarding it in ConnectionResponse is okay.
-
- if (!(flags & kDNSServiceFlagsShareConnection) && !callBack) hdr->ipc_flags |= IPC_FLAGS_NOREPLY;
+ if (!callBack) hdr->ipc_flags |= IPC_FLAGS_NOREPLY;
put_flags(flags, &ptr);
put_uint32(interfaceIndex, &ptr);