From 98e9dc065ff9f863d1e53264bb770d0a9c3954a9 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Mon, 29 Aug 2011 14:20:36 +0000 Subject: [PATCH] - handle_pong used wrong address size - TODO: GNUNET_ATS_address_update crashes transport service --- .../gnunet-service-transport_validation.c | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/transport/gnunet-service-transport_validation.c b/src/transport/gnunet-service-transport_validation.c index 8b652ceaa..db6cfabe8 100644 --- a/src/transport/gnunet-service-transport_validation.c +++ b/src/transport/gnunet-service-transport_validation.c @@ -889,10 +889,11 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender, { const struct TransportPongMessage *pong; struct ValidationEntry *ve; + const char *tname; const char *addr; - const char *addrend; - size_t alen; + size_t addrlen; size_t slen; + size_t size; uint32_t rdelay; struct GNUNET_TIME_Relative delay; struct GNUNET_HELLO_Message *hello; @@ -905,19 +906,22 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender, GNUNET_STATISTICS_update (GST_stats, gettext_noop ("# PONG messages received"), 1, GNUNET_NO); + pong = (const struct TransportPongMessage *) hdr; - addr = (const char *) &pong[1]; - alen = ntohs (hdr->size) - sizeof (struct TransportPongMessage); - addrend = memchr (addr, '\0', alen); - if (NULL == addrend) + tname = (const char *) &pong[1]; + size = ntohs (hdr->size) - sizeof (struct TransportPongMessage); + addr = memchr (tname, '\0', size); + if (NULL == addr) { GNUNET_break_op (0); return; } - addrend++; - slen = strlen (addr); - alen -= slen; - ve = find_validation_entry (NULL, sender, addr, addrend, alen); + addr++; + slen = strlen (tname) + 1; + addrlen = size - slen; + + ve = find_validation_entry (NULL, sender, tname, addr, addrlen); + if (NULL == ve) { GNUNET_STATISTICS_update (GST_stats, @@ -951,9 +955,17 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender, return; } +#if VERBOSE_VALIDATION + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Address validated for peer `%s' with plugin `%s': `%s'\n", + GNUNET_i2s (sender), tname, GST_plugins_a2s (tname, addr, + addrlen)); +#endif + /* validity achieved, remember it! */ ve->valid_until = GNUNET_TIME_relative_to_absolute (HELLO_ADDRESS_EXPIRATION); - GNUNET_ATS_address_update (GST_ats, &ve->pid, ve->valid_until, ve->transport_name, NULL, ve->addr, ve->addrlen, NULL, 0); /* FIXME: compute and add latency here... */ + // FIXME: This crashes transport service + // GNUNET_ATS_address_update (GST_ats, &ve->pid, ve->valid_until, ve->transport_name, NULL, ve->addr, ve->addrlen, NULL, 0); /* FIXME: compute and add latency here... */ /* build HELLO to store in PEERINFO */ hello = GNUNET_HELLO_create (&ve->public_key, &add_valid_peer_address, ve); -- 2.25.1