X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fbio.c;h=059638ff1f492414c25a1ac1db9abe65dbe7aab9;hb=0ea8e006d5f5ef84e31e000607bd24a23f8fc1ed;hp=e1085faa6c69755c7f9c029579cba98084efda1c;hpb=6d4519cda7182216d28a1f44a2418df4f6a3ec0b;p=oweals%2Fgnunet.git diff --git a/src/util/bio.c b/src/util/bio.c index e1085faa6..059638ff1 100644 --- a/src/util/bio.c +++ b/src/util/bio.c @@ -146,6 +146,30 @@ GNUNET_BIO_read (struct GNUNET_BIO_ReadHandle *h, } +/** + * Read the contents of a binary file into a buffer. + * + * @param h handle to an open file + * @param file name of the source file + * @param line line number in the source file + * @param result the buffer to write the result to + * @param len the number of bytes to read + * @return GNUNET_OK on success, GNUNET_SYSERR on failure + */ +int GNUNET_BIO_read_fn (struct GNUNET_BIO_ReadHandle *h, + const char *file, int line, + void *result, + size_t len) +{ + char what[1024]; + GNUNET_snprintf (what, + sizeof(what), + "%s:%d", + file, line); + return GNUNET_BIO_read (h, what, result, len); +} + + /** * Read 0-terminated string from a file. * @@ -164,7 +188,13 @@ GNUNET_BIO_read_string (struct GNUNET_BIO_ReadHandle *h, uint32_t big; if (GNUNET_OK != GNUNET_BIO_read_int32 (h, &big)) - return GNUNET_SYSERR; + { + GNUNET_free_non_null (h->emsg); + GNUNET_asprintf (&h->emsg, + _("Error reading length of string `%s'"), + what); + return GNUNET_SYSERR; + } if (big == 0) { *result = NULL; @@ -209,8 +239,13 @@ GNUNET_BIO_read_meta_data (struct GNUNET_BIO_ReadHandle *h, char *buf; struct GNUNET_CONTAINER_MetaData *meta; - if (GNUNET_BIO_read_int32__ (h, what, (int32_t *) &size) != GNUNET_OK) + if (GNUNET_BIO_read_int32 (h, (int32_t *) &size) != GNUNET_OK) return GNUNET_SYSERR; + if (size == 0) + { + *result = NULL; + return GNUNET_OK; + } if (size > MAX_META_DATA) { GNUNET_asprintf (&h->emsg, @@ -242,17 +277,20 @@ GNUNET_BIO_read_meta_data (struct GNUNET_BIO_ReadHandle *h, * Read an (u)int32_t. * * @param h hande to open file - * @param what describes what is being read (for error message creation) + * @param file name of the source file + * @param line line number in the source file * @param i address of 32-bit integer to read * @return GNUNET_OK on success, GNUNET_SYSERR on error */ int GNUNET_BIO_read_int32__ (struct GNUNET_BIO_ReadHandle *h, - const char *what, int32_t * i) + const char *file, + int line, + int32_t * i) { int32_t big; - if (GNUNET_OK != GNUNET_BIO_read (h, what, &big, sizeof (int32_t))) + if (GNUNET_OK != GNUNET_BIO_read_fn (h, file, line, &big, sizeof (int32_t))) return GNUNET_SYSERR; *i = ntohl (big); return GNUNET_OK; @@ -263,17 +301,20 @@ GNUNET_BIO_read_int32__ (struct GNUNET_BIO_ReadHandle *h, * Read an (u)int64_t. * * @param h hande to open file - * @param what describes what is being read (for error message creation) + * @param file name of the source file + * @param line line number in the source file * @param i address of 64-bit integer to read * @return GNUNET_OK on success, GNUNET_SYSERR on error */ int GNUNET_BIO_read_int64__ (struct GNUNET_BIO_ReadHandle *h, - const char *what, int64_t * i) + const char *file, + int line, + int64_t * i) { int64_t big; - if (GNUNET_OK != GNUNET_BIO_read (h, what, &big, sizeof (int64_t))) + if (GNUNET_OK != GNUNET_BIO_read_fn (h, file, line, &big, sizeof (int64_t))) return GNUNET_SYSERR; *i = GNUNET_ntohll (big); return GNUNET_OK; @@ -433,22 +474,14 @@ GNUNET_BIO_write_meta_data (struct GNUNET_BIO_WriteHandle *h, { ssize_t size; char *buf; - - size = GNUNET_CONTAINER_meta_data_get_serialized_size (m, - GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL - | - GNUNET_CONTAINER_META_DATA_SERIALIZE_NO_COMPRESS); - if (size == -1) - return GNUNET_SYSERR; - if (size > MAX_META_DATA) - size = MAX_META_DATA; - buf = GNUNET_malloc (size); + + if (m == NULL) + return GNUNET_BIO_write_int32 (h, 0); + buf = NULL; size = GNUNET_CONTAINER_meta_data_serialize (m, - buf, - size, - GNUNET_CONTAINER_META_DATA_SERIALIZE_PART - | - GNUNET_CONTAINER_META_DATA_SERIALIZE_NO_COMPRESS); + &buf, + MAX_META_DATA, + GNUNET_CONTAINER_META_DATA_SERIALIZE_PART); if (size == -1) { GNUNET_free (buf);