mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-03 20:02:04 +00:00
refdb and odb backends must provide free
function
As refdb and odb backends can be allocated by client code, libgit2 can’t know whether an alternative memory allocator was used, and thus should not try to call `git__free` on those objects. Instead, odb and refdb backend implementations must always provide their own `free` functions to ensure memory gets freed correctly.
This commit is contained in:
parent
ba1a5553e4
commit
d3b29fb94b
@ -83,6 +83,10 @@ struct git_odb_backend {
|
|||||||
git_odb_writepack **, git_odb_backend *, git_odb *odb,
|
git_odb_writepack **, git_odb_backend *, git_odb *odb,
|
||||||
git_transfer_progress_cb progress_cb, void *progress_payload);
|
git_transfer_progress_cb progress_cb, void *progress_payload);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees any resources held by the odb (including the `git_odb_backend`
|
||||||
|
* itself). An odb backend implementation must provide this function.
|
||||||
|
*/
|
||||||
void (* free)(git_odb_backend *);
|
void (* free)(git_odb_backend *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -130,8 +130,8 @@ struct git_refdb_backend {
|
|||||||
int (*ensure_log)(git_refdb_backend *backend, const char *refname);
|
int (*ensure_log)(git_refdb_backend *backend, const char *refname);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Frees any resources held by the refdb. A refdb implementation may
|
* Frees any resources held by the refdb (including the `git_refdb_backend`
|
||||||
* provide this function; if it is not provided, nothing will be done.
|
* itself). A refdb backend implementation must provide this function.
|
||||||
*/
|
*/
|
||||||
void (*free)(git_refdb_backend *backend);
|
void (*free)(git_refdb_backend *backend);
|
||||||
|
|
||||||
|
@ -600,8 +600,7 @@ static void odb_free(git_odb *db)
|
|||||||
backend_internal *internal = git_vector_get(&db->backends, i);
|
backend_internal *internal = git_vector_get(&db->backends, i);
|
||||||
git_odb_backend *backend = internal->backend;
|
git_odb_backend *backend = internal->backend;
|
||||||
|
|
||||||
if (backend->free) backend->free(backend);
|
backend->free(backend);
|
||||||
else git__free(backend);
|
|
||||||
|
|
||||||
git__free(internal);
|
git__free(internal);
|
||||||
}
|
}
|
||||||
|
@ -61,12 +61,8 @@ int git_refdb_open(git_refdb **out, git_repository *repo)
|
|||||||
|
|
||||||
static void refdb_free_backend(git_refdb *db)
|
static void refdb_free_backend(git_refdb *db)
|
||||||
{
|
{
|
||||||
if (db->backend) {
|
if (db->backend)
|
||||||
if (db->backend->free)
|
db->backend->free(db->backend);
|
||||||
db->backend->free(db->backend);
|
|
||||||
else
|
|
||||||
git__free(db->backend);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_refdb_set_backend(git_refdb *db, git_refdb_backend *backend)
|
int git_refdb_set_backend(git_refdb *db, git_refdb_backend *backend)
|
||||||
|
@ -14,6 +14,7 @@ static git_odb_backend *new_backend(size_t position)
|
|||||||
if (b == NULL)
|
if (b == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
b->base.free = (void (*)(git_odb_backend *)) git__free;
|
||||||
b->base.version = GIT_ODB_BACKEND_VERSION;
|
b->base.version = GIT_ODB_BACKEND_VERSION;
|
||||||
b->position = position;
|
b->position = position;
|
||||||
return (git_odb_backend *)b;
|
return (git_odb_backend *)b;
|
||||||
|
Loading…
Reference in New Issue
Block a user