diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2011-10-13 20:14:22 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2011-10-13 20:14:22 +0000 |
commit | 2a726953f6afa9208188ddd39a922f4ad48bb1e4 (patch) | |
tree | 0e76e49c61e256fb479a14e0d0917e5961a1431e /src/ats/gnunet-service-ats.c | |
parent | 97f256b095a75efb960c4d3a9a5188ffc35422cf (diff) | |
download | gnunet-2a726953f6afa9208188ddd39a922f4ad48bb1e4.tar.gz gnunet-2a726953f6afa9208188ddd39a922f4ad48bb1e4.zip |
Diffstat (limited to 'src/ats/gnunet-service-ats.c')
-rw-r--r-- | src/ats/gnunet-service-ats.c | 48 |
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 | ||
71 | static struct GNUNET_CONTAINER_MultiHashMap * addresses; | 71 | static struct GNUNET_CONTAINER_MultiHashMap * addresses; |
72 | 72 | ||
73 | int address_it (void *cls, | 73 | int 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 | ||
82 | struct CompareAddressContext | ||
83 | { | ||
84 | struct ATS_Address * search; | ||
85 | struct ATS_Address * result; | ||
86 | }; | ||
87 | |||
88 | int 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 | ||
198 | static void | 236 | static void |