summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compiler/blob.c10
-rw-r--r--src/compiler/blob.h18
-rw-r--r--src/compiler/glsl/tests/blob_test.c4
3 files changed, 12 insertions, 20 deletions
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;