df
ed03a6098d
Consequently: - fixes #9 Arbitrary memory read while parsing malicious mDNS queries (mdns.c); - fixes #10 Denial of Service vulnerability (infinite loop) while parsing malicious mDNS queries (mdns.c); - fixes #11 Heap-based buffer overread (off-by-one) (mdns.c); - fixes #12 Heap-based buffer overread while parsing mDNS RR section (off-by-one) (mdns.c).
154 lines
5.2 KiB
C
154 lines
5.2 KiB
C
/*
|
|
* tinysvcmdns - a tiny MDNS implementation for publishing services
|
|
* Copyright (C) 2011 Darell Tan
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 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. The name of the author may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
/* APIs for Multicast DNS */
|
|
|
|
#ifndef __MDNSD_H__
|
|
#define __MDNSD_H__
|
|
|
|
#include <stdint.h>
|
|
|
|
struct mdnsd;
|
|
struct mdns_service;
|
|
|
|
#define MAX_NUMBER_OF_SERVICE_DISCOVERY_RESULT 10
|
|
#define MAX_SERVICE_DISCOVERY_TIME_MS (60 * 1000)
|
|
|
|
#define MDNS_HOSTNAME_RESOLVER_TIMEOUT_MSEC (3 * 1000)
|
|
#define MDNS_HOSTNAME_RESOLVER_MAX_TRY_COUNT 5
|
|
#define MDNS_HOSTNAME_RESOLVER_WAIT_TIME_MSEC 250
|
|
|
|
#define MDNS_SERVICE_DISCOVERY_MAX_TRY_COUNT 5
|
|
#define MDNS_SERVICE_DISCOVERY_WAIT_TIME_MSEC 250
|
|
|
|
/* Structure of MDNS service information */
|
|
struct mdns_service_info {
|
|
char *type;
|
|
char *instance_name;
|
|
char *hostname;
|
|
unsigned int ipaddr; /* ipv4 */
|
|
unsigned int port;
|
|
};
|
|
|
|
#ifdef __cplusplus
|
|
#define EXTERN extern "C"
|
|
extern "C"
|
|
{
|
|
#else
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
#ifndef MDNS_NO_RESPONDER_SUPPORT
|
|
|
|
/**
|
|
* starts the MDNS daemon.
|
|
*
|
|
* [in] desired_hostname the desired host name as string type; if same name is in the network, an alternative name will be set as hostname.
|
|
* [in] netif_name network interface name as string type
|
|
* On success, 0 is returned. On failure, a negative value is returned.
|
|
*
|
|
*/
|
|
int mdnsd_start(const char *desired_hostname, const char *netif_name);
|
|
|
|
/**
|
|
* mdnsd_stop() stops the MDNS daemon.
|
|
*
|
|
* On success, 0 is returned. On failure, a negative value is returned.
|
|
*
|
|
*/
|
|
int mdnsd_stop(void);
|
|
|
|
/**
|
|
* mdnsd_get_hostname() gets the current host name as MDNS type.
|
|
*
|
|
* [out] hostname_result 32-bytes string buffer for the host name result
|
|
* On success, 0 is returned. On failure, a negative value is returned.
|
|
*
|
|
*/
|
|
int mdnsd_get_hostname(char *hostname_result);
|
|
|
|
/**
|
|
* mdnsd_register_service() register a service to expose through mDNS-SD.
|
|
*
|
|
* [in] instance instance name to expose
|
|
* [in] type type of service. e.g. _http._tcp.local
|
|
* [in] port port to which the service is reachable
|
|
* [in] hostname if NULL, use the hostname configured when starting the daemon,
|
|
* or use this parameter otherwise
|
|
* [in] txt text records to add to the service announcement. Can be NULL.
|
|
* On success, 0 is returned. On failure, a negative errno value is returned.
|
|
*
|
|
*/
|
|
int mdnsd_register_service(const char *instance, const char *type,
|
|
uint16_t port, const char *hostname, const char *txt[]);
|
|
|
|
// sets the hostname for the given MDNS responder instance
|
|
void mdnsd_set_hostname(struct mdnsd *svr, const char *hostname, uint32_t ip);
|
|
|
|
// adds an additional RR
|
|
void mdnsd_add_rr(struct mdnsd *svr, struct rr_entry *rr);
|
|
|
|
// registers a service with the MDNS responder instance
|
|
//struct mdns_service *mdnsd_register_svc(struct mdnsd *svr, const char *instance_name,
|
|
// const char *type, uint16_t port, const char *hostname, const char *txt[]);
|
|
|
|
// destroys the mdns_service struct returned by mdnsd_register_svc()
|
|
//void mdns_service_destroy(struct mdns_service *srv);
|
|
|
|
#endif /* !defined MDNS_NO_RESPONDER_SUPPORT */
|
|
|
|
/**
|
|
* mdnsd_resolve_hostname() gets ip address with the given hostname.
|
|
*
|
|
* [in] hostname host name as string type
|
|
* [out] ipaddr the pointer of ip address result
|
|
* On success, 0 is returned. On failure, a negative value is returned.
|
|
*
|
|
*/
|
|
int mdnsd_resolve_hostname(char *hostname, int *ipaddr);
|
|
|
|
/**
|
|
* mdnsd_discover_service() discovers services with the given service type string
|
|
*
|
|
* [in] service_type mdns service type string
|
|
* [in] discover_time_msec time in milliseconds for discovering service
|
|
* [out] service_list the array of service list
|
|
* [out] num_of_services number of services
|
|
* On success, 0 is returned. On failure, a negative value is returned.
|
|
*
|
|
*/
|
|
int mdnsd_discover_service(char *service_type, int discover_time_msec, struct mdns_service_info **service_list, int *num_of_services);
|
|
|
|
|
|
#undef EXTERN
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /*!__MDNSD_H__ */
|
|
|