aboutsummaryrefslogtreecommitdiff
path: root/src/multicast
diff options
context:
space:
mode:
authorGabor X Toth <*@tg-x.net>2014-05-23 14:41:42 +0000
committerGabor X Toth <*@tg-x.net>2014-05-23 14:41:42 +0000
commitc0d549b6ab07a951380b807f1a1c1a767bfd5be0 (patch)
treeba70cffb14676ea17c3ca6ef302d9ffe6d3fc3f2 /src/multicast
parent5fe013c4b7b150533839dbca964ffcd2b3fe80a5 (diff)
downloadgnunet-c0d549b6ab07a951380b807f1a1c1a767bfd5be0.tar.gz
gnunet-c0d549b6ab07a951380b807f1a1c1a767bfd5be0.zip
psyc, multicast: fixes, comments
Diffstat (limited to 'src/multicast')
-rw-r--r--src/multicast/gnunet-service-multicast.c30
-rw-r--r--src/multicast/multicast_api.c14
2 files changed, 29 insertions, 15 deletions
diff --git a/src/multicast/gnunet-service-multicast.c b/src/multicast/gnunet-service-multicast.c
index bd6616589..d412d3f8e 100644
--- a/src/multicast/gnunet-service-multicast.c
+++ b/src/multicast/gnunet-service-multicast.c
@@ -499,10 +499,16 @@ handle_member_join (void *cls, struct GNUNET_SERVER_Client *client,
499 { /* First client, send join request. */ 499 { /* First client, send join request. */
500 struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) &msg[1]; 500 struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) &msg[1];
501 uint32_t relay_count = ntohs (msg->relay_count); 501 uint32_t relay_count = ntohs (msg->relay_count);
502 struct GNUNET_MessageHeader * 502 uint16_t relay_size = relay_count * sizeof (*relays);
503 join_msg = ((struct GNUNET_MessageHeader *) 503 struct GNUNET_MessageHeader *join_msg = NULL;
504 ((char *) &msg[1]) + relay_count * sizeof (*relays)); 504 uint16_t join_msg_size = 0;
505 uint16_t join_msg_size = ntohs (join_msg->size); 505 if (sizeof (*msg) + relay_size + sizeof (struct GNUNET_MessageHeader)
506 <= ntohs (msg->header.size))
507 {
508 join_msg = (struct GNUNET_MessageHeader *)
509 (((char *) &msg[1]) + relay_size);
510 join_msg_size = ntohs (join_msg->size);
511 }
506 512
507 struct MulticastJoinRequestMessage * 513 struct MulticastJoinRequestMessage *
508 req = GNUNET_malloc (sizeof (*req) + join_msg_size); 514 req = GNUNET_malloc (sizeof (*req) + join_msg_size);
@@ -510,7 +516,8 @@ handle_member_join (void *cls, struct GNUNET_SERVER_Client *client,
510 req->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_REQUEST); 516 req->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_REQUEST);
511 req->group_key = grp->pub_key; 517 req->group_key = grp->pub_key;
512 GNUNET_CRYPTO_eddsa_key_get_public (&mem->priv_key, &req->member_key); 518 GNUNET_CRYPTO_eddsa_key_get_public (&mem->priv_key, &req->member_key);
513 memcpy (&req[1], join_msg, join_msg_size); 519 if (0 < join_msg_size)
520 memcpy (&req[1], join_msg, join_msg_size);
514 521
515 req->purpose.size = htonl (sizeof (*req) + join_msg_size 522 req->purpose.size = htonl (sizeof (*req) + join_msg_size
516 - sizeof (req->header) 523 - sizeof (req->header)
@@ -556,17 +563,18 @@ handle_join_decision (void *cls, struct GNUNET_SERVER_Client *client,
556 563
557 struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) &cl_dcsn[1]; 564 struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) &cl_dcsn[1];
558 uint32_t relay_count = ntohs (cl_dcsn->relay_count); 565 uint32_t relay_count = ntohs (cl_dcsn->relay_count);
566 uint16_t relay_size = relay_count * sizeof (*relays);
559 567
560 struct GNUNET_MessageHeader *join_msg = NULL; 568 struct GNUNET_MessageHeader *join_msg = NULL;
561 uint16_t join_msg_size = 0; 569 uint16_t join_msg_size = 0;
562 if (sizeof (*cl_dcsn) + relay_count * sizeof (*relays) + sizeof (*m) 570 if (sizeof (*cl_dcsn) + relay_size + sizeof (*m) <= ntohs (m->size))
563 <= ntohs (m->size))
564 { 571 {
565 join_msg = ((struct GNUNET_MessageHeader *) 572 join_msg = (struct GNUNET_MessageHeader *)
566 ((char *) &cl_dcsn[1]) + relay_count * sizeof (*relays)); 573 (((char *) &cl_dcsn[1]) + relay_size);
567 join_msg_size = ntohs (join_msg->size); 574 join_msg_size = ntohs (join_msg->size);
568 } 575 }
569 576
577 int keep_dcsn = GNUNET_NO;
570 struct MulticastJoinDecisionMessage * 578 struct MulticastJoinDecisionMessage *
571 dcsn = GNUNET_malloc (sizeof (*dcsn) + join_msg_size); 579 dcsn = GNUNET_malloc (sizeof (*dcsn) + join_msg_size);
572 dcsn->header.size = htons (sizeof (*dcsn) + join_msg_size); 580 dcsn->header.size = htons (sizeof (*dcsn) + join_msg_size);
@@ -600,10 +608,10 @@ handle_join_decision (void *cls, struct GNUNET_SERVER_Client *client,
600 if (GNUNET_YES == dcsn->is_admitted) 608 if (GNUNET_YES == dcsn->is_admitted)
601 { /* Member admitted, store join_decision. */ 609 { /* Member admitted, store join_decision. */
602 mem->join_decision = dcsn; 610 mem->join_decision = dcsn;
611 keep_dcsn = GNUNET_YES;
603 } 612 }
604 else 613 else
605 { /* Refused entry, disconnect clients. */ 614 { /* Refused entry, disconnect clients. */
606 GNUNET_free (dcsn);
607 struct ClientList *cl = mem->grp.clients_head; 615 struct ClientList *cl = mem->grp.clients_head;
608 while (NULL != cl) 616 while (NULL != cl)
609 { 617 {
@@ -618,6 +626,8 @@ handle_join_decision (void *cls, struct GNUNET_SERVER_Client *client,
618 { 626 {
619 /* FIXME: send join decision to remote peers */ 627 /* FIXME: send join decision to remote peers */
620 } 628 }
629 if (GNUNET_NO == keep_dcsn)
630 GNUNET_free (dcsn);
621 GNUNET_SERVER_receive_done (client, GNUNET_OK); 631 GNUNET_SERVER_receive_done (client, GNUNET_OK);
622} 632}
623 633
diff --git a/src/multicast/multicast_api.c b/src/multicast/multicast_api.c
index 477cb1f2c..501ff4b70 100644
--- a/src/multicast/multicast_api.c
+++ b/src/multicast/multicast_api.c
@@ -676,8 +676,10 @@ GNUNET_MULTICAST_join_decision (struct GNUNET_MULTICAST_JoinHandle *jh,
676 dcsn->member_peer = jh->member_peer; 676 dcsn->member_peer = jh->member_peer;
677 dcsn->is_admitted = is_admitted; 677 dcsn->is_admitted = is_admitted;
678 dcsn->relay_count = relay_count; 678 dcsn->relay_count = relay_count;
679 memcpy (&dcsn[1], relays, relay_size); 679 if (0 < relay_size)
680 memcpy (((char *) &dcsn[1]) + relay_size, join_resp, join_resp_size); 680 memcpy (&dcsn[1], relays, relay_size);
681 if (0 < join_resp_size)
682 memcpy (((char *) &dcsn[1]) + relay_size, join_resp, join_resp_size);
681 683
682 GNUNET_CONTAINER_DLL_insert_tail (grp->tmit_head, grp->tmit_tail, mq); 684 GNUNET_CONTAINER_DLL_insert_tail (grp->tmit_head, grp->tmit_tail, mq);
683 transmit_next (grp); 685 transmit_next (grp);
@@ -997,13 +999,15 @@ GNUNET_MULTICAST_member_join (const struct GNUNET_CONFIGURATION_Handle *cfg,
997 uint16_t join_msg_size = (NULL != join_msg) ? ntohs (join_msg->size) : 0; 999 uint16_t join_msg_size = (NULL != join_msg) ? ntohs (join_msg->size) : 0;
998 struct MulticastMemberJoinMessage * 1000 struct MulticastMemberJoinMessage *
999 join = GNUNET_malloc (sizeof (*join) + relay_size + join_msg_size); 1001 join = GNUNET_malloc (sizeof (*join) + relay_size + join_msg_size);
1000 join->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_MEMBER_JOIN);
1001 join->header.size = htons (sizeof (*join) + relay_size + join_msg_size); 1002 join->header.size = htons (sizeof (*join) + relay_size + join_msg_size);
1003 join->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_MEMBER_JOIN);
1002 join->group_key = *group_key; 1004 join->group_key = *group_key;
1003 join->member_key = *member_key; 1005 join->member_key = *member_key;
1004 join->origin = *origin; 1006 join->origin = *origin;
1005 memcpy (&join[1], relays, relay_size); 1007 if (0 < relay_size)
1006 memcpy (((char *) &join[1]) + relay_size, join_msg, join_msg_size); 1008 memcpy (&join[1], relays, relay_size);
1009 if (0 < join_msg_size)
1010 memcpy (((char *) &join[1]) + relay_size, join_msg, join_msg_size);
1007 1011
1008 grp->reconnect_msg = (struct GNUNET_MessageHeader *) join; 1012 grp->reconnect_msg = (struct GNUNET_MessageHeader *) join;
1009 grp->is_origin = GNUNET_NO; 1013 grp->is_origin = GNUNET_NO;