libsparse: Use 'size_t' for the 'len' parameter in callbacks.
This CL updates the callback function signature in
sparse_file_callback() and sparse_file_foreach_chunk().
Before:
int sparse_file_callback(
struct sparse_file *s, bool sparse, bool crc,
int (*write)(void *priv, const void *data, int len), void *priv);
int sparse_file_foreach_chunk(
struct sparse_file *s, bool sparse, bool crc,
int (*write)(
void *priv, const void *data, int len, unsigned int block,
unsigned int nr_blocks),
void *priv);
After:
int sparse_file_callback(
struct sparse_file *s, bool sparse, bool crc,
int (*write)(void *priv, const void *data, size_t len), void *priv);
int sparse_file_foreach_chunk(
struct sparse_file *s, bool sparse, bool crc,
int (*write)(
void *priv, const void *data, size_t len, unsigned int block,
unsigned int nr_blocks),
void *priv);
The length (i.e. 'len') comes from the size of a chunk, which could be
legitimately larger than INT_MAX. Prior to this CL, callers (e.g.
write_sparse_data_chunk()) were already passing unsigned int to the
callbacks. When a chunk size exceeds INT_MAX, the callback would see a
negative value, which could lead to undesired behavior. For example,
out_counter_write(), as one of the internal callbacks in libsparse,
gives a wrong sum of chunk sizes, which in turn fails the fastboot
flashing when given a huge sparse image.
It also defines SPARSE_CALLBACK_USES_SIZE_T that allows clients to keep
their codes compatibile with both versions.
Bug: 78432315
Test: `m dist` (with matching changes to all the clients)
Test: Build fastboot and successfully flash a previously failing (huge)
sparse image.
Change-Id: Iac4bcf7b57039d08af3c57f4be00d75f6b693d93
diff --git a/libsparse/output_file.c b/libsparse/output_file.c
index 51e60ef..002ad27 100644
--- a/libsparse/output_file.c
+++ b/libsparse/output_file.c
@@ -109,7 +109,7 @@
struct output_file_callback {
struct output_file out;
void *priv;
- int (*write)(void *priv, const void *buf, int len);
+ int (*write)(void *priv, const void *buf, size_t len);
};
#define to_output_file_callback(_o) \
@@ -634,7 +634,8 @@
return &outn->out;
}
-struct output_file *output_file_open_callback(int (*write)(void *, const void *, int),
+struct output_file *output_file_open_callback(
+ int (*write)(void *, const void *, size_t),
void *priv, unsigned int block_size, int64_t len,
int gz __unused, int sparse, int chunks, int crc)
{