[libgit2-glib] Add submodule invalidation to protect against invalid access
- From: Jesse van den Kieboom <jessevdk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgit2-glib] Add submodule invalidation to protect against invalid access
- Date: Sat, 1 Aug 2015 11:39:51 +0000 (UTC)
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]