From: Christian Grothoff Date: Sat, 30 Jun 2018 09:57:07 +0000 (+0200) Subject: simplify memory allocation in plugin_namestore_flat, use cleaner signatures for base6... X-Git-Tag: v0.11.0~322^2~105 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=bc458ee7949e01e0b5a1f7f15773c02be94cb8fa;p=oweals%2Fgnunet.git simplify memory allocation in plugin_namestore_flat, use cleaner signatures for base64 encoding/decoding functions --- diff --git a/src/gnsrecord/plugin_gnsrecord_dns.c b/src/gnsrecord/plugin_gnsrecord_dns.c index 188afcae7..254ae15ea 100644 --- a/src/gnsrecord/plugin_gnsrecord_dns.c +++ b/src/gnsrecord/plugin_gnsrecord_dns.c @@ -11,7 +11,7 @@ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 . */ @@ -463,7 +463,7 @@ dns_string_to_value (void *cls, } cert_size = GNUNET_STRINGS_base64_decode (certp, strlen (certp), - &cert_data); + (void **) &cert_data); GNUNET_free (sdup); cert.cert_type = type; cert.cert_tag = key; diff --git a/src/include/gnunet_strings_lib.h b/src/include/gnunet_strings_lib.h index 1fdab93b2..c1d76ef71 100644 --- a/src/include/gnunet_strings_lib.h +++ b/src/include/gnunet_strings_lib.h @@ -11,7 +11,7 @@ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 . */ @@ -339,7 +339,9 @@ GNUNET_STRINGS_string_to_data (const char *enc, * @return the size of the output */ size_t -GNUNET_STRINGS_base64_encode (const char *data, size_t len, char **output); +GNUNET_STRINGS_base64_encode (const void *in, + size_t len, + char **output); /** @@ -354,7 +356,7 @@ GNUNET_STRINGS_base64_encode (const char *data, size_t len, char **output); size_t GNUNET_STRINGS_base64_decode (const char *data, size_t len, - char **output); + void **output); /** diff --git a/src/namestore/plugin_namestore_flat.c b/src/namestore/plugin_namestore_flat.c index 33c48b244..e16fe91b7 100644 --- a/src/namestore/plugin_namestore_flat.c +++ b/src/namestore/plugin_namestore_flat.c @@ -55,7 +55,7 @@ struct FlatFileEntry /** * Entry zone */ - struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key; + struct GNUNET_CRYPTO_EcdsaPrivateKey private_key; /** * Record cound @@ -93,7 +93,6 @@ static int database_setup (struct Plugin *plugin) { char *afsdir; - char *key; char *record_data; char *zone_private_key; char *record_data_b64; @@ -104,7 +103,6 @@ database_setup (struct Plugin *plugin) char *record_count; size_t record_data_size; uint64_t size; - size_t key_len; struct GNUNET_HashCode hkey; struct GNUNET_DISK_FileHandle *fh; struct FlatFileEntry *entry; @@ -232,7 +230,7 @@ database_setup (struct Plugin *plugin) record_data_size = GNUNET_STRINGS_base64_decode (record_data_b64, strlen (record_data_b64), - &record_data); + (void **) &record_data); entry->record_data = GNUNET_new_array (entry->record_count, struct GNUNET_GNSRECORD_Data); @@ -251,21 +249,34 @@ database_setup (struct Plugin *plugin) break; } GNUNET_free (record_data); - GNUNET_STRINGS_base64_decode (zone_private_key, - strlen (zone_private_key), - (char**)&entry->private_key); - key_len = strlen (label) + sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey); - key = GNUNET_malloc (strlen (label) + sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey)); - GNUNET_memcpy (key, - label, - strlen (label)); - GNUNET_memcpy (key+strlen(label), - entry->private_key, - sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey)); - GNUNET_CRYPTO_hash (key, - key_len, - &hkey); - GNUNET_free (key); + + { + struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key; + + GNUNET_STRINGS_base64_decode (zone_private_key, + strlen (zone_private_key), + (void**)&private_key); + entry->private_key = *private_key; + GNUNET_free (private_key); + } + + { + char *key; + size_t key_len; + + key_len = strlen (label) + sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey); + key = GNUNET_malloc (strlen (label) + sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey)); + GNUNET_memcpy (key, + label, + strlen (label)); + GNUNET_memcpy (key+strlen(label), + &entry->private_key, + sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey)); + GNUNET_CRYPTO_hash (key, + key_len, + &hkey); + GNUNET_free (key); + } if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (plugin->hm, &hkey, @@ -302,7 +313,7 @@ store_and_free_entries (void *cls, ssize_t data_size; (void) key; - GNUNET_STRINGS_base64_encode ((char*)entry->private_key, + GNUNET_STRINGS_base64_encode (&entry->private_key, sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey), &zone_private_key); data_size = GNUNET_GNSRECORD_records_get_size (entry->record_count, @@ -353,7 +364,6 @@ store_and_free_entries (void *cls, strlen (line)); GNUNET_free (line); - GNUNET_free (entry->private_key); GNUNET_free (entry->label); GNUNET_free (entry->record_data); GNUNET_free (entry); @@ -441,11 +451,10 @@ namestore_flat_store_records (void *cls, return GNUNET_OK; } entry = GNUNET_new (struct FlatFileEntry); - entry->private_key = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPrivateKey); GNUNET_asprintf (&entry->label, label, strlen (label)); - GNUNET_memcpy (entry->private_key, + GNUNET_memcpy (&entry->private_key, zone_key, sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey)); entry->rvalue = rvalue; @@ -519,7 +528,7 @@ namestore_flat_lookup_records (void *cls, if (NULL != iter) iter (iter_cls, 0, - entry->private_key, + &entry->private_key, entry->label, entry->record_count, entry->record_data); @@ -586,7 +595,7 @@ iterate_zones (void *cls, if (0 == ic->limit) return GNUNET_NO; if ( (NULL != ic->zone) && - (0 != memcmp (entry->private_key, + (0 != memcmp (&entry->private_key, ic->zone, sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) ) return GNUNET_YES; @@ -598,7 +607,7 @@ iterate_zones (void *cls, } ic->iter (ic->iter_cls, ic->pos, - entry->private_key, + &entry->private_key, entry->label, entry->record_count, entry->record_data); @@ -668,7 +677,7 @@ zone_to_name (void *cls, struct FlatFileEntry *entry = value; (void) key; - if (0 != memcmp (entry->private_key, + if (0 != memcmp (&entry->private_key, ztn->zone, sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) return GNUNET_YES; @@ -683,7 +692,7 @@ zone_to_name (void *cls, { ztn->iter (ztn->iter_cls, 0, - entry->private_key, + &entry->private_key, entry->label, entry->record_count, entry->record_data); diff --git a/src/util/strings.c b/src/util/strings.c index 5ed195933..ea3c8cfb9 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -11,7 +11,7 @@ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 . */ @@ -1947,27 +1947,27 @@ static char *cvt = /** * Encode into Base64. * - * @param data the data to encode + * @param in the data to encode * @param len the length of the input * @param output where to write the output (*output should be NULL, * is allocated) * @return the size of the output */ size_t -GNUNET_STRINGS_base64_encode (const char *data, +GNUNET_STRINGS_base64_encode (const void *in, size_t len, char **output) { - size_t i; - char c; + const char *data = in; size_t ret; char *opt; ret = 0; opt = GNUNET_malloc (2 + (len * 4 / 3) + 8); - *output = opt; - for (i = 0; i < len; ++i) + for (size_t i = 0; i < len; ++i) { + char c; + c = (data[i] >> 2) & 0x3f; opt[ret++] = cvt[(int) c]; c = (data[i] << 4) & 0x3f; @@ -1997,6 +1997,7 @@ GNUNET_STRINGS_base64_encode (const char *data, } } opt[ret++] = FILLCHAR; + *output = opt; return ret; } @@ -2018,11 +2019,10 @@ GNUNET_STRINGS_base64_encode (const char *data, */ size_t GNUNET_STRINGS_base64_decode (const char *data, - size_t len, char **output) + size_t len, + void **out) { - size_t i; - char c; - char c1; + char *output; size_t ret = 0; #define CHECK_CRLF while (data[i] == '\r' || data[i] == '\n') {\ @@ -2031,12 +2031,15 @@ GNUNET_STRINGS_base64_decode (const char *data, if (i >= len) goto END; \ } - *output = GNUNET_malloc ((len * 3 / 4) + 8); + output = GNUNET_malloc ((len * 3 / 4) + 8); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "base64_decode decoding len=%d\n", (int) len); - for (i = 0; i < len; ++i) + for (size_t i = 0; i < len; ++i) { + char c; + char c1; + CHECK_CRLF; if (FILLCHAR == data[i]) break; @@ -2045,7 +2048,7 @@ GNUNET_STRINGS_base64_decode (const char *data, CHECK_CRLF; c1 = (char) cvtfind (data[i]); c = (c << 2) | ((c1 >> 4) & 0x3); - (*output)[ret++] = c; + output[ret++] = c; if (++i < len) { CHECK_CRLF; @@ -2054,7 +2057,7 @@ GNUNET_STRINGS_base64_decode (const char *data, break; c = (char) cvtfind (c); c1 = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf); - (*output)[ret++] = c1; + output[ret++] = c1; } if (++i < len) { @@ -2065,15 +2068,13 @@ GNUNET_STRINGS_base64_decode (const char *data, c1 = (char) cvtfind (c1); c = ((c << 6) & 0xc0) | c1; - (*output)[ret++] = c; + output[ret++] = c; } } END: + *out = output; return ret; } - - - /* end of strings.c */