aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2011-10-13 20:14:22 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2011-10-13 20:14:22 +0000
commit2a726953f6afa9208188ddd39a922f4ad48bb1e4 (patch)
tree0e76e49c61e256fb479a14e0d0917e5961a1431e
parent97f256b095a75efb960c4d3a9a5188ffc35422cf (diff)
downloadgnunet-2a726953f6afa9208188ddd39a922f4ad48bb1e4.tar.gz
gnunet-2a726953f6afa9208188ddd39a922f4ad48bb1e4.zip
-rw-r--r--src/ats/gnunet-service-ats.c48
1 files changed, 43 insertions, 5 deletions
diff --git a/src/ats/gnunet-service-ats.c b/src/ats/gnunet-service-ats.c
index 36df715f1..db175964c 100644
--- a/src/ats/gnunet-service-ats.c
+++ b/src/ats/gnunet-service-ats.c
@@ -70,7 +70,7 @@ static struct ATS_Clients *ac_tail;
70 70
71static struct GNUNET_CONTAINER_MultiHashMap * addresses; 71static struct GNUNET_CONTAINER_MultiHashMap * addresses;
72 72
73int address_it (void *cls, 73int free_address_it (void *cls,
74 const GNUNET_HashCode * key, 74 const GNUNET_HashCode * key,
75 void *value) 75 void *value)
76{ 76{
@@ -79,6 +79,28 @@ int address_it (void *cls,
79 return GNUNET_OK; 79 return GNUNET_OK;
80} 80}
81 81
82struct CompareAddressContext
83{
84 struct ATS_Address * search;
85 struct ATS_Address * result;
86};
87
88int compare_address_it (void *cls,
89 const GNUNET_HashCode * key,
90 void *value)
91{
92 struct CompareAddressContext * cac = cls;
93 struct ATS_Address * aa = (struct ATS_Address *) value;
94 if (0 == strcmp(aa->plugin, cac->search->plugin))
95 {
96 if ((aa->addr_len == cac->search->addr_len) &&
97 (0 == memcmp (aa->addr, cac->search->addr, aa->addr_len)))
98 cac->result = aa;
99 return GNUNET_NO;
100 }
101 return GNUNET_YES;
102}
103
82/** 104/**
83 * Task run during shutdown. 105 * Task run during shutdown.
84 * 106 *
@@ -97,7 +119,7 @@ cleanup_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
97 GNUNET_free (t); 119 GNUNET_free (t);
98 } 120 }
99 121
100 GNUNET_CONTAINER_multihashmap_iterate (addresses, address_it, NULL); 122 GNUNET_CONTAINER_multihashmap_iterate (addresses, free_address_it, NULL);
101 123
102 GNUNET_CONTAINER_multihashmap_destroy (addresses); 124 GNUNET_CONTAINER_multihashmap_destroy (addresses);
103} 125}
@@ -156,13 +178,25 @@ handle_address_update (void *cls, struct GNUNET_SERVER_Client *client,
156 char *pm; 178 char *pm;
157 179
158 size_t size = ntohs (msg->header.size); 180 size_t size = ntohs (msg->header.size);
159 if (size <= sizeof (struct AddressUpdateMessage)) 181 if ((size <= sizeof (struct AddressUpdateMessage)) || (size >= GNUNET_SERVER_MAX_MESSAGE_SIZE))
160 GNUNET_break (0); 182 {
183 GNUNET_break (0);
184 return;
185 }
161 186
162 size_t ats_count = ntohs (msg->ats_count); 187 size_t ats_count = ntohs (msg->ats_count);
163 size_t addr_len = ntohs (msg->address_length); 188 size_t addr_len = ntohs (msg->address_length);
164 size_t plugin_len = ntohs (msg->plugin_name_length) + 1 ; 189 size_t plugin_len = ntohs (msg->plugin_name_length) + 1 ;
165 190
191 if (
192 (plugin_len >= GNUNET_SERVER_MAX_MESSAGE_SIZE) ||
193 (addr_len >= GNUNET_SERVER_MAX_MESSAGE_SIZE) ||
194 (addr_len >= GNUNET_SERVER_MAX_MESSAGE_SIZE / sizeof (struct GNUNET_TRANSPORT_ATS_Information)) )
195 {
196 GNUNET_break (0);
197 return;
198 }
199
166 struct ATS_Address * aa = GNUNET_malloc (sizeof (struct ATS_Address) + 200 struct ATS_Address * aa = GNUNET_malloc (sizeof (struct ATS_Address) +
167 ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information) + 201 ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information) +
168 addr_len + 202 addr_len +
@@ -192,7 +226,11 @@ handle_address_destroyed (void *cls, struct GNUNET_SERVER_Client *client,
192{ 226{
193 // struct AddressDestroyedMessage * msg = (struct AddressDestroyedMessage *) message; 227 // struct AddressDestroyedMessage * msg = (struct AddressDestroyedMessage *) message;
194 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ADDRESS_DESTROYED"); 228 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ADDRESS_DESTROYED");
195 229/*
230 struct GNUNET_PeerIdentity *peer = &msg->peer;
231 struct ATS_Address * aa = find_address_by_addr (peer);
232 GNUNET_CONTAINER_multihashmap_remove(addresses, peer, aa);
233 GNUNET_free (aa);*/
196} 234}
197 235
198static void 236static void