From 901d3f2df5795415ae833315b9f510597992da45 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 1 Dec 2010 09:23:14 +0000 Subject: [PATCH] fixing iteration code to handle ATS structs --- src/core/core_api_iterate_peers.c | 33 ++++++++++++++++++++++--------- src/core/gnunet-service-core.c | 2 +- src/include/gnunet_protocols.h | 5 +++++ 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/core/core_api_iterate_peers.c b/src/core/core_api_iterate_peers.c index 657768363..d1c3828bb 100644 --- a/src/core/core_api_iterate_peers.c +++ b/src/core/core_api_iterate_peers.c @@ -67,12 +67,14 @@ receive_info (void *cls, { struct GNUNET_CORE_RequestContext *request_context = cls; const struct ConnectNotifyMessage *connect_message; - + uint32_t ats_count; + uint16_t msize; /* Handle last message or error case, disconnect and clean up */ + msize = ntohs (msg->size); if ( (msg == NULL) || - ((ntohs (msg->type) == GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT) && - (ntohs (msg->size) == sizeof (struct GNUNET_MessageHeader))) ) + ((ntohs (msg->type) == GNUNET_MESSAGE_TYPE_CORE_ITERATE_PEERS_END) && + (msize == sizeof (struct GNUNET_MessageHeader))) ) { if (request_context->peer_cb != NULL) request_context->peer_cb (request_context->cb_cls, @@ -84,7 +86,7 @@ receive_info (void *cls, /* Handle incorrect message type or size, disconnect and clean up */ if ( (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT) || - (ntohs (msg->size) != sizeof (struct ConnectNotifyMessage)) ) + (msize < sizeof (struct ConnectNotifyMessage)) ) { GNUNET_break (0); if (request_context->peer_cb != NULL) @@ -94,15 +96,28 @@ receive_info (void *cls, GNUNET_free (request_context); return; } - - /* Normal case */ connect_message = (const struct ConnectNotifyMessage *) msg; + ats_count = ntohl (connect_message->ats_count); + if ( (msize != sizeof (struct ConnectNotifyMessage) + ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information)) || + (GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR != ntohl ((&connect_message->ats)[ats_count].type)) ) + { + GNUNET_break (0); + if (request_context->peer_cb != NULL) + request_context->peer_cb (request_context->cb_cls, + NULL, NULL); + GNUNET_CLIENT_disconnect (request_context->client, GNUNET_NO); + GNUNET_free (request_context); + return; + } + /* Normal case */ if (request_context->peer_cb != NULL) request_context->peer_cb (request_context->cb_cls, &connect_message->peer, - NULL); - - GNUNET_CLIENT_receive(request_context->client, &receive_info, request_context, GNUNET_TIME_relative_get_forever()); + &connect_message->ats); + GNUNET_CLIENT_receive(request_context->client, + &receive_info, + request_context, + GNUNET_TIME_UNIT_FOREVER_REL); } /** diff --git a/src/core/gnunet-service-core.c b/src/core/gnunet-service-core.c index 36bcebc2e..f27ed134a 100644 --- a/src/core/gnunet-service-core.c +++ b/src/core/gnunet-service-core.c @@ -1452,7 +1452,7 @@ handle_client_iterate_peers (void *cls, n = n->next; } done_msg.size = htons (sizeof (struct GNUNET_MessageHeader)); - done_msg.type = htons (GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT); + done_msg.type = htons (GNUNET_MESSAGE_TYPE_CORE_ITERATE_PEERS_END); GNUNET_SERVER_transmit_context_append_message (tc, &done_msg); GNUNET_SERVER_transmit_context_run (tc, GNUNET_TIME_UNIT_FOREVER_REL); diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h index 5f54cddec..96e709456 100644 --- a/src/include/gnunet_protocols.h +++ b/src/include/gnunet_protocols.h @@ -382,6 +382,11 @@ extern "C" */ #define GNUNET_MESSAGE_TYPE_CORE_ITERATE_PEERS 78 +/** + * Last reply from core to request for peer iteration from CORE service. + */ +#define GNUNET_MESSAGE_TYPE_CORE_ITERATE_PEERS_END 79 + /** * Session key exchange between peers. */ -- 2.25.1