X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fgns%2Fgnunet-service-gns.c;h=65c232f9374213d2ba73553d7461a140f78c3496;hb=a12b8c2c4cbf952c8c305cde193bb25c13a0912b;hp=90cd47e1dcb02a76af59ec30010a2e61982b0417;hpb=65377c3d9087635696f66b2444ef1d7eb39d4cd0;p=oweals%2Fgnunet.git diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c index 90cd47e1d..65c232f93 100644 --- a/src/gns/gnunet-service-gns.c +++ b/src/gns/gnunet-service-gns.c @@ -2,20 +2,20 @@ This file is part of GNUnet. Copyright (C) 2011-2018 GNUnet e.V. - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + Affero General Public License for more details. - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + SPDX-License-Identifier: AGPL3.0-or-later */ /** * @file gns/gnunet-service-gns.c @@ -229,14 +229,14 @@ GNS_get_tld (const char *name) /** * Task run during shutdown. * - * @param cls unused - * @param tc unused + * @param cls unused, NULL */ static void shutdown_task (void *cls) { struct GNS_TopLevelDomain *tld; + (void) cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutting down!\n"); GNS_interceptor_done (); @@ -283,6 +283,7 @@ client_disconnect_cb (void *cls, struct ClientLookupHandle *clh; struct GnsClient *gc = app_ctx; + (void) cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p disconnected\n", client); @@ -295,7 +296,6 @@ client_disconnect_cb (void *cls, clh); GNUNET_free (clh); } - GNUNET_free (gc); } @@ -314,6 +314,8 @@ client_connect_cb (void *cls, struct GNUNET_MQ_Handle *mq) { struct GnsClient *gc; + + (void) cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p connected\n", client); @@ -332,31 +334,47 @@ client_connect_cb (void *cls, * @param rd the record data */ static void -send_lookup_response (void* cls, +send_lookup_response (void *cls, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd) { struct ClientLookupHandle *clh = cls; + struct GnsClient *gc = clh->gc; struct GNUNET_MQ_Envelope *env; struct LookupResultMessage *rmsg; - size_t len; + ssize_t len; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending LOOKUP_RESULT message with %u results\n", (unsigned int) rd_count); - - len = GNUNET_GNSRECORD_records_get_size (rd_count, rd); + len = GNUNET_GNSRECORD_records_get_size (rd_count, + rd); + if (len < 0) + { + GNUNET_break (0); + GNUNET_SERVICE_client_drop (gc->client); + return; + } + if (len > UINT16_MAX - sizeof (*rmsg)) + { + GNUNET_break (0); + GNUNET_SERVICE_client_drop (gc->client); + return; + } env = GNUNET_MQ_msg_extra (rmsg, len, GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT); rmsg->id = clh->request_id; rmsg->rd_count = htonl (rd_count); - GNUNET_GNSRECORD_records_serialize (rd_count, rd, len, - (char*) &rmsg[1]); - GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq(clh->gc->client), + GNUNET_assert (len == + GNUNET_GNSRECORD_records_serialize (rd_count, + rd, + len, + (char*) &rmsg[1])); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (gc->client), env); - GNUNET_CONTAINER_DLL_remove (clh->gc->clh_head, - clh->gc->clh_tail, + GNUNET_CONTAINER_DLL_remove (gc->clh_head, + gc->clh_tail, clh); GNUNET_free (clh); GNUNET_STATISTICS_update (statistics, @@ -380,18 +398,12 @@ static int check_lookup (void *cls, const struct LookupMessage *l_msg) { - size_t msg_size; - const char* name; + size_t nlen; - msg_size = ntohs (l_msg->header.size); - if (msg_size < sizeof (struct LookupMessage)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - name = (const char *) &l_msg[1]; - if ( ('\0' != name[msg_size - sizeof (struct LookupMessage) - 1]) || - (strlen (name) > GNUNET_DNSPARSER_MAX_NAME_LENGTH) ) + (void) cls; + GNUNET_MQ_check_zero_termination (l_msg); + nlen = ntohs (l_msg->header.size) - sizeof (struct LookupMessage); + if (nlen > GNUNET_DNSPARSER_MAX_NAME_LENGTH) { GNUNET_break (0); return GNUNET_SYSERR; @@ -424,7 +436,6 @@ handle_lookup (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received LOOKUP `%s' message\n", name); - clh = GNUNET_new (struct ClientLookupHandle); GNUNET_CONTAINER_DLL_insert (gc->clh_head, gc->clh_tail, @@ -479,6 +490,8 @@ read_service_conf (void *cls, struct GNUNET_CRYPTO_EcdsaPublicKey pk; struct GNS_TopLevelDomain *tld; + (void) cls; + (void) section; if (option[0] != '.') return; if (GNUNET_OK !=