aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-service-transport_validation.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2011-08-29 14:20:36 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2011-08-29 14:20:36 +0000
commit98e9dc065ff9f863d1e53264bb770d0a9c3954a9 (patch)
treea1763a75e000890c5cfbf4a268081c9a32a08673 /src/transport/gnunet-service-transport_validation.c
parentfe4798e8542441278c364c469384caa7635f36c5 (diff)
downloadgnunet-98e9dc065ff9f863d1e53264bb770d0a9c3954a9.tar.gz
gnunet-98e9dc065ff9f863d1e53264bb770d0a9c3954a9.zip
- handle_pong used wrong address size
- TODO: GNUNET_ATS_address_update crashes transport service
Diffstat (limited to 'src/transport/gnunet-service-transport_validation.c')
-rw-r--r--src/transport/gnunet-service-transport_validation.c34
1 files 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,
889{ 889{
890 const struct TransportPongMessage *pong; 890 const struct TransportPongMessage *pong;
891 struct ValidationEntry *ve; 891 struct ValidationEntry *ve;
892 const char *tname;
892 const char *addr; 893 const char *addr;
893 const char *addrend; 894 size_t addrlen;
894 size_t alen;
895 size_t slen; 895 size_t slen;
896 size_t size;
896 uint32_t rdelay; 897 uint32_t rdelay;
897 struct GNUNET_TIME_Relative delay; 898 struct GNUNET_TIME_Relative delay;
898 struct GNUNET_HELLO_Message *hello; 899 struct GNUNET_HELLO_Message *hello;
@@ -905,19 +906,22 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
905 GNUNET_STATISTICS_update (GST_stats, 906 GNUNET_STATISTICS_update (GST_stats,
906 gettext_noop ("# PONG messages received"), 1, 907 gettext_noop ("# PONG messages received"), 1,
907 GNUNET_NO); 908 GNUNET_NO);
909
908 pong = (const struct TransportPongMessage *) hdr; 910 pong = (const struct TransportPongMessage *) hdr;
909 addr = (const char *) &pong[1]; 911 tname = (const char *) &pong[1];
910 alen = ntohs (hdr->size) - sizeof (struct TransportPongMessage); 912 size = ntohs (hdr->size) - sizeof (struct TransportPongMessage);
911 addrend = memchr (addr, '\0', alen); 913 addr = memchr (tname, '\0', size);
912 if (NULL == addrend) 914 if (NULL == addr)
913 { 915 {
914 GNUNET_break_op (0); 916 GNUNET_break_op (0);
915 return; 917 return;
916 } 918 }
917 addrend++; 919 addr++;
918 slen = strlen (addr); 920 slen = strlen (tname) + 1;
919 alen -= slen; 921 addrlen = size - slen;
920 ve = find_validation_entry (NULL, sender, addr, addrend, alen); 922
923 ve = find_validation_entry (NULL, sender, tname, addr, addrlen);
924
921 if (NULL == ve) 925 if (NULL == ve)
922 { 926 {
923 GNUNET_STATISTICS_update (GST_stats, 927 GNUNET_STATISTICS_update (GST_stats,
@@ -951,9 +955,17 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
951 return; 955 return;
952 } 956 }
953 957
958#if VERBOSE_VALIDATION
959 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
960 "Address validated for peer `%s' with plugin `%s': `%s'\n",
961 GNUNET_i2s (sender), tname, GST_plugins_a2s (tname, addr,
962 addrlen));
963#endif
964
954 /* validity achieved, remember it! */ 965 /* validity achieved, remember it! */
955 ve->valid_until = GNUNET_TIME_relative_to_absolute (HELLO_ADDRESS_EXPIRATION); 966 ve->valid_until = GNUNET_TIME_relative_to_absolute (HELLO_ADDRESS_EXPIRATION);
956 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... */ 967 // FIXME: This crashes transport service
968 // 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... */
957 969
958 /* build HELLO to store in PEERINFO */ 970 /* build HELLO to store in PEERINFO */
959 hello = GNUNET_HELLO_create (&ve->public_key, &add_valid_peer_address, ve); 971 hello = GNUNET_HELLO_create (&ve->public_key, &add_valid_peer_address, ve);