this really fatal problem caused stack overflows - detected by c-lang sanitizers
*
*/
static int
-netmask_verify(access_entry_t *ae, struct sockaddr *src)
+netmask_verify(access_entry_t *ae, 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, &ae->ae_ipmasks, 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;
*/
int
access_verify(const char *username, const char *password,
- struct sockaddr *src, uint32_t mask)
+ struct sockaddr_storage *src, uint32_t mask)
{
uint32_t bits = 0;
access_entry_t *ae;
*
*/
access_t *
-access_get(const char *username, const char *password, struct sockaddr *src)
+access_get(const char *username, const char *password, struct sockaddr_storage *src)
{
access_t *a = calloc(1, sizeof(*a));
access_entry_t *ae;
a->aa_representative = strdup(username);
} else {
a->aa_representative = malloc(50);
- tcp_get_ip_str((struct sockaddr*)src, a->aa_representative, 50);
+ tcp_get_ip_str(src, a->aa_representative, 50);
}
if (access_noacl) {
*/
access_t *
access_get_hashed(const char *username, const uint8_t digest[20],
- const uint8_t *challenge, struct sockaddr *src)
+ const uint8_t *challenge, struct sockaddr_storage *src)
{
access_t *a = calloc(1, sizeof(*a));
access_entry_t *ae;
a->aa_representative = strdup(username);
} else {
a->aa_representative = malloc(50);
- tcp_get_ip_str((struct sockaddr*)src, a->aa_representative, 50);
+ tcp_get_ip_str(src, a->aa_representative, 50);
}
if(access_noacl) {
*
*/
access_t *
-access_get_by_addr(struct sockaddr *src)
+access_get_by_addr(struct sockaddr_storage *src)
{
access_t *a = calloc(1, sizeof(*a));
access_entry_t *ae;
* Return 0 if access is granted, -1 otherwise
*/
int access_verify(const char *username, const char *password,
- struct sockaddr *src, uint32_t mask);
+ struct sockaddr_storage *src, uint32_t mask);
static inline int access_verify2(access_t *a, uint32_t mask)
{ return (mask & ACCESS_OR) ?
* Get the access structure
*/
access_t *access_get(const char *username, const char *password,
- struct sockaddr *src);
+ struct sockaddr_storage *src);
/**
*
*/
access_t *
access_get_hashed(const char *username, const uint8_t digest[20],
- const uint8_t *challenge, struct sockaddr *src);
+ const uint8_t *challenge, struct sockaddr_storage *src);
/**
*
*/
access_t *
-access_get_by_addr(struct sockaddr *src);
+access_get_by_addr(struct sockaddr_storage *src);
/**
*
char buf[50];
addrlen = sizeof(addr);
getsockname(htsp->htsp_fd, (struct sockaddr*)&addr, &addrlen);
- tcp_get_ip_str((struct sockaddr*)&addr, buf, 50);
+ tcp_get_ip_str(&addr, buf, 50);
snprintf(url, sizeof(url), "http://%s%s%s:%d%s/%s",
(addr.ss_family == AF_INET6)?"[":"",
buf,
if(htsmsg_get_bin(m, "digest", &digest, &digestlen))
return 0;
- rights = access_get_hashed(username, digest, htsp->htsp_challenge,
- (struct sockaddr *)htsp->htsp_peer);
+ rights = access_get_hashed(username, digest, htsp->htsp_challenge, htsp->htsp_peer);
privgain = (rights->aa_rights |
htsp->htsp_granted_access->aa_rights) !=
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);
tcp_id = tcp_connection_launch(htsp->htsp_fd, htsp_server_status,
htsp->htsp_granted_access);
// Note: global_lock held on entry
- tcp_get_ip_str((struct sockaddr*)source, buf, 50);
+ tcp_get_ip_str(source, buf, 50);
memset(&htsp, 0, sizeof(htsp_connection_t));
*opaque = &htsp;
http_access_verify_ticket(hc);
if (hc->hc_access == NULL) {
- hc->hc_access = access_get(hc->hc_username, hc->hc_password,
- (struct sockaddr *)hc->hc_peer);
+ hc->hc_access = access_get(hc->hc_username, hc->hc_password, hc->hc_peer);
if (hc->hc_access == NULL)
return -1;
}
http_access_verify_ticket(hc);
if (hc->hc_access == NULL) {
- hc->hc_access = access_get(hc->hc_username, hc->hc_password,
- (struct sockaddr *)hc->hc_peer);
+ hc->hc_access = access_get(hc->hc_username, hc->hc_password, hc->hc_peer);
if (hc->hc_access == NULL)
return -1;
}
char authbuf[150];
hc->hc_url_orig = tvh_strdupa(hc->hc_url);
- tcp_get_ip_str((struct sockaddr*)hc->hc_peer, authbuf, sizeof(authbuf));
+ tcp_get_ip_str(hc->hc_peer, authbuf, sizeof(authbuf));
hc->hc_peer_ipstr = tvh_strdupa(authbuf);
hc->hc_representative = hc->hc_peer_ipstr;
hc->hc_username = NULL;
char peername[50];
int alive = 1, fatal = 0, r;
- tcp_get_ip_str((struct sockaddr *)&rtp->peer, peername, sizeof(peername));
+ tcp_get_ip_str(&rtp->peer, peername, sizeof(peername));
tvhdebug("satips", "RTP streaming to %s:%d open", peername, rtp->port);
pthread_mutex_lock(&sq->sq_mutex);
sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in));
if (r < 0) {
err = errno;
- tcp_get_ip_str((struct sockaddr*)&rtp->peer2, addrbuf, sizeof(addrbuf));
+ tcp_get_ip_str(&rtp->peer2, addrbuf, sizeof(addrbuf));
tvhwarn("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_ip_str((struct sockaddr *)peer, buf + strlen(buf), sizeof(buf) - strlen(buf));
+ tcp_get_ip_str(peer, buf + strlen(buf), sizeof(buf) - strlen(buf));
aa.aa_representative = buf;
tcp = tcp_connection_launch(fd, rtsp_stream_status, &aa);
return;
#if ENABLE_TRACE
- tcp_get_ip_str((struct sockaddr *)dst, buf, sizeof(buf));
+ tcp_get_ip_str(dst, buf, sizeof(buf));
tvhtrace("satips", "sending discover reply to %s:%d%s%s",
buf, IP_PORT(*dst), deviceid ? " device: " : "", deviceid ?: "");
#endif
return;
#if ENABLE_TRACE
- tcp_get_ip_str((struct sockaddr *)storage, buf2, sizeof(buf2));
+ tcp_get_ip_str(storage, buf2, sizeof(buf2));
tvhtrace("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_ip_str((struct sockaddr *)storage, buf2, sizeof(buf2));
+ tcp_get_ip_str(storage, buf2, sizeof(buf2));
tvhwarn("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);
tvherror("satips", "Unable to determine the HTTP/RTSP address");
return;
}
- tcp_get_ip_str((const struct sockaddr *)&http, http_ip, sizeof(http_ip));
+ tcp_get_ip_str(&http, http_ip, sizeof(http_ip));
http_server_ip = strdup(http_ip);
http_server_port = ntohs(IP_PORT(http));
*
*/
char *
-tcp_get_ip_str(const struct sockaddr *sa, char *s, size_t maxlen)
+tcp_get_ip_str(const struct sockaddr_storage *sa, char *s, size_t maxlen)
{
if(sa == NULL || s == NULL)
return NULL;
- switch(sa->sa_family)
+ switch(sa->ss_family)
{
case AF_INET:
inet_ntop(AF_INET, &(((struct sockaddr_in*)sa)->sin_addr), s, maxlen);
if (!tsl->status) continue;
c++;
e = htsmsg_create_map();
- tcp_get_ip_str((struct sockaddr*)&tsl->peer, buf, sizeof(buf));
+ tcp_get_ip_str(&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_ip_str(const struct sockaddr *sa, char *s, size_t maxlen);
+char *tcp_get_ip_str(const struct sockaddr_storage *sa, char *s, size_t maxlen);
struct access;
char buf[50];
uint32_t port;
- tcp_get_ip_str((struct sockaddr*)hc->hc_self, buf, 50);
+ tcp_get_ip_str(hc->hc_self, buf, 50);
if(hc->hc_self->ss_family == AF_INET)
port = ((struct sockaddr_in*)hc->hc_self)->sin_port;