From 37bc520db2046eed812bd985c3a847f3aa262506 Mon Sep 17 00:00:00 2001 From: switch_st Date: Wed, 22 Jul 2020 11:58:07 +0800 Subject: [PATCH] fix supernode coredump when accessing management socket --- src/sn_utils.c | 56 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/src/sn_utils.c b/src/sn_utils.c index 4ea34f6..6beedcd 100644 --- a/src/sn_utils.c +++ b/src/sn_utils.c @@ -15,6 +15,11 @@ static ssize_t sendto_sock(n2n_sn_t *sss, const uint8_t *pktbuf, size_t pktsize); +static int sendto_mgmt(n2n_sn_t *sss, + const struct sockaddr_in *sender_sock, + const uint8_t *mgmt_buf, + size_t mgmt_size); + static int try_broadcast(n2n_sn_t * sss, const struct sn_community *comm, const n2n_common_t * cmn, @@ -295,10 +300,11 @@ static int process_mgmt(n2n_sn_t *sss, char resbuf[N2N_SN_PKTBUF_SIZE]; size_t ressize = 0; uint32_t num_edges = 0; - ssize_t r; + uint32_t num = 0; struct sn_community *community, *tmp; struct peer_info * peer, *tmpPeer; macstr_t mac_buf; + n2n_sock_str_t sockbuf; traceEvent(TRACE_DEBUG, "process_mgmt"); @@ -346,32 +352,48 @@ static int process_mgmt(n2n_sn_t *sss, (long unsigned int)(now - sss->stats.last_reg_super)); ressize += snprintf(resbuf+ressize, N2N_SN_PKTBUF_SIZE-ressize, - "cur_cmnts"); + "cur_cmnts %u\n", HASH_COUNT(sss->communities)); HASH_ITER(hh, sss->communities, community, tmp) { - ressize += snprintf(resbuf+ressize, N2N_SN_PKTBUF_SIZE-ressize, - " [%s]", - community->community); + ressize += snprintf(resbuf + ressize, N2N_SN_PKTBUF_SIZE - ressize, + "community: %s\n", community->community); + sendto_mgmt(sss, sender_sock, resbuf, ressize); + ressize = 0; + + num = 0; HASH_ITER(hh, community->edges, peer, tmpPeer) { - ressize += snprintf(resbuf+ressize, N2N_SN_PKTBUF_SIZE-ressize, - " {%s}", - macaddr_str(mac_buf, peer->mac_addr)); + ressize += snprintf(resbuf + ressize, N2N_SN_PKTBUF_SIZE - ressize, + "\t[id: %u][MAC: %s][edge: %s][last seen: %lu sec ago]\n", + ++num, macaddr_str(mac_buf, peer->mac_addr), + sock_to_cstr(sockbuf, &(peer->sock)), now-peer->last_seen); + + sendto_mgmt(sss, sender_sock, resbuf, ressize); + ressize = 0; } } + ressize += snprintf(resbuf+ressize, N2N_SN_PKTBUF_SIZE-ressize, "\n"); - - r = sendto(sss->mgmt_sock, resbuf, ressize, 0 /*flags*/, - (struct sockaddr *)sender_sock, sizeof(struct sockaddr_in)); - - if (r <= 0) - { - ++(sss->stats.errors); - traceEvent(TRACE_ERROR, "process_mgmt : sendto failed. %s", strerror(errno)); - } + sendto_mgmt(sss, sender_sock, resbuf, ressize); return 0; } +static int sendto_mgmt(n2n_sn_t *sss, + const struct sockaddr_in *sender_sock, + const uint8_t *mgmt_buf, + size_t mgmt_size) +{ + ssize_t r = sendto(sss->mgmt_sock, mgmt_buf, mgmt_size, 0 /*flags*/, + (struct sockaddr *)sender_sock, sizeof (struct sockaddr_in)); + + if (r <= 0) { + ++(sss->stats.errors); + traceEvent (TRACE_ERROR, "process_mgmt : sendto failed. %s", strerror (errno)); + return -1; + } + return 0; +} + /** Examine a datagram and determine what to do with it. * */