X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcadet%2Fcadet_api.c;h=366e31405a8903c43a28a28a8fb8e827c9675a25;hb=4b766fd267ca83a8faa4e22353d5942074d6f2b7;hp=ea6ef719ba6003bcc4c45271ce9da9767895adf5;hpb=9995f2609595f7be49a266e094877c746a4fc73d;p=oweals%2Fgnunet.git diff --git a/src/cadet/cadet_api.c b/src/cadet/cadet_api.c index ea6ef719b..366e31405 100644 --- a/src/cadet/cadet_api.c +++ b/src/cadet/cadet_api.c @@ -977,6 +977,29 @@ handle_get_peer (void *cls, } +/** + * Check that message received from CADET service is well-formed. + * + * @param cls the `struct GNUNET_CADET_Handle` + * @param message the message we got + * @return #GNUNET_OK if the message is well-formed, + * #GNUNET_SYSERR otherwise + */ +static int +check_get_tunnels (void *cls, + const struct GNUNET_MessageHeader *message) +{ + size_t esize; + + esize = ntohs (message->size); + if (sizeof (struct GNUNET_CADET_LocalInfoTunnel) == esize) + return GNUNET_OK; + if (sizeof (struct GNUNET_MessageHeader) == esize) + return GNUNET_OK; + return GNUNET_SYSERR; +} + + /** * Process a local reply about info on all tunnels, pass info to the user. * @@ -985,19 +1008,28 @@ handle_get_peer (void *cls, */ static void handle_get_tunnels (void *cls, - const struct GNUNET_CADET_LocalInfoTunnel *msg) + const struct GNUNET_MessageHeader *msg) { struct GNUNET_CADET_Handle *h = cls; + const struct GNUNET_CADET_LocalInfoTunnel *info = + (const struct GNUNET_CADET_LocalInfoTunnel *) msg; if (NULL == h->info_cb.tunnels_cb) return; - h->info_cb.tunnels_cb (h->info_cls, - &msg->destination, - ntohl (msg->channels), - ntohl (msg->connections), - ntohs (msg->estate), - ntohs (msg->cstate)); - + if (sizeof (struct GNUNET_CADET_LocalInfoTunnel) == ntohs (msg->size)) + h->info_cb.tunnels_cb (h->info_cls, + &info->destination, + ntohl (info->channels), + ntohl (info->connections), + ntohs (info->estate), + ntohs (info->cstate)); + else + h->info_cb.tunnels_cb (h->info_cls, + NULL, + 0, + 0, + 0, + 0); } @@ -1115,10 +1147,10 @@ reconnect (struct GNUNET_CADET_Handle *h) GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEER, struct GNUNET_CADET_LocalInfoPeer, h), - GNUNET_MQ_hd_fixed_size (get_tunnels, - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS, - struct GNUNET_CADET_LocalInfoTunnel, - h), + GNUNET_MQ_hd_var_size (get_tunnels, + GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS, + struct GNUNET_MessageHeader, + h), GNUNET_MQ_hd_var_size (get_tunnel, GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL, struct GNUNET_CADET_LocalInfoTunnel, @@ -1126,6 +1158,7 @@ reconnect (struct GNUNET_CADET_Handle *h) GNUNET_MQ_handler_end () }; + GNUNET_assert (NULL == h->mq); h->mq = GNUNET_CLIENT_connect (h->cfg, "cadet", handlers,