this really fatal problem caused stack overflows - detected by c-lang sanitizers
*
*/
static int
-netmask_verify(struct access_ipmask_queue *ais, struct sockaddr *src)
+netmask_verify(struct access_ipmask_queue *ais, struct sockaddr_storage *src)
{
access_ipmask_t *ai;
int isv4v6 = 0;
uint32_t v4v6 = 0;
- if (src->sa_family == AF_INET6) {
+ if (src->ss_family == AF_INET6) {
struct in6_addr *in6 = &(((struct sockaddr_in6 *)src)->sin6_addr);
uint32_t *a32 = (uint32_t*)in6->s6_addr;
if (a32[0] == 0 && a32[1] == 0 && ntohl(a32[2]) == 0x0000FFFFu) {
TAILQ_FOREACH(ai, ais, ai_link) {
- if (ai->ai_family == AF_INET && src->sa_family == AF_INET) {
+ if (ai->ai_family == AF_INET && src->ss_family == AF_INET) {
struct sockaddr_in *in4 = (struct sockaddr_in *)src;
uint32_t b = ntohl(in4->sin_addr.s_addr);
continue;
- } else if (ai->ai_family == AF_INET6 && src->sa_family == AF_INET6) {
+ } else if (ai->ai_family == AF_INET6 && src->ss_family == AF_INET6) {
struct in6_addr *in6 = &(((struct sockaddr_in6 *)src)->sin6_addr);
uint8_t *a8 = (uint8_t*)in6->s6_addr;
*
*/
static inline int
-access_ip_blocked(struct sockaddr *src)
+access_ip_blocked(struct sockaddr_storage *src)
{
ipblock_entry_t *ib;
*
*/
access_t *
-access_get(struct sockaddr *src, const char *username, verify_callback_t verify, void *aux)
+access_get(struct sockaddr_storage *src, const char *username, verify_callback_t verify, void *aux)
{
access_t *a = access_alloc();
access_entry_t *ae;
return access_full(a);
} else {
a->aa_representative = malloc(50);
- tcp_get_str_from_ip((struct sockaddr*)src, a->aa_representative, 50);
+ tcp_get_str_from_ip(src, a->aa_representative, 50);
if(!passwd_verify2(username, verify, aux,
superuser_username, superuser_password))
return access_full(a);
*
*/
access_t *
-access_get_by_addr(struct sockaddr *src)
+access_get_by_addr(struct sockaddr_storage *src)
{
access_t *a = access_alloc();
access_entry_t *ae;
*/
typedef int (*verify_callback_t)(void *aux, const char *passwd);
-access_t *access_get(struct sockaddr *src, const char *username,
+access_t *access_get(struct sockaddr_storage *src, const char *username,
verify_callback_t verify, void *aux);
/**
*
*/
access_t *
-access_get_by_addr(struct sockaddr *src);
+access_get_by_addr(struct sockaddr_storage *src);
/**
*
int weight;
profile_t *pro;
profile_chain_t *prch;
- struct sockaddr sa;
+ struct sockaddr_storage sa;
access_t *aa;
uint32_t rec_count, net_count;
int c1, c2;
char buf[50];
addrlen = sizeof(addr);
getsockname(htsp->htsp_fd, (struct sockaddr*)&addr, &addrlen);
- tcp_get_str_from_ip((struct sockaddr*)&addr, buf, 50);
+ tcp_get_str_from_ip(&addr, buf, 50);
snprintf(url, sizeof(url), "http://%s%s%s:%d%s/%s",
(addr.ss_family == AF_INET6)?"[":"",
buf,
vs.digest = digest;
vs.challenge = htsp->htsp_challenge;
- rights = access_get((struct sockaddr *)htsp->htsp_peer, username,
+ rights = access_get(htsp->htsp_peer, username,
htsp_verify_callback, &vs);
if (rights->aa_rights == 0) {
pthread_mutex_lock(&global_lock);
- htsp->htsp_granted_access =
- access_get_by_addr((struct sockaddr *)htsp->htsp_peer);
+ htsp->htsp_granted_access = access_get_by_addr(htsp->htsp_peer);
htsp->htsp_granted_access->aa_rights |= ACCESS_HTSP_INTERFACE;
tcp_id = tcp_connection_launch(htsp->htsp_fd, htsp_server_status,
if (config.dscp >= 0)
socket_set_dscp(fd, config.dscp, NULL, 0);
- tcp_get_str_from_ip((struct sockaddr*)source, buf, 50);
+ tcp_get_str_from_ip(source, buf, 50);
memset(&htsp, 0, sizeof(htsp_connection_t));
*opaque = &htsp;
hc->hc_access = NULL;
return -1;
}
- hc->hc_access = access_get((struct sockaddr *)hc->hc_peer, hc->hc_username,
+ hc->hc_access = access_get(hc->hc_peer, hc->hc_username,
http_verify_callback, &v);
http_verify_free(&v);
if (hc->hc_access)
hc->hc_access = NULL;
return -1;
}
- hc->hc_access = access_get((struct sockaddr *)hc->hc_peer, hc->hc_username,
+ hc->hc_access = access_get(hc->hc_peer, hc->hc_username,
http_verify_callback, &v);
http_verify_free(&v);
if (hc->hc_access) {
v = (config.proxy) ? http_arg_get(&hc->hc_args, "X-Forwarded-For") : NULL;
if (v)
- tcp_get_ip_from_str(v, (struct sockaddr*)hc->hc_peer);
+ tcp_get_ip_from_str(v, hc->hc_peer);
- tcp_get_str_from_ip((struct sockaddr*)hc->hc_peer, authbuf, sizeof(authbuf));
+ tcp_get_str_from_ip(hc->hc_peer, authbuf, sizeof(authbuf));
hc->hc_peer_ipstr = tvh_strdupa(authbuf);
hc->hc_representative = hc->hc_peer_ipstr;
{
tvhdhomerun_device_t *hd = (tvhdhomerun_device_t *)in;
char ip[64];
- tcp_get_str_from_ip((struct sockaddr *)&hd->hd_info.ip_address, ip, sizeof(ip));
+ tcp_get_str_from_ip(&hd->hd_info.ip_address, ip, sizeof(ip));
snprintf(prop_sbuf, PROP_SBUF_LEN,
"%s - %s", hd->hd_info.friendlyname, ip);
return prop_sbuf;
tvhdhomerun_device_class_get_ip_address ( void *obj )
{
tvhdhomerun_device_t *hd = obj;
- tcp_get_str_from_ip((struct sockaddr *)&hd->hd_info.ip_address, prop_sbuf, PROP_SBUF_LEN);
+ tcp_get_str_from_ip(&hd->hd_info.ip_address, prop_sbuf, PROP_SBUF_LEN);
return &prop_sbuf_ptr;
}
((struct sockaddr_in *)&detected_dev_addr)->sin_addr.s_addr = htonl(cDev->ip_addr);
char existing_ip[64];
- tcp_get_str_from_ip((struct sockaddr *)&existing->hd_info.ip_address,
- existing_ip, sizeof(existing_ip));
+ tcp_get_str_from_ip(&existing->hd_info.ip_address, existing_ip, sizeof(existing_ip));
char detected_ip[64];
- tcp_get_str_from_ip((struct sockaddr *)&detected_dev_addr, detected_ip,
- sizeof(detected_ip));
+ tcp_get_str_from_ip(&detected_dev_addr, detected_ip, sizeof(detected_ip));
tvhinfo(LS_TVHDHOMERUN,"HDHomerun device %08x switched IPs from %s to %s, updating",
cDev->device_id, existing_ip, detected_ip);
strstr(hfe->mi_name, " #"))) {
char lname[256];
char ip[64];
- tcp_get_str_from_ip((struct sockaddr *)&hd->hd_info.ip_address, ip, sizeof(ip));
+ tcp_get_str_from_ip(&hd->hd_info.ip_address, ip, sizeof(ip));
snprintf(lname, sizeof(lname), "HDHomeRun %s Tuner #%i (%s)",
dvb_type2str(type), hfe->hf_tunerNumber, ip);
free(hfe->mi_name);
int alive = 1, fatal = 0, r;
int tcp = rtp->port == RTSP_TCP_DATA;
- tcp_get_str_from_ip((struct sockaddr *)&rtp->peer, peername, sizeof(peername));
+ tcp_get_str_from_ip(&rtp->peer, peername, sizeof(peername));
tvhdebug(LS_SATIPS, "RTP streaming to %s:%d open", peername,
tcp ? IP_PORT(rtp->peer) : rtp->port);
if (len <= 0) continue;
if (tvhtrace_enabled()) {
msg[len] = '\0';
- tcp_get_str_from_ip((struct sockaddr*)&rtp->peer2, addrbuf, sizeof(addrbuf));
+ tcp_get_str_from_ip(&rtp->peer2, addrbuf, sizeof(addrbuf));
tvhtrace(LS_SATIPS, "RTCP send to %s:%d : %s", addrbuf, ntohs(IP_PORT(rtp->peer2)), msg + 16);
}
if (rtp->port == RTSP_TCP_DATA) {
}
if (r < 0) {
err = errno;
- tcp_get_str_from_ip((struct sockaddr*)&rtp->peer2, addrbuf, sizeof(addrbuf));
+ tcp_get_str_from_ip(&rtp->peer2, addrbuf, sizeof(addrbuf));
tvhwarn(LS_SATIPS, "RTCP send to error %s:%d : %s",
addrbuf, IP_PORT(rtp->peer2), strerror(err));
}
memset(&aa, 0, sizeof(aa));
strcpy(buf, "SAT>IP Client ");
- tcp_get_str_from_ip((struct sockaddr *)peer, buf + strlen(buf), sizeof(buf) - strlen(buf));
+ tcp_get_str_from_ip(peer, buf + strlen(buf), sizeof(buf) - strlen(buf));
aa.aa_representative = buf;
tcp = tcp_connection_launch(fd, rtsp_stream_status, &aa);
return;
if (tvhtrace_enabled()) {
- tcp_get_str_from_ip((struct sockaddr *)dst, buf, sizeof(buf));
+ tcp_get_str_from_ip(dst, buf, sizeof(buf));
tvhtrace(LS_SATIPS, "sending discover reply to %s:%d%s%s",
buf, ntohs(IP_PORT(*dst)), deviceid ? " device: " : "", deviceid ?: "");
}
return;
if (tvhtrace_enabled()) {
- tcp_get_str_from_ip((struct sockaddr *)storage, buf2, sizeof(buf2));
+ tcp_get_str_from_ip(storage, buf2, sizeof(buf2));
tvhtrace(LS_SATIPS, "received %s M-SEARCH from %s:%d",
conn->multicast ? "multicast" : "unicast",
buf2, ntohs(IP_PORT(*storage)));
satip_server_deviceid += 1;
if (satip_server_deviceid >= 254)
satip_server_deviceid = 1;
- tcp_get_str_from_ip((struct sockaddr *)storage, buf2, sizeof(buf2));
+ tcp_get_str_from_ip(storage, buf2, sizeof(buf2));
tvhwarn(LS_SATIPS, "received duplicate SAT>IP DeviceID %s from %s:%d, using %d",
deviceid, buf2, ntohs(IP_PORT(*storage)), satip_server_deviceid);
satips_upnp_send_discover_reply(storage, deviceid, 0);
tvherror(LS_SATIPS, "Unable to determine the HTTP/RTSP address");
return;
}
- tcp_get_str_from_ip((const struct sockaddr *)&http, http_ip, sizeof(http_ip));
+ tcp_get_str_from_ip(&http, http_ip, sizeof(http_ip));
http_server_ip = strdup(satip_server_bindaddr ?: http_ip);
http_server_port = ntohs(IP_PORT(http));
}
*
*/
char *
-tcp_get_str_from_ip(const struct sockaddr *sa, char *dst, size_t maxlen)
+tcp_get_str_from_ip(const struct sockaddr_storage *sa, char *dst, size_t maxlen)
{
if (sa == NULL || dst == NULL)
return NULL;
- switch(sa->sa_family)
+ switch(sa->ss_family)
{
case AF_INET:
inet_ntop(AF_INET, &(((struct sockaddr_in*)sa)->sin_addr), dst, maxlen);
/**
*
*/
-struct sockaddr *
-tcp_get_ip_from_str(const char *src, struct sockaddr *sa)
+struct sockaddr_storage *
+tcp_get_ip_from_str(const char *src, struct sockaddr_storage *sa)
{
if (sa == NULL || src == NULL)
return NULL;
if (strstr(src, ":")) {
- sa->sa_family = AF_INET6;
+ sa->ss_family = AF_INET6;
if (inet_pton(AF_INET6, src, &(((struct sockaddr_in6*)sa)->sin6_addr)) != 1)
return NULL;
} else if (strstr(src, ".")) {
- sa->sa_family = AF_INET;
+ sa->ss_family = AF_INET;
if (inet_pton(AF_INET, src, &(((struct sockaddr_in*)sa)->sin_addr)) != 1)
return NULL;
} else {
ts->ops = *ops;
ts->opaque = opaque;
- tcp_get_str_from_ip((const struct sockaddr *)&bound, buf, sizeof(buf));
+ tcp_get_str_from_ip(&bound, buf, sizeof(buf));
tvhinfo(subsystem, "Starting %s server %s:%d", name, buf, htons(IP_PORT(bound)));
return ts;
fd = SD_LISTEN_FDS_START + i;
memset(&bound, 0, sizeof(bound));
s_len = sizeof(bound);
- if (getsockname(fd, (struct sockaddr *) &bound, &s_len) != 0) {
+ if (getsockname(fd, &bound, &s_len) != 0) {
tvherror(LS_TCP, "getsockname failed: %s", strerror(errno));
continue;
}
ts->bound = bound;
ts->ops = *ops;
ts->opaque = opaque;
- tcp_get_str_from_ip((const struct sockaddr *)&bound, buf, sizeof(buf));
+ tcp_get_str_from_ip(&bound, buf, sizeof(buf));
tvhinfo(subsystem, "Starting %s server %s:%d (systemd)", name, buf, htons(IP_PORT(bound)));
} else {
/* no systemd-managed socket found, create a new one */
if (!tsl->status) continue;
c++;
e = htsmsg_create_map();
- tcp_get_str_from_ip((struct sockaddr*)&tsl->peer, buf, sizeof(buf));
+ tcp_get_str_from_ip(&tsl->peer, buf, sizeof(buf));
htsmsg_add_u32(e, "id", tsl->id);
htsmsg_add_str(e, "peer", buf);
htsmsg_add_s64(e, "started", tsl->started);
int tcp_read_timeout(int fd, void *buf, size_t len, int timeout);
-char *tcp_get_str_from_ip(const struct sockaddr *sa, char *dst, size_t maxlen);
+char *tcp_get_str_from_ip(const struct sockaddr_storage *sa, char *dst, size_t maxlen);
-struct sockaddr *tcp_get_ip_from_str(const char *str, struct sockaddr *sa);
+struct sockaddr_storage *tcp_get_ip_from_str(const char *str, struct sockaddr_storage *sa);
int tcp_socket_dead(int fd);
char buf[50];
uint32_t port;
- tcp_get_str_from_ip((struct sockaddr*)hc->hc_self, buf, 50);
+ tcp_get_str_from_ip(hc->hc_self, buf, 50);
if(hc->hc_self->ss_family == AF_INET)
port = ((struct sockaddr_in*)hc->hc_self)->sin_port;