mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-09 22:39:38 +00:00
Merge pull request #2584 from jacquesg/pool-alignment
Pool/Index data is not aligned
This commit is contained in:
commit
89602a1a23
@ -35,6 +35,14 @@
|
|||||||
# define GIT_TYPEOF(x)
|
# define GIT_TYPEOF(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
# define GIT_ALIGN(x,size) x __attribute__ ((aligned(size)))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
# define GIT_ALIGN(x,size) __declspec(align(size)) x
|
||||||
|
#else
|
||||||
|
# define GIT_ALIGN(x,size) x
|
||||||
|
#endif
|
||||||
|
|
||||||
#define GIT_UNUSED(x) ((void)(x))
|
#define GIT_UNUSED(x) ((void)(x))
|
||||||
|
|
||||||
/* Define the printf format specifer to use for size_t output */
|
/* Define the printf format specifer to use for size_t output */
|
||||||
|
@ -274,6 +274,7 @@ int git_diff_foreach(
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
memset(&xo, 0, sizeof(xo));
|
memset(&xo, 0, sizeof(xo));
|
||||||
|
memset(&patch, 0, sizeof(patch));
|
||||||
diff_output_init(
|
diff_output_init(
|
||||||
&xo.output, &diff->opts, file_cb, hunk_cb, data_cb, payload);
|
&xo.output, &diff->opts, file_cb, hunk_cb, data_cb, payload);
|
||||||
git_xdiff_init(&xo, &diff->opts);
|
git_xdiff_init(&xo, &diff->opts);
|
||||||
|
53
src/index.c
53
src/index.c
@ -1767,35 +1767,42 @@ static size_t read_entry(
|
|||||||
git_index_entry **out, const void *buffer, size_t buffer_size)
|
git_index_entry **out, const void *buffer, size_t buffer_size)
|
||||||
{
|
{
|
||||||
size_t path_length, entry_size;
|
size_t path_length, entry_size;
|
||||||
uint16_t flags_raw;
|
|
||||||
const char *path_ptr;
|
const char *path_ptr;
|
||||||
const struct entry_short *source = buffer;
|
struct entry_short source;
|
||||||
git_index_entry entry = {{0}};
|
git_index_entry entry = {{0}};
|
||||||
|
|
||||||
if (INDEX_FOOTER_SIZE + minimal_entry_size > buffer_size)
|
if (INDEX_FOOTER_SIZE + minimal_entry_size > buffer_size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
entry.ctime.seconds = (git_time_t)ntohl(source->ctime.seconds);
|
/* buffer is not guaranteed to be aligned */
|
||||||
entry.ctime.nanoseconds = ntohl(source->ctime.nanoseconds);
|
memcpy(&source, buffer, sizeof(struct entry_short));
|
||||||
entry.mtime.seconds = (git_time_t)ntohl(source->mtime.seconds);
|
|
||||||
entry.mtime.nanoseconds = ntohl(source->mtime.nanoseconds);
|
entry.ctime.seconds = (git_time_t)ntohl(source.ctime.seconds);
|
||||||
entry.dev = ntohl(source->dev);
|
entry.ctime.nanoseconds = ntohl(source.ctime.nanoseconds);
|
||||||
entry.ino = ntohl(source->ino);
|
entry.mtime.seconds = (git_time_t)ntohl(source.mtime.seconds);
|
||||||
entry.mode = ntohl(source->mode);
|
entry.mtime.nanoseconds = ntohl(source.mtime.nanoseconds);
|
||||||
entry.uid = ntohl(source->uid);
|
entry.dev = ntohl(source.dev);
|
||||||
entry.gid = ntohl(source->gid);
|
entry.ino = ntohl(source.ino);
|
||||||
entry.file_size = ntohl(source->file_size);
|
entry.mode = ntohl(source.mode);
|
||||||
git_oid_cpy(&entry.id, &source->oid);
|
entry.uid = ntohl(source.uid);
|
||||||
entry.flags = ntohs(source->flags);
|
entry.gid = ntohl(source.gid);
|
||||||
|
entry.file_size = ntohl(source.file_size);
|
||||||
|
git_oid_cpy(&entry.id, &source.oid);
|
||||||
|
entry.flags = ntohs(source.flags);
|
||||||
|
|
||||||
if (entry.flags & GIT_IDXENTRY_EXTENDED) {
|
if (entry.flags & GIT_IDXENTRY_EXTENDED) {
|
||||||
const struct entry_long *source_l = (const struct entry_long *)source;
|
uint16_t flags_raw;
|
||||||
path_ptr = source_l->path;
|
size_t flags_offset;
|
||||||
|
|
||||||
flags_raw = ntohs(source_l->flags_extended);
|
flags_offset = offsetof(struct entry_long, flags_extended);
|
||||||
memcpy(&entry.flags_extended, &flags_raw, 2);
|
memcpy(&flags_raw, (const char *) buffer + flags_offset,
|
||||||
|
sizeof(flags_raw));
|
||||||
|
flags_raw = ntohs(flags_raw);
|
||||||
|
|
||||||
|
memcpy(&entry.flags_extended, &flags_raw, sizeof(flags_raw));
|
||||||
|
path_ptr = (const char *) buffer + offsetof(struct entry_long, path);
|
||||||
} else
|
} else
|
||||||
path_ptr = source->path;
|
path_ptr = (const char *) buffer + offsetof(struct entry_short, path);
|
||||||
|
|
||||||
path_length = entry.flags & GIT_IDXENTRY_NAMEMASK;
|
path_length = entry.flags & GIT_IDXENTRY_NAMEMASK;
|
||||||
|
|
||||||
@ -1846,14 +1853,12 @@ static int read_header(struct index_header *dest, const void *buffer)
|
|||||||
|
|
||||||
static size_t read_extension(git_index *index, const char *buffer, size_t buffer_size)
|
static size_t read_extension(git_index *index, const char *buffer, size_t buffer_size)
|
||||||
{
|
{
|
||||||
const struct index_extension *source;
|
|
||||||
struct index_extension dest;
|
struct index_extension dest;
|
||||||
size_t total_size;
|
size_t total_size;
|
||||||
|
|
||||||
source = (const struct index_extension *)(buffer);
|
/* buffer is not guaranteed to be aligned */
|
||||||
|
memcpy(&dest, buffer, sizeof(struct index_extension));
|
||||||
memcpy(dest.signature, source->signature, 4);
|
dest.extension_size = ntohl(dest.extension_size);
|
||||||
dest.extension_size = ntohl(source->extension_size);
|
|
||||||
|
|
||||||
total_size = dest.extension_size + sizeof(struct index_extension);
|
total_size = dest.extension_size + sizeof(struct index_extension);
|
||||||
|
|
||||||
|
@ -620,7 +620,7 @@ int git_packfile_unpack(
|
|||||||
struct pack_chain_elem *elem = NULL, *stack;
|
struct pack_chain_elem *elem = NULL, *stack;
|
||||||
git_pack_cache_entry *cached = NULL;
|
git_pack_cache_entry *cached = NULL;
|
||||||
struct pack_chain_elem small_stack[SMALL_STACK_SIZE];
|
struct pack_chain_elem small_stack[SMALL_STACK_SIZE];
|
||||||
size_t stack_size, elem_pos;
|
size_t stack_size = 0, elem_pos;
|
||||||
git_otype base_type;
|
git_otype base_type;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -7,7 +7,7 @@ struct git_pool_page {
|
|||||||
git_pool_page *next;
|
git_pool_page *next;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint32_t avail;
|
uint32_t avail;
|
||||||
char data[GIT_FLEX_ARRAY];
|
GIT_ALIGN(char data[GIT_FLEX_ARRAY], 8);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pool_freelist {
|
struct pool_freelist {
|
||||||
|
@ -327,7 +327,7 @@ int merge_test_reuc(git_index *index, const struct merge_reuc_entry expected[],
|
|||||||
|
|
||||||
int dircount(void *payload, git_buf *pathbuf)
|
int dircount(void *payload, git_buf *pathbuf)
|
||||||
{
|
{
|
||||||
int *entries = payload;
|
size_t *entries = payload;
|
||||||
size_t len = git_buf_len(pathbuf);
|
size_t len = git_buf_len(pathbuf);
|
||||||
|
|
||||||
if (len < 5 || strcmp(pathbuf->ptr + (git_buf_len(pathbuf) - 5), "/.git") != 0)
|
if (len < 5 || strcmp(pathbuf->ptr + (git_buf_len(pathbuf) - 5), "/.git") != 0)
|
||||||
|
@ -87,7 +87,7 @@ void test_odb_foreach__files_in_objects_dir(void)
|
|||||||
git_repository *repo;
|
git_repository *repo;
|
||||||
git_odb *odb;
|
git_odb *odb;
|
||||||
git_buf buf = GIT_BUF_INIT;
|
git_buf buf = GIT_BUF_INIT;
|
||||||
size_t nobj = 0;
|
int nobj = 0;
|
||||||
|
|
||||||
cl_fixture_sandbox("testrepo.git");
|
cl_fixture_sandbox("testrepo.git");
|
||||||
cl_git_pass(git_repository_open(&repo, "testrepo.git"));
|
cl_git_pass(git_repository_open(&repo, "testrepo.git"));
|
||||||
|
@ -47,7 +47,7 @@ void test_pack_packbuilder__cleanup(void)
|
|||||||
git_indexer_free(_indexer);
|
git_indexer_free(_indexer);
|
||||||
_indexer = NULL;
|
_indexer = NULL;
|
||||||
|
|
||||||
p_chdir("..");
|
cl_git_pass(p_chdir(".."));
|
||||||
cl_git_sandbox_cleanup();
|
cl_git_sandbox_cleanup();
|
||||||
_repo = NULL;
|
_repo = NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user