diff options
author | Gabor X Toth <*@tg-x.net> | 2014-05-23 14:41:42 +0000 |
---|---|---|
committer | Gabor X Toth <*@tg-x.net> | 2014-05-23 14:41:42 +0000 |
commit | c0d549b6ab07a951380b807f1a1c1a767bfd5be0 (patch) | |
tree | ba70cffb14676ea17c3ca6ef302d9ffe6d3fc3f2 /src/multicast | |
parent | 5fe013c4b7b150533839dbca964ffcd2b3fe80a5 (diff) | |
download | gnunet-c0d549b6ab07a951380b807f1a1c1a767bfd5be0.tar.gz gnunet-c0d549b6ab07a951380b807f1a1c1a767bfd5be0.zip |
psyc, multicast: fixes, comments
Diffstat (limited to 'src/multicast')
-rw-r--r-- | src/multicast/gnunet-service-multicast.c | 30 | ||||
-rw-r--r-- | src/multicast/multicast_api.c | 14 |
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; |