]> git.proxmox.com Git - libgit2.git/commitdiff
refdb and odb backends must provide `free` function
authorArthur Schreiber <schreiber.arthur@googlemail.com>
Wed, 30 Sep 2015 22:50:37 +0000 (00:50 +0200)
committerArthur Schreiber <schreiber.arthur@googlemail.com>
Wed, 30 Sep 2015 22:50:37 +0000 (00:50 +0200)
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.

include/git2/sys/odb_backend.h
include/git2/sys/refdb_backend.h
src/odb.c
src/refdb.c
tests/odb/sorting.c

index fe102ff3cab1513e1af11f3017d72c4eb533a8f6..e423a92360a664eee73c02c6a49302d91bda9f3f 100644 (file)
@@ -83,6 +83,10 @@ struct git_odb_backend {
                git_odb_writepack **, git_odb_backend *, git_odb *odb,
                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 *);
 };
 
index 01fce80096e7b26dcca0baf51c97665a085159e9..5129ad84a7841d3ccc6ed0caa62ea94afe4e7991 100644 (file)
@@ -130,8 +130,8 @@ struct git_refdb_backend {
        int (*ensure_log)(git_refdb_backend *backend, const char *refname);
 
        /**
-        * Frees any resources held by the refdb.  A refdb implementation may
-        * provide this function; if it is not provided, nothing will be done.
+        * Frees any resources held by the refdb (including the `git_refdb_backend`
+        * itself). A refdb backend implementation must provide this function.
         */
        void (*free)(git_refdb_backend *backend);
 
index b2d635109cbaa7650db80c60ec2a0aac1225d594..2b2c35fe88e8335000a7462c3ec4d0785bf7c87e 100644 (file)
--- a/src/odb.c
+++ b/src/odb.c
@@ -600,8 +600,7 @@ static void odb_free(git_odb *db)
                backend_internal *internal = git_vector_get(&db->backends, i);
                git_odb_backend *backend = internal->backend;
 
-               if (backend->free) backend->free(backend);
-               else git__free(backend);
+               backend->free(backend);
 
                git__free(internal);
        }
index 16fb519a69881b0d506f707a378166dc2ecff49f..debba1276a5a26dd7757b8084d98d885a738fac5 100644 (file)
@@ -61,12 +61,8 @@ int git_refdb_open(git_refdb **out, git_repository *repo)
 
 static void refdb_free_backend(git_refdb *db)
 {
-       if (db->backend) {
-               if (db->backend->free)
-                       db->backend->free(db->backend);
-               else
-                       git__free(db->backend);
-       }
+       if (db->backend)
+               db->backend->free(db->backend);
 }
 
 int git_refdb_set_backend(git_refdb *db, git_refdb_backend *backend)
index 147a160c873c8722add14afb486333771df99075..d24c49c6937d79cd2634119048bf7251bf7349e5 100644 (file)
@@ -14,6 +14,7 @@ static git_odb_backend *new_backend(size_t position)
        if (b == NULL)
                return NULL;
 
+       b->base.free = (void (*)(git_odb_backend *)) git__free;
        b->base.version = GIT_ODB_BACKEND_VERSION;
        b->position = position;
        return (git_odb_backend *)b;