]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
replace 'struct sockaddr' with 'struct sockaddr_storage'
authorJaroslav Kysela <perex@perex.cz>
Sat, 8 Apr 2017 08:59:05 +0000 (10:59 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sat, 8 Apr 2017 08:59:07 +0000 (10:59 +0200)
this really fatal problem caused stack overflows - detected by c-lang sanitizers

13 files changed:
src/access.c
src/access.h
src/dvr/dvr_rec.c
src/htsp_server.c
src/http.c
src/input/mpegts/tvhdhomerun/tvhdhomerun.c
src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c
src/satip/rtp.c
src/satip/rtsp.c
src/satip/server.c
src/tcp.c
src/tcp.h
src/webui/comet.c

index 060ae08e191187eb3c1586c425d23de71b453f70..f24a573f4e89a81597d0751a353c95ce305a8c38 100644 (file)
@@ -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;
index ed5bfebc9428e11b7dc7de32725dda1fc04fe7ea..95f0a620f1ae2dcebe7f5248d704f199f92546ee 100644 (file)
@@ -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);
 
 /**
  *
index 3dc174b83637cd89b4ed46a20c62f6de4709fbda..7edd9932d39c75fb663fd724b4f912b0dbc4a3fd 100644 (file)
@@ -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;
index 7f66dd8f526ff69ed2b762b73e4357ed9cbe8e13..e2d15f54a0125cee71a9f1e1773740675e5b805b 100644 (file)
@@ -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;
index a228f92c5938f7a407abc8f50dd4c9a98a78db0a..6b0420473a95aee7d3e5f8cc8b4a077ad1a25a19 100644 (file)
@@ -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;
index 8ff296be4e0b0c69c28a600772d0a03e21baf614..0c5aaee34360dde449af8b781f39dbb6a1a73cf5 100644 (file)
@@ -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);
index 71d6c934bd21a7a6fd0cac33bad6746db616e114..20ca3492c3dbedce325804e47dcbeb352501381b 100644 (file)
@@ -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);
index cb1fe984ef56ba27d40dde4cffe2e402b1e2c588..7d58d334c78be87a1aa11be21111879ef7ce1e5a 100644 (file)
@@ -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));
       }
index e061bdf23f30ea3177beaed14a685f80fbb1fec4..4f3bf87ef28aae07ba433dc34fba2ed086020057 100644 (file)
@@ -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);
index 4259405eef78b0ad70b06d247e294e50f1463e02..9d503fe0dab0c1a0e7f613c828cb15e0e0894338 100644 (file)
@@ -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));
   }
index f1cea9733c5dc75476bde6d6066c9ed6375123c3..c675e093d45c2c7404c5b6c13e100b8093bf6aad 100644 (file)
--- 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);
index 9d36fbd67c5a4b1cb39b498a536601348424fce2..64463bb71f5270d042d8283b0d4450f00a8980e4 100644 (file)
--- 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);
 
index 75c82b93ca8b43948b98edb0e2baad621cc72aba..705e2e6abbcb5024caf54251bddb6706ae15ec87 100644 (file)
@@ -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;