X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fbio.c;h=059638ff1f492414c25a1ac1db9abe65dbe7aab9;hb=0ea8e006d5f5ef84e31e000607bd24a23f8fc1ed;hp=1143e89de82c70577cdb8065ba5ec7e515fe1bd8;hpb=3e697f238da8de2bc490d33da0660afc1dd14fbf;p=oweals%2Fgnunet.git diff --git a/src/util/bio.c b/src/util/bio.c index 1143e89de..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,13 +239,17 @@ 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, - _ - ("Serialized metadata `%s' larger than allowed (%u > %u)"), + _("Serialized metadata `%s' larger than allowed (%u>%u)"), what, size, MAX_META_DATA); return GNUNET_SYSERR; } @@ -243,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; @@ -264,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; @@ -432,24 +472,23 @@ int GNUNET_BIO_write_meta_data (struct GNUNET_BIO_WriteHandle *h, const struct GNUNET_CONTAINER_MetaData *m) { - unsigned int size; + 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 > MAX_META_DATA) - size = MAX_META_DATA; - buf = GNUNET_malloc (size); - GNUNET_CONTAINER_meta_data_serialize (m, - buf, - size, - GNUNET_CONTAINER_META_DATA_SERIALIZE_PART - | - GNUNET_CONTAINER_META_DATA_SERIALIZE_NO_COMPRESS); - if ((GNUNET_OK != GNUNET_BIO_write_int32 (h, size)) - || (GNUNET_OK != GNUNET_BIO_write (h, buf, size))) + + if (m == NULL) + return GNUNET_BIO_write_int32 (h, 0); + buf = NULL; + size = GNUNET_CONTAINER_meta_data_serialize (m, + &buf, + MAX_META_DATA, + GNUNET_CONTAINER_META_DATA_SERIALIZE_PART); + if (size == -1) + { + GNUNET_free (buf); + return GNUNET_SYSERR; + } + if ( (GNUNET_OK != GNUNET_BIO_write_int32 (h, (uint32_t) size)) || + (GNUNET_OK != GNUNET_BIO_write (h, buf, size)) ) { GNUNET_free (buf); return GNUNET_SYSERR;