diff --git a/src/compiler/blob.c b/src/compiler/blob.c index f3ff5d6862e..65c450ee979 100644 --- a/src/compiler/blob.c +++ b/src/compiler/blob.c @@ -132,7 +132,7 @@ blob_overwrite_bytes(struct blob *blob, 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)); @@ -158,15 +158,15 @@ blob_write_bytes(struct blob *blob, const void *bytes, size_t 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; diff --git a/src/compiler/blob.h b/src/compiler/blob.h index ec80b78284c..72a601d5345 100644 --- a/src/compiler/blob.h +++ b/src/compiler/blob.h @@ -129,21 +129,13 @@ blob_write_bytes(struct blob *blob, const void *bytes, size_t to_write); * 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); /** diff --git a/src/compiler/glsl/tests/blob_test.c b/src/compiler/glsl/tests/blob_test.c index d49f4a02cf9..0b4955b6b68 100644 --- a/src/compiler/glsl/tests/blob_test.c +++ b/src/compiler/glsl/tests/blob_test.c @@ -120,7 +120,7 @@ test_write_and_read_functions (void) { 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)]; @@ -131,7 +131,7 @@ test_write_and_read_functions (void) 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;