Commit d6b97cbb by Edward Thomson

Merge pull request #2596 from libgit2/cmn/maint-21

Add a few backports to 0.21 maintenance
parents 59fbaa4b 05713621
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "git2/notes.h" #include "git2/notes.h"
#include "git2/object.h" #include "git2/object.h"
#include "git2/odb.h" #include "git2/odb.h"
#include "git2/odb_backend.h"
#include "git2/oid.h" #include "git2/oid.h"
#include "git2/pack.h" #include "git2/pack.h"
#include "git2/patch.h" #include "git2/patch.h"
......
...@@ -35,6 +35,14 @@ ...@@ -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 */
......
...@@ -1163,7 +1163,7 @@ static int strip_comments(char *line, int in_quotes) ...@@ -1163,7 +1163,7 @@ static int strip_comments(char *line, int in_quotes)
} }
/* skip any space at the end */ /* skip any space at the end */
if (ptr > line && git__isspace(ptr[-1])) { while (ptr > line && git__isspace(ptr[-1])) {
ptr--; ptr--;
} }
ptr[0] = '\0'; ptr[0] = '\0';
......
...@@ -274,6 +274,7 @@ int git_diff_foreach( ...@@ -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);
......
...@@ -38,7 +38,7 @@ struct git_filter_list { ...@@ -38,7 +38,7 @@ struct git_filter_list {
}; };
typedef struct { typedef struct {
const char *filter_name; char *filter_name;
git_filter *filter; git_filter *filter;
int priority; int priority;
int initialized; int initialized;
...@@ -75,6 +75,7 @@ static void filter_registry_shutdown(void) ...@@ -75,6 +75,7 @@ static void filter_registry_shutdown(void)
fdef->initialized = false; fdef->initialized = false;
} }
git__free(fdef->filter_name);
git__free(fdef->attrdata); git__free(fdef->attrdata);
git__free(fdef); git__free(fdef);
} }
...@@ -230,6 +231,8 @@ int git_filter_register( ...@@ -230,6 +231,8 @@ int git_filter_register(
size_t nattr = 0, nmatch = 0; size_t nattr = 0, nmatch = 0;
git_buf attrs = GIT_BUF_INIT; git_buf attrs = GIT_BUF_INIT;
assert(name && filter);
if (filter_registry_initialize() < 0) if (filter_registry_initialize() < 0)
return -1; return -1;
...@@ -246,7 +249,9 @@ int git_filter_register( ...@@ -246,7 +249,9 @@ int git_filter_register(
sizeof(git_filter_def) + 2 * nattr * sizeof(char *), 1); sizeof(git_filter_def) + 2 * nattr * sizeof(char *), 1);
GITERR_CHECK_ALLOC(fdef); GITERR_CHECK_ALLOC(fdef);
fdef->filter_name = name; fdef->filter_name = git__strdup(name);
GITERR_CHECK_ALLOC(fdef->filter_name);
fdef->filter = filter; fdef->filter = filter;
fdef->priority = priority; fdef->priority = priority;
fdef->nattrs = nattr; fdef->nattrs = nattr;
...@@ -256,6 +261,7 @@ int git_filter_register( ...@@ -256,6 +261,7 @@ int git_filter_register(
filter_def_set_attrs(fdef); filter_def_set_attrs(fdef);
if (git_vector_insert(&git__filter_registry->filters, fdef) < 0) { if (git_vector_insert(&git__filter_registry->filters, fdef) < 0) {
git__free(fdef->filter_name);
git__free(fdef->attrdata); git__free(fdef->attrdata);
git__free(fdef); git__free(fdef);
return -1; return -1;
...@@ -270,6 +276,8 @@ int git_filter_unregister(const char *name) ...@@ -270,6 +276,8 @@ int git_filter_unregister(const char *name)
size_t pos; size_t pos;
git_filter_def *fdef; git_filter_def *fdef;
assert(name);
/* cannot unregister default filters */ /* cannot unregister default filters */
if (!strcmp(GIT_FILTER_CRLF, name) || !strcmp(GIT_FILTER_IDENT, name)) { if (!strcmp(GIT_FILTER_CRLF, name) || !strcmp(GIT_FILTER_IDENT, name)) {
giterr_set(GITERR_FILTER, "Cannot unregister filter '%s'", name); giterr_set(GITERR_FILTER, "Cannot unregister filter '%s'", name);
...@@ -288,6 +296,7 @@ int git_filter_unregister(const char *name) ...@@ -288,6 +296,7 @@ int git_filter_unregister(const char *name)
fdef->initialized = false; fdef->initialized = false;
} }
git__free(fdef->filter_name);
git__free(fdef->attrdata); git__free(fdef->attrdata);
git__free(fdef); git__free(fdef);
......
...@@ -221,6 +221,9 @@ int init_error = 0; ...@@ -221,6 +221,9 @@ int init_error = 0;
static void cb__free_status(void *st) static void cb__free_status(void *st)
{ {
git_global_st *state = (git_global_st *) st;
git__free(state->error_t.message);
git__free(st); git__free(st);
} }
......
...@@ -1767,35 +1767,42 @@ static size_t read_entry( ...@@ -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) ...@@ -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);
......
...@@ -460,7 +460,7 @@ int gitno_connect(gitno_socket *s_out, const char *host, const char *port, int f ...@@ -460,7 +460,7 @@ int gitno_connect(gitno_socket *s_out, const char *host, const char *port, int f
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_UNSPEC; hints.ai_family = AF_UNSPEC;
if ((ret = p_getaddrinfo(host, port, &hints, &info)) < 0) { if ((ret = p_getaddrinfo(host, port, &hints, &info)) != 0) {
giterr_set(GITERR_NET, giterr_set(GITERR_NET,
"Failed to resolve address for %s: %s", host, p_gai_strerror(ret)); "Failed to resolve address for %s: %s", host, p_gai_strerror(ret));
return -1; return -1;
......
...@@ -620,7 +620,7 @@ int git_packfile_unpack( ...@@ -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 { ...@@ -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 {
......
...@@ -1057,16 +1057,20 @@ static int update_tips_for_spec( ...@@ -1057,16 +1057,20 @@ static int update_tips_for_spec(
if (autotag && !git_odb_exists(odb, &head->oid)) if (autotag && !git_odb_exists(odb, &head->oid))
continue; continue;
if (git_vector_insert(&update_heads, head) < 0) if (!autotag && git_vector_insert(&update_heads, head) < 0)
goto on_error; goto on_error;
error = git_reference_name_to_id(&old, remote->repo, refname.ptr); error = git_reference_name_to_id(&old, remote->repo, refname.ptr);
if (error < 0 && error != GIT_ENOTFOUND) if (error < 0 && error != GIT_ENOTFOUND)
goto on_error; goto on_error;
if (error == GIT_ENOTFOUND) if (error == GIT_ENOTFOUND) {
memset(&old, 0, GIT_OID_RAWSZ); memset(&old, 0, GIT_OID_RAWSZ);
if (autotag && git_vector_insert(&update_heads, head) < 0)
goto on_error;
}
if (!git_oid__cmp(&old, &head->oid)) if (!git_oid__cmp(&old, &head->oid))
continue; continue;
......
...@@ -232,7 +232,8 @@ static int build_untracked_tree( ...@@ -232,7 +232,8 @@ static int build_untracked_tree(
} }
if (flags & GIT_STASH_INCLUDE_IGNORED) { if (flags & GIT_STASH_INCLUDE_IGNORED) {
opts.flags |= GIT_DIFF_INCLUDE_IGNORED; opts.flags |= GIT_DIFF_INCLUDE_IGNORED |
GIT_DIFF_RECURSE_IGNORED_DIRS;
data.include_ignored = true; data.include_ignored = true;
} }
...@@ -447,10 +448,11 @@ static int ensure_there_are_changes_to_stash( ...@@ -447,10 +448,11 @@ static int ensure_there_are_changes_to_stash(
if (include_untracked_files) if (include_untracked_files)
opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED | opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED |
GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
if (include_ignored_files) if (include_ignored_files)
opts.flags |= GIT_STATUS_OPT_INCLUDE_IGNORED; opts.flags |= GIT_STATUS_OPT_INCLUDE_IGNORED |
GIT_STATUS_OPT_RECURSE_IGNORED_DIRS;
error = git_status_foreach_ext(repo, &opts, is_dirty_cb, NULL); error = git_status_foreach_ext(repo, &opts, is_dirty_cb, NULL);
......
...@@ -16,6 +16,11 @@ ...@@ -16,6 +16,11 @@
"8f50ba15d49353813cc6e20298002c0d17b0a9ee\tnot-for-merge\ttag 'commit_tree' of git://github.com/libgit2/TestGitRepository\n" \ "8f50ba15d49353813cc6e20298002c0d17b0a9ee\tnot-for-merge\ttag 'commit_tree' of git://github.com/libgit2/TestGitRepository\n" \
"6e0c7bdb9b4ed93212491ee778ca1c65047cab4e\tnot-for-merge\ttag 'nearly-dangling' of git://github.com/libgit2/TestGitRepository\n" "6e0c7bdb9b4ed93212491ee778ca1c65047cab4e\tnot-for-merge\ttag 'nearly-dangling' of git://github.com/libgit2/TestGitRepository\n"
#define FETCH_HEAD_WILDCARD_DATA2 \
"49322bb17d3acc9146f98c97d078513228bbf3c0\t\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \
"0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \
"42e4e7c5e507e113ebbb7801b16b52cf867b7ce1\tnot-for-merge\tbranch 'no-parent' of git://github.com/libgit2/TestGitRepository\n" \
#define FETCH_HEAD_NO_MERGE_DATA \ #define FETCH_HEAD_NO_MERGE_DATA \
"0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \ "0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \
"49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \ "49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \
...@@ -25,6 +30,16 @@ ...@@ -25,6 +30,16 @@
"8f50ba15d49353813cc6e20298002c0d17b0a9ee\tnot-for-merge\ttag 'commit_tree' of git://github.com/libgit2/TestGitRepository\n" \ "8f50ba15d49353813cc6e20298002c0d17b0a9ee\tnot-for-merge\ttag 'commit_tree' of git://github.com/libgit2/TestGitRepository\n" \
"6e0c7bdb9b4ed93212491ee778ca1c65047cab4e\tnot-for-merge\ttag 'nearly-dangling' of git://github.com/libgit2/TestGitRepository\n" "6e0c7bdb9b4ed93212491ee778ca1c65047cab4e\tnot-for-merge\ttag 'nearly-dangling' of git://github.com/libgit2/TestGitRepository\n"
#define FETCH_HEAD_NO_MERGE_DATA2 \
"0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \
"49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \
"42e4e7c5e507e113ebbb7801b16b52cf867b7ce1\tnot-for-merge\tbranch 'no-parent' of git://github.com/libgit2/TestGitRepository\n" \
#define FETCH_HEAD_NO_MERGE_DATA3 \
"0966a434eb1a025db6b71485ab63a3bfbea520b6\tnot-for-merge\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" \
"49322bb17d3acc9146f98c97d078513228bbf3c0\tnot-for-merge\tbranch 'master' of git://github.com/libgit2/TestGitRepository\n" \
"42e4e7c5e507e113ebbb7801b16b52cf867b7ce1\tnot-for-merge\tbranch 'no-parent' of git://github.com/libgit2/TestGitRepository\n" \
"8f50ba15d49353813cc6e20298002c0d17b0a9ee\tnot-for-merge\ttag 'commit_tree' of git://github.com/libgit2/TestGitRepository\n" \
#define FETCH_HEAD_EXPLICIT_DATA \ #define FETCH_HEAD_EXPLICIT_DATA \
"0966a434eb1a025db6b71485ab63a3bfbea520b6\t\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n" "0966a434eb1a025db6b71485ab63a3bfbea520b6\t\tbranch 'first-merge' of git://github.com/libgit2/TestGitRepository\n"
......
...@@ -327,7 +327,7 @@ int merge_test_reuc(git_index *index, const struct merge_reuc_entry expected[], ...@@ -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) ...@@ -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"));
......
...@@ -67,6 +67,11 @@ static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fet ...@@ -67,6 +67,11 @@ static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fet
void test_online_fetchhead__wildcard_spec(void) void test_online_fetchhead__wildcard_spec(void)
{ {
fetchhead_test_clone(); fetchhead_test_clone();
fetchhead_test_fetch(NULL, FETCH_HEAD_WILDCARD_DATA2);
cl_git_pass(git_tag_delete(g_repo, "annotated_tag"));
cl_git_pass(git_tag_delete(g_repo, "blob"));
cl_git_pass(git_tag_delete(g_repo, "commit_tree"));
cl_git_pass(git_tag_delete(g_repo, "nearly-dangling"));
fetchhead_test_fetch(NULL, FETCH_HEAD_WILDCARD_DATA); fetchhead_test_fetch(NULL, FETCH_HEAD_WILDCARD_DATA);
} }
...@@ -87,5 +92,12 @@ void test_online_fetchhead__no_merges(void) ...@@ -87,5 +92,12 @@ void test_online_fetchhead__no_merges(void)
cl_git_pass(git_config_delete_entry(config, "branch.master.merge")); cl_git_pass(git_config_delete_entry(config, "branch.master.merge"));
git_config_free(config); git_config_free(config);
fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA2);
cl_git_pass(git_tag_delete(g_repo, "annotated_tag"));
cl_git_pass(git_tag_delete(g_repo, "blob"));
cl_git_pass(git_tag_delete(g_repo, "commit_tree"));
cl_git_pass(git_tag_delete(g_repo, "nearly-dangling"));
fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA); fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA);
cl_git_pass(git_tag_delete(g_repo, "commit_tree"));
fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA3);
} }
...@@ -47,7 +47,7 @@ void test_pack_packbuilder__cleanup(void) ...@@ -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;
} }
......
#include "clar_libgit2.h" #include "clar_libgit2.h"
#include "thread_helpers.h"
#include "cache.h" #include "cache.h"
...@@ -34,3 +35,16 @@ void test_threads_basic__multiple_init(void) ...@@ -34,3 +35,16 @@ void test_threads_basic__multiple_init(void)
cl_git_pass(git_repository_open(&nested_repo, cl_fixture("testrepo.git"))); cl_git_pass(git_repository_open(&nested_repo, cl_fixture("testrepo.git")));
git_repository_free(nested_repo); git_repository_free(nested_repo);
} }
static void *set_error(void *dummy)
{
giterr_set(GITERR_INVALID, "oh no, something happened!\n");
return dummy;
}
/* Set errors so we can check that we free it */
void test_threads_basic__set_error(void)
{
run_in_parallel(1, 4, set_error, NULL, NULL);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment