X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgns%2Fplugin_gnsrecord_gns.c;h=ebba0db47c6218e7ad7d4066006a4df9e37dc42e;hb=6485325f72b588c838f8b6d9e12c50c642e493b8;hp=756034d6e089ccc98b2b90bb08fd4cfbb7a7d650;hpb=d8c53b12a818ff7cf82d06a1a69c395bdef85ee6;p=oweals%2Fgnunet.git diff --git a/src/gns/plugin_gnsrecord_gns.c b/src/gns/plugin_gnsrecord_gns.c index 756034d6e..ebba0db47 100644 --- a/src/gns/plugin_gnsrecord_gns.c +++ b/src/gns/plugin_gnsrecord_gns.c @@ -1,21 +1,21 @@ /* This file is part of GNUnet - Copyright (C) 2013, 2014 GNUnet e.V. + Copyright (C) 2013, 2014, 2016 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 Affero General Public License + along with this program. If not, see . - 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. + SPDX-License-Identifier: AGPL3.0-or-later */ /** @@ -31,6 +31,7 @@ #include "gnunet_gnsrecord_lib.h" #include "gnunet_dnsparser_lib.h" #include "gnunet_gnsrecord_plugin.h" +#include /** @@ -93,41 +94,47 @@ gns_value_to_string (void *cls, } case GNUNET_GNSRECORD_TYPE_VPN: { - const struct GNUNET_TUN_GnsVpnRecord *vpn; + struct GNUNET_TUN_GnsVpnRecord vpn; char* vpn_str; cdata = data; - if ( (data_size <= sizeof (struct GNUNET_TUN_GnsVpnRecord)) || + if ( (data_size <= sizeof (vpn)) || ('\0' != cdata[data_size - 1]) ) return NULL; /* malformed */ - vpn = data; + /* need to memcpy for alignment */ + GNUNET_memcpy (&vpn, + data, + sizeof (vpn)); GNUNET_asprintf (&vpn_str, "%u %s %s", - (unsigned int) ntohs (vpn->proto), - (const char*) GNUNET_i2s_full (&vpn->peer), - (const char*) &vpn[1]); + (unsigned int) ntohs (vpn.proto), + (const char*) GNUNET_i2s_full (&vpn.peer), + (const char*) &cdata[sizeof (vpn)]); return vpn_str; } case GNUNET_GNSRECORD_TYPE_BOX: { - const struct GNUNET_GNSRECORD_BoxRecord *box; + struct GNUNET_GNSRECORD_BoxRecord box; uint32_t rt; char *box_str; char *ival; + cdata = data; if (data_size < sizeof (struct GNUNET_GNSRECORD_BoxRecord)) return NULL; /* malformed */ - box = data; - rt = ntohl (box->record_type); + GNUNET_memcpy (&box, + data, + sizeof (box)); + rt = ntohl (box.record_type); ival = GNUNET_GNSRECORD_value_to_string (rt, - &box[1], - data_size - sizeof (struct GNUNET_GNSRECORD_BoxRecord)); + &cdata[sizeof (box)], + data_size - sizeof (box)); if (NULL == ival) return NULL; /* malformed */ GNUNET_asprintf (&box_str, "%u %u %u %s", - (unsigned int) ntohs (box->protocol), - (unsigned int) ntohs (box->service), + (unsigned int) ntohs (box.protocol), + (unsigned int) ntohs (box.service), (unsigned int) rt, ival); GNUNET_free (ival); @@ -164,147 +171,154 @@ gns_string_to_value (void *cls, switch (type) { - case GNUNET_GNSRECORD_TYPE_PKEY: - if (GNUNET_OK != - GNUNET_CRYPTO_ecdsa_public_key_from_string (s, strlen (s), &pkey)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse PKEY record `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey); - GNUNET_memcpy (*data, &pkey, sizeof (pkey)); - *data_size = sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey); - return GNUNET_OK; - - case GNUNET_GNSRECORD_TYPE_NICK: - *data = GNUNET_strdup (s); - *data_size = strlen (s); - return GNUNET_OK; - case GNUNET_GNSRECORD_TYPE_LEHO: - *data = GNUNET_strdup (s); - *data_size = strlen (s); - return GNUNET_OK; - case GNUNET_GNSRECORD_TYPE_GNS2DNS: - { - char nsbuf[514]; - char *cpy; - char *at; - size_t off; - - cpy = GNUNET_strdup (s); - at = strchr (cpy, '@'); - if (NULL == at) + case GNUNET_GNSRECORD_TYPE_PKEY: + if (GNUNET_OK != + GNUNET_CRYPTO_ecdsa_public_key_from_string (s, + strlen (s), + &pkey)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse GNS2DNS record `%s'\n"), + _("Unable to parse PKEY record `%s'\n"), s); - GNUNET_free (cpy); return GNUNET_SYSERR; } - *at = '\0'; - at++; + *data = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey); + GNUNET_memcpy (*data, + &pkey, + sizeof (pkey)); + *data_size = sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey); + return GNUNET_OK; - off = 0; - if ( (GNUNET_OK != - GNUNET_DNSPARSER_builder_add_name (nsbuf, - sizeof (nsbuf), - &off, - cpy)) || - (GNUNET_OK != - GNUNET_DNSPARSER_builder_add_name (nsbuf, - sizeof (nsbuf), - &off, - at)) ) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Failed to serialize GNS2DNS record with value `%s'\n"), - s); - GNUNET_free (cpy); - return GNUNET_SYSERR; - } - GNUNET_free (cpy); - *data_size = off; - *data = GNUNET_malloc (off); - GNUNET_memcpy (*data, nsbuf, off); + case GNUNET_GNSRECORD_TYPE_NICK: + *data = GNUNET_strdup (s); + *data_size = strlen (s); return GNUNET_OK; - } - case GNUNET_GNSRECORD_TYPE_VPN: - { - struct GNUNET_TUN_GnsVpnRecord *vpn; - char s_peer[103 + 1]; - char s_serv[253 + 1]; - unsigned int proto; - - if (3 != SSCANF (s, - "%u %103s %253s", - &proto, s_peer, s_serv)) + case GNUNET_GNSRECORD_TYPE_LEHO: + *data = GNUNET_strdup (s); + *data_size = strlen (s); + return GNUNET_OK; + case GNUNET_GNSRECORD_TYPE_GNS2DNS: { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse VPN record string `%s'\n"), - s); - return GNUNET_SYSERR; + char nsbuf[514]; + char *cpy; + char *at; + size_t off; + + cpy = GNUNET_strdup (s); + at = strchr (cpy, '@'); + if (NULL == at) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse GNS2DNS record `%s'\n"), + s); + GNUNET_free (cpy); + return GNUNET_SYSERR; + } + *at = '\0'; + at++; + + off = 0; + if ( (GNUNET_OK != + GNUNET_DNSPARSER_builder_add_name (nsbuf, + sizeof (nsbuf), + &off, + cpy)) || + (GNUNET_OK != + GNUNET_DNSPARSER_builder_add_name (nsbuf, + sizeof (nsbuf), + &off, + at)) ) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Failed to serialize GNS2DNS record with value `%s'\n"), + s); + GNUNET_free (cpy); + return GNUNET_SYSERR; + } + GNUNET_free (cpy); + *data_size = off; + *data = GNUNET_malloc (off); + GNUNET_memcpy (*data, + nsbuf, + off); + return GNUNET_OK; } - *data_size = sizeof (struct GNUNET_TUN_GnsVpnRecord) + strlen (s_serv) + 1; - *data = vpn = GNUNET_malloc (*data_size); - if (GNUNET_OK != GNUNET_CRYPTO_eddsa_public_key_from_string ((char*) s_peer, - strlen (s_peer), - &vpn->peer.public_key)) + case GNUNET_GNSRECORD_TYPE_VPN: { - GNUNET_free (vpn); - *data_size = 0; - return GNUNET_SYSERR; + struct GNUNET_TUN_GnsVpnRecord *vpn; + char s_peer[103 + 1]; + char s_serv[253 + 1]; + unsigned int proto; + + if (3 != SSCANF (s, + "%u %103s %253s", + &proto, s_peer, s_serv)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse VPN record string `%s'\n"), + s); + return GNUNET_SYSERR; + } + *data_size = sizeof (struct GNUNET_TUN_GnsVpnRecord) + strlen (s_serv) + 1; + *data = vpn = GNUNET_malloc (*data_size); + if (GNUNET_OK != + GNUNET_CRYPTO_eddsa_public_key_from_string ((char*) s_peer, + strlen (s_peer), + &vpn->peer.public_key)) + { + GNUNET_free (vpn); + *data_size = 0; + return GNUNET_SYSERR; + } + vpn->proto = htons ((uint16_t) proto); + strcpy ((char*)&vpn[1], s_serv); + return GNUNET_OK; } - vpn->proto = htons ((uint16_t) proto); - strcpy ((char*)&vpn[1], s_serv); - return GNUNET_OK; - } - case GNUNET_GNSRECORD_TYPE_BOX: - { - struct GNUNET_GNSRECORD_BoxRecord *box; - size_t rest; - unsigned int protocol; - unsigned int service; - unsigned int record_type; - void *bval; - size_t bval_size; - - if (3 != SSCANF (s, - "%u %u %u ", - &protocol, - &service, - &record_type)) + case GNUNET_GNSRECORD_TYPE_BOX: { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse BOX record string `%s'\n"), - s); - return GNUNET_SYSERR; + struct GNUNET_GNSRECORD_BoxRecord *box; + size_t rest; + unsigned int protocol; + unsigned int service; + unsigned int record_type; + void *bval; + size_t bval_size; + + if (3 != SSCANF (s, + "%u %u %u ", + &protocol, + &service, + &record_type)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse BOX record string `%s'\n"), + s); + return GNUNET_SYSERR; + } + rest = snprintf (NULL, 0, + "%u %u %u ", + protocol, + service, + record_type); + if (GNUNET_OK != + GNUNET_GNSRECORD_string_to_value (record_type, + &s[rest], + &bval, + &bval_size)) + return GNUNET_SYSERR; + *data_size = sizeof (struct GNUNET_GNSRECORD_BoxRecord) + bval_size; + *data = box = GNUNET_malloc (*data_size); + box->protocol = htons (protocol); + box->service = htons (service); + box->record_type = htonl (record_type); + GNUNET_memcpy (&box[1], + bval, + bval_size); + GNUNET_free (bval); + return GNUNET_OK; } - rest = snprintf (NULL, 0, - "%u %u %u ", - protocol, - service, - record_type); - if (GNUNET_OK != - GNUNET_GNSRECORD_string_to_value (record_type, - &s[rest], - &bval, - &bval_size)) - return GNUNET_SYSERR; - *data_size = sizeof (struct GNUNET_GNSRECORD_BoxRecord) + bval_size; - *data = box = GNUNET_malloc (*data_size); - box->protocol = htons (protocol); - box->service = htons (service); - box->record_type = htonl (record_type); - GNUNET_memcpy (&box[1], - bval, - bval_size); - GNUNET_free (bval); - return GNUNET_OK; - } - default: - return GNUNET_SYSERR; + default: + return GNUNET_SYSERR; } } @@ -342,7 +356,7 @@ gns_typename_to_number (void *cls, i=0; while ( (NULL != gns_name_map[i].name) && - (0 != strcasecmp (gns_typename, + (0 != strcasecmp (gns_typename, gns_name_map[i].name)) ) i++; return gns_name_map[i].number; @@ -364,7 +378,7 @@ gns_number_to_typename (void *cls, i=0; while ( (NULL != gns_name_map[i].name) && - (type != gns_name_map[i].number) ) + (type != gns_name_map[i].number) ) i++; return gns_name_map[i].name; }