From: Jaroslav Kysela Date: Sat, 8 Apr 2017 08:59:05 +0000 (+0200) Subject: replace 'struct sockaddr' with 'struct sockaddr_storage' X-Git-Tag: v4.2.1~19 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5cbaac172b4997fbf89667d79ac6e03b46460060;p=thirdparty%2Ftvheadend.git replace 'struct sockaddr' with 'struct sockaddr_storage' this really fatal problem caused stack overflows - detected by c-lang sanitizers --- diff --git a/src/access.c b/src/access.c index 060ae08e1..f24a573f4 100644 --- a/src/access.c +++ b/src/access.c @@ -331,13 +331,13 @@ access_destroy(access_t *a) * */ 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) { @@ -348,7 +348,7 @@ netmask_verify(struct access_ipmask_queue *ais, struct sockaddr *src) 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); @@ -364,7 +364,7 @@ netmask_verify(struct access_ipmask_queue *ais, struct sockaddr *src) 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; @@ -399,7 +399,7 @@ netmask_verify(struct access_ipmask_queue *ais, struct sockaddr *src) * */ static inline int -access_ip_blocked(struct sockaddr *src) +access_ip_blocked(struct sockaddr_storage *src) { ipblock_entry_t *ib; @@ -680,7 +680,7 @@ access_set_lang_ui(access_t *a) * */ 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; @@ -697,7 +697,7 @@ access_get(struct sockaddr *src, const char *username, verify_callback_t verify, 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); @@ -780,7 +780,7 @@ access_get_by_username(const char *username) * */ 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; diff --git a/src/access.h b/src/access.h index ed5bfebc9..95f0a620f 100644 --- a/src/access.h +++ b/src/access.h @@ -266,7 +266,7 @@ int access_verify_list(htsmsg_t *list, const char *item); */ 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); /** @@ -279,7 +279,7 @@ access_get_by_username(const char *username); * */ access_t * -access_get_by_addr(struct sockaddr *src); +access_get_by_addr(struct sockaddr_storage *src); /** * diff --git a/src/dvr/dvr_rec.c b/src/dvr/dvr_rec.c index 3dc174b83..7edd9932d 100644 --- a/src/dvr/dvr_rec.c +++ b/src/dvr/dvr_rec.c @@ -66,7 +66,7 @@ dvr_rec_subscribe(dvr_entry_t *de) 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; diff --git a/src/htsp_server.c b/src/htsp_server.c index 7f66dd8f5..e2d15f54a 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -811,7 +811,7 @@ htsp_build_channel(channel_t *ch, const char *method, htsp_connection_t *htsp) 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, @@ -2978,7 +2978,7 @@ htsp_authenticate(htsp_connection_t *htsp, htsmsg_t *m) 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) { @@ -3098,8 +3098,7 @@ htsp_read_loop(htsp_connection_t *htsp) 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, @@ -3266,7 +3265,7 @@ htsp_serve(int fd, void **opaque, struct sockaddr_storage *source, 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; diff --git a/src/http.c b/src/http.c index a228f92c5..6b0420473 100644 --- a/src/http.c +++ b/src/http.c @@ -863,7 +863,7 @@ http_access_verify(http_connection_t *hc, int mask) 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) @@ -899,7 +899,7 @@ http_access_verify_channel(http_connection_t *hc, int mask, 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) { @@ -1105,9 +1105,9 @@ process_request(http_connection_t *hc, htsbuf_queue_t *spill) 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; diff --git a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c index 8ff296be4..0c5aaee34 100644 --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c @@ -86,7 +86,7 @@ tvhdhomerun_device_class_get_title( idnode_t *in, const char *lang ) { 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; @@ -154,7 +154,7 @@ static const void * 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; } @@ -385,12 +385,10 @@ tvhdhomerun_device_discovery_thread( void *aux ) ((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); diff --git a/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c b/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c index 71d6c934b..20ca3492c 100644 --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c @@ -735,7 +735,7 @@ tvhdhomerun_frontend_create(tvhdhomerun_device_t *hd, struct hdhomerun_discover_ 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); diff --git a/src/satip/rtp.c b/src/satip/rtp.c index cb1fe984e..7d58d334c 100644 --- a/src/satip/rtp.c +++ b/src/satip/rtp.c @@ -359,7 +359,7 @@ satip_rtp_thread(void *aux) 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); @@ -883,7 +883,7 @@ satip_rtcp_thread(void *aux) 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) { @@ -897,7 +897,7 @@ satip_rtcp_thread(void *aux) } 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)); } diff --git a/src/satip/rtsp.c b/src/satip/rtsp.c index e061bdf23..4f3bf87ef 100644 --- a/src/satip/rtsp.c +++ b/src/satip/rtsp.c @@ -1541,7 +1541,7 @@ rtsp_serve(int fd, void **opaque, struct sockaddr_storage *peer, 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); diff --git a/src/satip/server.c b/src/satip/server.c index 4259405ee..9d503fe0d 100644 --- a/src/satip/server.c +++ b/src/satip/server.c @@ -367,7 +367,7 @@ CONFIGID.UPNP.ORG: 0\r\n" 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 ?: ""); } @@ -472,7 +472,7 @@ satips_upnp_discovery_received 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))); @@ -484,7 +484,7 @@ satips_upnp_discovery_received 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); @@ -777,7 +777,7 @@ static void satip_server_init_common(const char *prefix, int announce) 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)); } diff --git a/src/tcp.c b/src/tcp.c index f1cea9733..c675e093d 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -404,12 +404,12 @@ tcp_socket_dead(int fd) * */ 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); @@ -428,18 +428,18 @@ tcp_get_str_from_ip(const struct sockaddr *sa, char *dst, size_t 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 { @@ -830,7 +830,7 @@ void *tcp_server_create 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; @@ -867,7 +867,7 @@ tcp_server_create 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; } @@ -896,7 +896,7 @@ tcp_server_create 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 */ @@ -1074,7 +1074,7 @@ tcp_server_connections ( void ) 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); diff --git a/src/tcp.h b/src/tcp.h index 9d36fbd67..64463bb71 100644 --- a/src/tcp.h +++ b/src/tcp.h @@ -92,9 +92,9 @@ int tcp_write_queue(int fd, htsbuf_queue_t *q); 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); diff --git a/src/webui/comet.c b/src/webui/comet.c index 75c82b93c..705e2e6ab 100644 --- a/src/webui/comet.c +++ b/src/webui/comet.c @@ -211,7 +211,7 @@ comet_serverIpPort(http_connection_t *hc, comet_mailbox_t *cmb) 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;