mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
odb: teach read_blob_entry to use size_t
There is mixed use of size_t and unsigned long to deal with sizes in the codebase. Recall that Windows defines unsigned long as 32 bits even on 64-bit platforms, meaning that converting size_t to unsigned long narrows the range. This mostly doesn't cause a problem since Git rarely deals with files larger than 2^32 bytes. But adjunct systems such as Git LFS, which use smudge/clean filters to keep huge files out of the repository, may have huge file contents passed through some of the functions in entry.c and convert.c. On Windows, this results in a truncated file being written to the workdir. I traced this to one specific use of unsigned long in write_entry (and a similar instance in write_pc_item_to_fd for parallel checkout). That appeared to be for the call to read_blob_entry, which expects a pointer to unsigned long. By altering the signature of read_blob_entry to expect a size_t, write_entry can be switched to use size_t internally (which all of its callers and most of its callees already used). To avoid touching dozens of additional files, read_blob_entry uses a local unsigned long to call a chain of functions which aren't prepared to accept size_t. Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Matt Cooper <vtbassmatt@gmail.com> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
b79541af7a
commit
e9aa762cc7
8
entry.c
8
entry.c
@@ -82,11 +82,13 @@ static int create_file(const char *path, unsigned int mode)
|
||||
return open(path, O_WRONLY | O_CREAT | O_EXCL, mode);
|
||||
}
|
||||
|
||||
void *read_blob_entry(const struct cache_entry *ce, unsigned long *size)
|
||||
void *read_blob_entry(const struct cache_entry *ce, size_t *size)
|
||||
{
|
||||
enum object_type type;
|
||||
void *blob_data = read_object_file(&ce->oid, &type, size);
|
||||
unsigned long ul;
|
||||
void *blob_data = read_object_file(&ce->oid, &type, &ul);
|
||||
|
||||
*size = ul;
|
||||
if (blob_data) {
|
||||
if (type == OBJ_BLOB)
|
||||
return blob_data;
|
||||
@@ -270,7 +272,7 @@ static int write_entry(struct cache_entry *ce, char *path, struct conv_attrs *ca
|
||||
int fd, ret, fstat_done = 0;
|
||||
char *new_blob;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
unsigned long size;
|
||||
size_t size;
|
||||
ssize_t wrote;
|
||||
size_t newsize = 0;
|
||||
struct stat st;
|
||||
|
||||
Reference in New Issue
Block a user