Commit 459ac856 by Edward Thomson

odb: provide a free function for custom backends

Custom backends can allocate memory when reading objects and providing
them to libgit2.  However, if an error occurs in the custom backend
after the memory has been allocated for the custom object but before
it's returned to libgit2, the custom backend has no way to free that
memory and it must be leaked.

Provide a free function that corresponds to the alloc function so that
custom backends have an opportunity to free memory before they return an
error.
parent 790aae77
...@@ -131,6 +131,17 @@ GIT_EXTERN(int) git_odb_init_backend( ...@@ -131,6 +131,17 @@ GIT_EXTERN(int) git_odb_init_backend(
*/ */
GIT_EXTERN(void *) git_odb_backend_data_alloc(git_odb_backend *backend, size_t len); GIT_EXTERN(void *) git_odb_backend_data_alloc(git_odb_backend *backend, size_t len);
/**
* Frees custom allocated ODB data. This should only be called when
* memory allocated using git_odb_backend_data_alloc is not returned
* to libgit2 because the backend encountered an error in the read
* function after allocation and did not return this data to libgit2.
*
* @param backend the ODB backend that is freeing this memory
* @param data the buffer to free
*/
GIT_EXTERN(void) git_odb_backend_data_free(git_odb_backend *backend, void *data);
/* /*
* Users can avoid deprecated functions by defining `GIT_DEPRECATE_HARD`. * Users can avoid deprecated functions by defining `GIT_DEPRECATE_HARD`.
......
...@@ -1508,6 +1508,12 @@ void *git_odb_backend_malloc(git_odb_backend *backend, size_t len) ...@@ -1508,6 +1508,12 @@ void *git_odb_backend_malloc(git_odb_backend *backend, size_t len)
return git_odb_backend_data_alloc(backend, len); return git_odb_backend_data_alloc(backend, len);
} }
void git_odb_backend_data_free(git_odb_backend *backend, void *data)
{
GIT_UNUSED(backend);
git__free(data);
}
int git_odb_refresh(struct git_odb *db) int git_odb_refresh(struct git_odb *db)
{ {
size_t i; size_t i;
......
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