[libgit2-glib] Add submodule invalidation to protect against invalid access



commit b5fab04f953e9fbb8774d754a1e854879663afee
Author: Jesse van den Kieboom <jessevdk gnome org>
Date:   Sat Aug 1 13:39:23 2015 +0200

    Add submodule invalidation to protect against invalid access

 libgit2-glib/ggit-repository.c |    1 +
 libgit2-glib/ggit-submodule.c  |   24 ++++++++++++++++++++++++
 libgit2-glib/ggit-submodule.h  |    1 +
 3 files changed, 26 insertions(+), 0 deletions(-)
---
diff --git a/libgit2-glib/ggit-repository.c b/libgit2-glib/ggit-repository.c
index 6596a12..f02e253 100644
--- a/libgit2-glib/ggit-repository.c
+++ b/libgit2-glib/ggit-repository.c
@@ -2009,6 +2009,7 @@ submodule_wrapper_callback (git_submodule *submodule,
 
        ret = wrapper_data->callback (gsubmodule, name, wrapper_data->user_data);
 
+       _ggit_submodule_invalidate (gsubmodule);
        ggit_submodule_unref (gsubmodule);
 
        return ret;
diff --git a/libgit2-glib/ggit-submodule.c b/libgit2-glib/ggit-submodule.c
index 0323e3f..8e49768 100644
--- a/libgit2-glib/ggit-submodule.c
+++ b/libgit2-glib/ggit-submodule.c
@@ -30,6 +30,7 @@ struct _GgitSubmodule
 {
        git_submodule *submodule;
        gint ref_count;
+       gboolean valid;
 };
 
 G_DEFINE_BOXED_TYPE (GgitSubmodule, ggit_submodule, ggit_submodule_ref, ggit_submodule_unref)
@@ -42,10 +43,18 @@ _ggit_submodule_wrap (const git_submodule *submodule)
        glib_submodule = g_slice_new (GgitSubmodule);
        glib_submodule->submodule = (git_submodule *)submodule;
        glib_submodule->ref_count = 1;
+       glib_submodule->valid = TRUE;
 
        return glib_submodule;
 }
 
