aboutsummaryrefslogtreecommitdiff
path: root/src/ats
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-06-19 09:39:06 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-06-19 09:39:06 +0000
commit0c496375af3da708e2e68d5019e96f42c96ac8a7 (patch)
treea239fe7c3a78370435aa728a9bddf54bd22cb0d9 /src/ats
parent891930bd279a11269d8e7443429b7ef604f8691f (diff)
downloadgnunet-0c496375af3da708e2e68d5019e96f42c96ac8a7.tar.gz
gnunet-0c496375af3da708e2e68d5019e96f42c96ac8a7.zip
fix a major bug: delete session for unknown address (addr==NULL, length==0)
Diffstat (limited to 'src/ats')
-rw-r--r--src/ats/gnunet-service-ats_addresses.c58
1 files changed, 44 insertions, 14 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index 2a15d922f..8667977e9 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -223,35 +223,65 @@ compare_address_it (void *cls, const struct GNUNET_HashCode * key, void *value)
223{ 223{
224 struct CompareAddressContext *cac = cls; 224 struct CompareAddressContext *cac = cls;
225 struct ATS_Address *aa = value; 225 struct ATS_Address *aa = value;
226/*
227 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
228 "Comparing to: %s %s %u session %u\n",
229 GNUNET_i2s (&aa->peer), aa->plugin, aa->addr_len, aa->session_id);
230 226
231*/ 227 /* Find an matching exact address:
232 /* find an exact matching address: aa->addr == cac->search->addr && aa->session == cac->search->session */ 228 *
229 * Compare by:
230 * aa->addr_len == cac->search->addr_len
231 * aa->plugin == cac->search->plugin
232 * aa->addr == cac->search->addr
233 * aa->session == cac->search->session
234 *
235 * return as exact address
236 */
233 if ((aa->addr_len == cac->search->addr_len) && (0 == strcmp (aa->plugin, cac->search->plugin))) 237 if ((aa->addr_len == cac->search->addr_len) && (0 == strcmp (aa->plugin, cac->search->plugin)))
234 { 238 {
235 if ((0 == memcmp (aa->addr, cac->search->addr, aa->addr_len)) && (aa->session_id == cac->search->session_id)) 239 if ((0 == memcmp (aa->addr, cac->search->addr, aa->addr_len)) && (aa->session_id == cac->search->session_id))
236 {
237 cac->exact_address = aa; 240 cac->exact_address = aa;
238 }
239 } 241 }
240 242
241 /* find an matching address: aa->addr == cac->search->addr && aa->session == 0 */ 243 /* Find an matching base address:
242 /* this address can be used to be updated */ 244 *
245 * Properties:
246 *
247 * aa->session_id == 0
248 *
249 * Compare by:
250 * aa->addr_len == cac->search->addr_len
251 * aa->plugin == cac->search->plugin
252 * aa->addr == cac->search->addr
253 *
254 * return as base address
255 */
243 if ((aa->addr_len == cac->search->addr_len) && (0 == strcmp (aa->plugin, cac->search->plugin))) 256 if ((aa->addr_len == cac->search->addr_len) && (0 == strcmp (aa->plugin, cac->search->plugin)))
244 { 257 {
245 if ((0 == memcmp (aa->addr, cac->search->addr, aa->addr_len)) && (aa->session_id == 0)) 258 if ((0 == memcmp (aa->addr, cac->search->addr, aa->addr_len)) && (aa->session_id == 0))
246 {
247 cac->base_address = aa; 259 cac->base_address = aa;
248 } 260 }
261
262 /* Find an matching exact address based on session:
263 *
264 * Properties:
265 *
266 * cac->search->addr_len == 0
267 * cac->addr == NULL
268 *
269 * Compare by:
270 * aa->plugin == cac->search->plugin
271 * aa->session_id == cac->search->session_id
272 *
273 * return as exact address
274 */
275 if ((0 == cac->search->addr_len) && (NULL == cac->search->addr))
276 {
277 if ((0 == strcmp (aa->plugin, cac->search->plugin)) && (aa->session_id == cac->search->session_id))
278 cac->exact_address = aa;
249 } 279 }
250 280
251 if (cac->exact_address == NULL) 281 if (cac->exact_address == NULL)
252 return GNUNET_YES; 282 return GNUNET_YES; /* Continue iteration to find exact address */
253 else 283 else
254 return GNUNET_NO; 284 return GNUNET_NO; /* Stop iteration since we have an exact address */
255} 285}
256 286
257 287