size_t to_write)
{
/* Detect an attempt to overwrite data out of bounds. */
- if (blob->size < offset + to_write)
+ if (offset + to_write < offset || blob->size < offset + to_write)
return false;
VG(VALGRIND_CHECK_MEM_IS_DEFINED(bytes, to_write));
return true;
}
-uint8_t *
+ssize_t
blob_reserve_bytes(struct blob *blob, size_t to_write)
{
- uint8_t *ret;
+ ssize_t ret;
if (! grow_to_fit (blob, to_write))
- return NULL;
+ return -1;
- ret = blob->data + blob->size;
+ ret = blob->size;
blob->size += to_write;
return ret;
* Reserve space in \blob for a number of bytes.
*
* Space will be allocated within the blob for these byes, but the bytes will
- * be left uninitialized. The caller is expected to use the return value to
- * write directly (and immediately) to these bytes.
+ * be left uninitialized. The caller is expected to use \sa
+ * blob_overwrite_bytes to write to these bytes.
*
- * \note The return value is valid immediately upon return, but can be
- * invalidated by any other call to a blob function. So the caller should call
- * blob_reserve_byes immediately before writing through the returned pointer.
- *
- * This function is intended to be used when interfacing with an existing API
- * that is not aware of the blob API, (so that blob_write_bytes cannot be
- * called).
- *
- * \return A pointer to space allocated within \blob to which \to_write bytes
- * can be written, (or NULL in case of any allocation error).
+ * \return An offset to space allocated within \blob to which \to_write bytes
+ * can be written, (or -1 in case of any allocation error).
*/
-uint8_t *
+ssize_t
blob_reserve_bytes(struct blob *blob, size_t to_write);
/**
{
struct blob blob;
struct blob_reader reader;
- uint8_t *reserved;
+ ssize_t reserved;
size_t str_offset, uint_offset;
uint8_t reserve_buf[sizeof(reserve_test_str)];
blob_write_bytes(&blob, bytes_test_str, sizeof(bytes_test_str));
reserved = blob_reserve_bytes(&blob, sizeof(reserve_test_str));
- memcpy(reserved, reserve_test_str, sizeof(reserve_test_str));
+ blob_overwrite_bytes(&blob, reserved, reserve_test_str, sizeof(reserve_test_str));
/* Write a placeholder, (to be replaced later via overwrite_bytes) */
str_offset = blob.size;