diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-06-23 10:57:02 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-06-23 10:57:02 +0000 |
commit | 2a988c01cffe975a527995e25891da895b7b02ef (patch) | |
tree | 89c7ba489a2228351dce450f1489b690de221ae3 /src/peerinfo | |
parent | e386b0559c9dce3bf4ff382c37ff72ffe7850de4 (diff) | |
download | gnunet-2a988c01cffe975a527995e25891da895b7b02ef.tar.gz gnunet-2a988c01cffe975a527995e25891da895b7b02ef.zip |
possibly fixing leak at #1700/4451
Diffstat (limited to 'src/peerinfo')
-rw-r--r-- | src/peerinfo/peerinfo_api.c | 68 |
1 files changed, 22 insertions, 46 deletions
diff --git a/src/peerinfo/peerinfo_api.c b/src/peerinfo/peerinfo_api.c index 4db776b55..b6ccdfd07 100644 --- a/src/peerinfo/peerinfo_api.c +++ b/src/peerinfo/peerinfo_api.c | |||
@@ -272,28 +272,22 @@ do_transmit (void *cls, size_t size, void *buf) | |||
272 | size_t ret; | 272 | size_t ret; |
273 | 273 | ||
274 | h->th = NULL; | 274 | h->th = NULL; |
275 | if (tqe == NULL) | ||
276 | return 0; | ||
275 | if (buf == NULL) | 277 | if (buf == NULL) |
276 | { | 278 | { |
277 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, | 279 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK, |
278 | _("Failed to transmit message to `%s' service.\n"), | 280 | _("Failed to transmit message to `%s' service.\n"), |
279 | "PEERINFO"); | 281 | "PEERINFO"); |
280 | if (tqe != NULL) | 282 | GNUNET_CONTAINER_DLL_remove (h->tq_head, |
281 | GNUNET_CONTAINER_DLL_remove (h->tq_head, | 283 | h->tq_tail, |
282 | h->tq_tail, | 284 | tqe); |
283 | tqe); | ||
284 | reconnect (h); | 285 | reconnect (h); |
285 | if (tqe != NULL) | 286 | if (tqe->cont != NULL) |
286 | { | 287 | tqe->cont (tqe->cont_cls, GNUNET_SYSERR); |
287 | if (tqe->cont != NULL) | 288 | GNUNET_free (tqe); |
288 | tqe->cont (tqe->cont_cls, GNUNET_SYSERR); | ||
289 | GNUNET_free (tqe); | ||
290 | } | ||
291 | return 0; | 289 | return 0; |
292 | } | 290 | } |
293 | /* If it can be NULL above, it can be NULL here to... */ | ||
294 | if (tqe == NULL) | ||
295 | return 0; | ||
296 | |||
297 | ret = tqe->size; | 291 | ret = tqe->size; |
298 | GNUNET_assert (size >= ret); | 292 | GNUNET_assert (size >= ret); |
299 | memcpy (buf, &tqe[1], ret); | 293 | memcpy (buf, &tqe[1], ret); |
@@ -445,17 +439,12 @@ peerinfo_handler (void *cls, | |||
445 | ic->h->in_receive = GNUNET_NO; | 439 | ic->h->in_receive = GNUNET_NO; |
446 | if (msg == NULL) | 440 | if (msg == NULL) |
447 | { | 441 | { |
448 | char *err_msg; | ||
449 | GNUNET_asprintf(&err_msg, | ||
450 | _("Failed to receive response from `%s' service."), | ||
451 | "PEERINFO"); | ||
452 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%s\n", err_msg); | ||
453 | reconnect (ic->h); | 442 | reconnect (ic->h); |
454 | if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) | 443 | if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) |
455 | GNUNET_SCHEDULER_cancel (ic->timeout_task); | 444 | GNUNET_SCHEDULER_cancel (ic->timeout_task); |
456 | if (ic->callback != NULL) | 445 | if (ic->callback != NULL) |
457 | ic->callback (ic->callback_cls, NULL, NULL, err_msg); | 446 | ic->callback (ic->callback_cls, NULL, NULL, |
458 | GNUNET_free (err_msg); | 447 | _("Failed to receive response from `PEERINFO' service.")); |
459 | GNUNET_free (ic); | 448 | GNUNET_free (ic); |
460 | return; | 449 | return; |
461 | } | 450 | } |
@@ -478,16 +467,13 @@ peerinfo_handler (void *cls, | |||
478 | if ((ms < sizeof (struct InfoMessage)) || | 467 | if ((ms < sizeof (struct InfoMessage)) || |
479 | (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_PEERINFO_INFO)) | 468 | (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_PEERINFO_INFO)) |
480 | { | 469 | { |
481 | char * err_msg; | ||
482 | GNUNET_asprintf(&err_msg,_("Received invalid message from `%s' service.\n"),"PEERINFO"); | ||
483 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,err_msg); | ||
484 | GNUNET_break (0); | 470 | GNUNET_break (0); |
485 | reconnect (ic->h); | 471 | reconnect (ic->h); |
486 | if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) | 472 | if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) |
487 | GNUNET_SCHEDULER_cancel (ic->timeout_task); | 473 | GNUNET_SCHEDULER_cancel (ic->timeout_task); |
488 | if (ic->callback != NULL) | 474 | if (ic->callback != NULL) |
489 | ic->callback (ic->callback_cls, NULL, NULL, err_msg); | 475 | ic->callback (ic->callback_cls, NULL, NULL, |
490 | GNUNET_free (err_msg); | 476 | _("Received invalid message from `PEERINFO' service.\n")); |
491 | GNUNET_free (ic); | 477 | GNUNET_free (ic); |
492 | return; | 478 | return; |
493 | } | 479 | } |
@@ -499,18 +485,14 @@ peerinfo_handler (void *cls, | |||
499 | hello = (const struct GNUNET_HELLO_Message *) &im[1]; | 485 | hello = (const struct GNUNET_HELLO_Message *) &im[1]; |
500 | if (ms != sizeof (struct InfoMessage) + GNUNET_HELLO_size (hello)) | 486 | if (ms != sizeof (struct InfoMessage) + GNUNET_HELLO_size (hello)) |
501 | { | 487 | { |
502 | char * err_msg; | ||
503 | GNUNET_asprintf (&err_msg, | ||
504 | _("Received invalid message from `%s' service.\n"), | ||
505 | "PEERINFO"); | ||
506 | GNUNET_break (0); | 488 | GNUNET_break (0); |
507 | reconnect (ic->h); | 489 | reconnect (ic->h); |
508 | if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) | 490 | if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) |
509 | GNUNET_SCHEDULER_cancel (ic->timeout_task); | 491 | GNUNET_SCHEDULER_cancel (ic->timeout_task); |
510 | if (ic->callback != NULL) | 492 | if (ic->callback != NULL) |
511 | ic->callback (ic->callback_cls, NULL, NULL, err_msg); | 493 | ic->callback (ic->callback_cls, NULL, NULL, |
494 | _("Received invalid message from `PEERINFO' service.\n")); | ||
512 | GNUNET_free (ic); | 495 | GNUNET_free (ic); |
513 | GNUNET_free (err_msg); | ||
514 | return; | 496 | return; |
515 | } | 497 | } |
516 | } | 498 | } |
@@ -547,9 +529,6 @@ iterator_start_receive (void *cls, | |||
547 | 529 | ||
548 | if (GNUNET_OK != transmit_success) | 530 | if (GNUNET_OK != transmit_success) |
549 | { | 531 | { |
550 | char * err_msg; | ||
551 | GNUNET_asprintf(&err_msg,_("Failed to transmit iteration request to `%s' service (%d).\n"),"PEERINFO",transmit_success); | ||
552 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING,err_msg); | ||
553 | if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) | 532 | if (ic->timeout_task != GNUNET_SCHEDULER_NO_TASK) |
554 | { | 533 | { |
555 | GNUNET_SCHEDULER_cancel (ic->timeout_task); | 534 | GNUNET_SCHEDULER_cancel (ic->timeout_task); |
@@ -557,8 +536,8 @@ iterator_start_receive (void *cls, | |||
557 | } | 536 | } |
558 | reconnect (ic->h); | 537 | reconnect (ic->h); |
559 | if (ic->callback != NULL) | 538 | if (ic->callback != NULL) |
560 | ic->callback (ic->callback_cls, NULL, NULL, err_msg); | 539 | ic->callback (ic->callback_cls, NULL, NULL, |
561 | GNUNET_free (err_msg); | 540 | _("Failed to transmit iteration request to `PEERINFO' service\n")); |
562 | GNUNET_free (ic); | 541 | GNUNET_free (ic); |
563 | return; | 542 | return; |
564 | } | 543 | } |
@@ -588,21 +567,19 @@ signal_timeout (void *cls, | |||
588 | const struct GNUNET_SCHEDULER_TaskContext *tc) | 567 | const struct GNUNET_SCHEDULER_TaskContext *tc) |
589 | { | 568 | { |
590 | struct GNUNET_PEERINFO_IteratorContext *ic = cls; | 569 | struct GNUNET_PEERINFO_IteratorContext *ic = cls; |
591 | char * err_msg; | ||
592 | |||
593 | GNUNET_asprintf(&err_msg,_("Timeout transmitting iteration request to `%s' service.\n"), | ||
594 | "PEERINFO"); | ||
595 | 570 | ||
596 | ic->timeout_task = GNUNET_SCHEDULER_NO_TASK; | 571 | ic->timeout_task = GNUNET_SCHEDULER_NO_TASK; |
597 | if (! ic->in_receive) | 572 | if (! ic->in_receive) |
598 | GNUNET_CONTAINER_DLL_remove (ic->h->tq_head, | 573 | GNUNET_CONTAINER_DLL_remove (ic->h->tq_head, |
599 | ic->h->tq_tail, | 574 | ic->h->tq_tail, |
600 | ic->tqe); | 575 | ic->tqe); |
601 | reconnect (ic->h); | 576 | else |
602 | ic->callback (ic->callback_cls, NULL, NULL, err_msg); | 577 | reconnect (ic->h); |
578 | ic->callback (ic->callback_cls, | ||
579 | NULL, NULL, | ||
580 | _("Timeout transmitting iteration request to `PEERINFO' service.\n")); | ||
603 | ic->callback = NULL; | 581 | ic->callback = NULL; |
604 | GNUNET_free_non_null (ic->tqe); | 582 | GNUNET_free_non_null (ic->tqe); |
605 | GNUNET_free (err_msg); | ||
606 | GNUNET_free (ic); | 583 | GNUNET_free (ic); |
607 | } | 584 | } |
608 | 585 | ||
@@ -685,7 +662,6 @@ GNUNET_PEERINFO_iterate (struct GNUNET_PEERINFO_Handle *h, | |||
685 | } | 662 | } |
686 | 663 | ||
687 | 664 | ||
688 | |||
689 | /** | 665 | /** |
690 | * Cancel an iteration over peer information. | 666 | * Cancel an iteration over peer information. |
691 | * | 667 | * |
@@ -700,7 +676,7 @@ GNUNET_PEERINFO_iterate_cancel (struct GNUNET_PEERINFO_IteratorContext *ic) | |||
700 | ic->timeout_task = GNUNET_SCHEDULER_NO_TASK; | 676 | ic->timeout_task = GNUNET_SCHEDULER_NO_TASK; |
701 | } | 677 | } |
702 | ic->callback = NULL; | 678 | ic->callback = NULL; |
703 | if (ic->in_receive) | 679 | if (GNUNET_YES == ic->in_receive) |
704 | return; /* need to finish processing */ | 680 | return; /* need to finish processing */ |
705 | GNUNET_CONTAINER_DLL_remove (ic->h->tq_head, | 681 | GNUNET_CONTAINER_DLL_remove (ic->h->tq_head, |
706 | ic->h->tq_tail, | 682 | ic->h->tq_tail, |