+void
+_ggit_submodule_invalidate (GgitSubmodule *submodule)
+{
+       g_return_if_fail (submodule != NULL);
+       submodule->valid = FALSE;
+}
+
 /**
  * ggit_submodule_ref:
  * @submodule: a #GgitSubmodule.
@@ -59,6 +68,7 @@ GgitSubmodule *
 ggit_submodule_ref (GgitSubmodule *submodule)
 {
        g_return_val_if_fail (submodule != NULL, NULL);
+       g_return_val_if_fail (submodule->valid, NULL);
 
        g_atomic_int_inc (&submodule->ref_count);
 
@@ -103,6 +113,7 @@ ggit_submodule_open (GgitSubmodule  *submodule,
        gint ret;
 
        g_return_val_if_fail (submodule != NULL, NULL);
+       g_return_val_if_fail (submodule->valid, NULL);
        g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
        ret = git_submodule_open (&repo, submodule->submodule);
@@ -128,6 +139,7 @@ GgitRepository *
 ggit_submodule_get_owner (GgitSubmodule *submodule)
 {
        g_return_val_if_fail (submodule != NULL, NULL);
+       g_return_val_if_fail (submodule->valid, NULL);
 
        return _ggit_repository_wrap (git_submodule_owner (submodule->submodule),
                                      FALSE);
@@ -145,6 +157,7 @@ const gchar *
 ggit_submodule_get_name (GgitSubmodule *submodule)
 {
        g_return_val_if_fail (submodule != NULL, NULL);
+       g_return_val_if_fail (submodule->valid, NULL);
 
        return git_submodule_name (submodule->submodule);
 }
@@ -163,6 +176,7 @@ const gchar *
 ggit_submodule_get_path (GgitSubmodule *submodule)
 {
        g_return_val_if_fail (submodule != NULL, NULL);
+       g_return_val_if_fail (submodule->valid, NULL);
 
        return git_submodule_path (submodule->submodule);
 }
@@ -180,6 +194,7 @@ const gchar *
 ggit_submodule_get_url (GgitSubmodule *submodule)
 {
        g_return_val_if_fail (submodule != NULL, NULL);
+       g_return_val_if_fail (submodule->valid, NULL);
 
        return git_submodule_url (submodule->submodule);
 }
@@ -198,6 +213,7 @@ ggit_submodule_get_index_id (GgitSubmodule *submodule)
        GgitOId *oid = NULL;
 
        g_return_val_if_fail (submodule != NULL, NULL);
+       g_return_val_if_fail (submodule->valid, NULL);
 
        if (git_submodule_index_id (submodule->submodule))
        {
@@ -221,6 +237,7 @@ ggit_submodule_get_head_id (GgitSubmodule *submodule)
        GgitOId *oid = NULL;
 
        g_return_val_if_fail (submodule != NULL, NULL);
+       g_return_val_if_fail (submodule->valid, NULL);
 
        if (git_submodule_head_id (submodule->submodule))
        {
@@ -248,6 +265,7 @@ ggit_submodule_get_workdir_id (GgitSubmodule *submodule)
        GgitOId *oid = NULL;
 
        g_return_val_if_fail (submodule != NULL, NULL);
+       g_return_val_if_fail (submodule->valid, NULL);
 
        if (git_submodule_wd_id (submodule->submodule))
        {
@@ -269,6 +287,7 @@ GgitSubmoduleIgnore
 ggit_submodule_get_ignore (GgitSubmodule *submodule)
 {
        g_return_val_if_fail (submodule != NULL, 0);
+       g_return_val_if_fail (submodule->valid, 0);
 
        return (GgitSubmoduleIgnore)git_submodule_ignore (submodule->submodule);
 }
@@ -285,6 +304,7 @@ GgitSubmoduleUpdate
 ggit_submodule_get_update (GgitSubmodule *submodule)
 {
        g_return_val_if_fail (submodule != NULL, 0);
+       g_return_val_if_fail (submodule->valid, 0);
 
        return (GgitSubmoduleUpdate)git_submodule_update_strategy (submodule->submodule);
 }
@@ -301,6 +321,7 @@ gboolean
 ggit_submodule_get_fetch_recurse (GgitSubmodule *submodule)
 {
        g_return_val_if_fail (submodule != NULL, FALSE);
+       g_return_val_if_fail (submodule->valid, FALSE);
 
        return git_submodule_fetch_recurse_submodules (submodule->submodule);
 }
@@ -324,6 +345,7 @@ ggit_submodule_init (GgitSubmodule  *submodule,
        gint ret;
 
        g_return_if_fail (submodule != NULL);
+       g_return_if_fail (submodule->valid);
        g_return_if_fail (error == NULL || *error == NULL);
 
        ret = git_submodule_init (submodule->submodule, overwrite);
@@ -351,6 +373,7 @@ ggit_submodule_sync (GgitSubmodule  *submodule,
        gint ret;
 
        g_return_if_fail (submodule != NULL);
+       g_return_if_fail (submodule->valid);
        g_return_if_fail (error == NULL || *error == NULL);
 
        ret = git_submodule_sync (submodule->submodule);
@@ -378,6 +401,7 @@ ggit_submodule_reload (GgitSubmodule  *submodule,
        gint ret;
 
        g_return_if_fail (submodule != NULL);
+       g_return_if_fail (submodule->valid);
        g_return_if_fail (error == NULL || *error == NULL);
 
        ret = git_submodule_reload (submodule->submodule, force ? 1 : 0);
diff --git a/libgit2-glib/ggit-submodule.h b/libgit2-glib/ggit-submodule.h
index b441b81..b47bcfe 100644
--- a/libgit2-glib/ggit-submodule.h
+++ b/libgit2-glib/ggit-submodule.h
@@ -34,6 +34,7 @@ G_BEGIN_DECLS
 GType                   ggit_submodule_get_type              (void) G_GNUC_CONST;
 
 GgitSubmodule         *_ggit_submodule_wrap                  (const git_submodule *submodule);
+void                   _ggit_submodule_invalidate            (GgitSubmodule       *submodule);
 
 GgitSubmodule          *ggit_submodule_ref                   (GgitSubmodule       *submodule);
 void                    ggit_submodule_unref                 (GgitSubmodule       *submodule);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]