summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <thiagoss@osg.samsung.com>2016-01-22 15:58:19 -0300
committerThiago Santos <thiagossantos@gmail.com>2016-12-07 11:08:10 -0300
commit5e50dd5a4eec1113618902aae5b2ef91f32dd257 (patch)
tree98b68b9a6eafba118c953dca2d05ccd6a817ad63
parentae662117ced5ca638774bcbc104471ca06c74ca9 (diff)
httpcookiejar: add locking
Add a recmutex to only allow the cookie jar to be modified from a single thread, prevent concurrent edits and unexpected results when notifying listeners of the changed signal.
-rw-r--r--gst-libs/gst/http/gsthttpcookiejar.c21
-rw-r--r--gst-libs/gst/http/gsthttpcookiejar.h1
2 files changed, 20 insertions, 2 deletions
diff --git a/gst-libs/gst/http/gsthttpcookiejar.c b/gst-libs/gst/http/gsthttpcookiejar.c
index a20d02885..2044c3fae 100644
--- a/gst-libs/gst/http/gsthttpcookiejar.c
+++ b/gst-libs/gst/http/gsthttpcookiejar.c
@@ -61,9 +61,15 @@ typedef struct
gboolean constructed;
GHashTable *domains, *serials;
guint serial;
+
+ GRecMutex mutex;
} GstHttpCookieJarPrivate;
#define GST_HTTP_COOKIE_JAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GST_TYPE_HTTP_COOKIE_JAR, GstHttpCookieJarPrivate))
+#define GST_HTTP_COOKIE_JAR_GET_MUTEX(j) &(GST_HTTP_COOKIE_JAR_GET_PRIVATE (GST_HTTP_COOKIE_JAR_CAST (j))->mutex)
+#define GST_HTTP_COOKIE_JAR_LOCK(j) g_rec_mutex_lock (GST_HTTP_COOKIE_JAR_GET_MUTEX(j))
+#define GST_HTTP_COOKIE_JAR_UNLOCK(j) g_rec_mutex_unlock (GST_HTTP_COOKIE_JAR_GET_MUTEX(j))
+
/**
* gst_http_str_case_hash:
* @key: ASCII string to hash
@@ -103,7 +109,6 @@ gst_http_str_case_equal (gconstpointer v1, gconstpointer v2)
return g_ascii_strcasecmp (string1, string2) == 0;
}
-
static void
gst_http_cookie_jar_init (GstHttpCookieJar * jar)
{
@@ -251,6 +256,8 @@ gst_http_cookie_jar_add_cookie (GstHttpCookieJar * jar, GObject * author,
g_return_if_fail (GST_HTTP_IS_COOKIE_JAR (jar));
g_return_if_fail (cookie != NULL);
+ GST_HTTP_COOKIE_JAR_LOCK (jar);
+
#if 0
/* Never accept cookies for public domains. */
if (!g_hostname_is_ip_address (cookie->domain) &&
@@ -286,6 +293,7 @@ gst_http_cookie_jar_add_cookie (GstHttpCookieJar * jar, GObject * author,
gst_http_cookie_free (old_cookie);
}
+ GST_HTTP_COOKIE_JAR_UNLOCK (jar);
return;
}
last = oc;
@@ -294,6 +302,7 @@ gst_http_cookie_jar_add_cookie (GstHttpCookieJar * jar, GObject * author,
/* The new cookie is... a new cookie */
if (cookie->expires && date_time_is_past (cookie->expires)) {
gst_http_cookie_free (cookie);
+ GST_HTTP_COOKIE_JAR_UNLOCK (jar);
return;
}
@@ -305,6 +314,7 @@ gst_http_cookie_jar_add_cookie (GstHttpCookieJar * jar, GObject * author,
}
gst_http_cookie_jar_changed (jar, author, NULL, cookie);
+ GST_HTTP_COOKIE_JAR_UNLOCK (jar);
}
/**
@@ -335,6 +345,7 @@ gst_http_cookie_jar_all_cookies (GstHttpCookieJar * jar)
priv = GST_HTTP_COOKIE_JAR_GET_PRIVATE (jar);
g_array_set_clear_func (result, (GDestroyNotify) gst_http_cookie_clear);
+ GST_HTTP_COOKIE_JAR_LOCK (jar);
g_hash_table_iter_init (&iter, priv->domains);
@@ -349,6 +360,7 @@ gst_http_cookie_jar_all_cookies (GstHttpCookieJar * jar)
}
}
+ GST_HTTP_COOKIE_JAR_UNLOCK (jar);
return result;
}
@@ -374,9 +386,12 @@ gst_http_cookie_jar_delete_cookie (GstHttpCookieJar * jar, GObject * author,
priv = GST_HTTP_COOKIE_JAR_GET_PRIVATE (jar);
+ GST_HTTP_COOKIE_JAR_LOCK (jar);
cookies = g_hash_table_lookup (priv->domains, cookie->domain);
- if (cookies == NULL)
+ if (cookies == NULL) {
+ GST_HTTP_COOKIE_JAR_UNLOCK (jar);
return;
+ }
for (p = cookies; p; p = p->next) {
GstHttpCookie *c = (GstHttpCookie *) p->data;
@@ -385,7 +400,9 @@ gst_http_cookie_jar_delete_cookie (GstHttpCookieJar * jar, GObject * author,
g_hash_table_insert (priv->domains, g_strdup (cookie->domain), cookies);
gst_http_cookie_jar_changed (jar, author, c, NULL);
gst_http_cookie_free (c);
+ GST_HTTP_COOKIE_JAR_UNLOCK (jar);
return;
}
}
+ GST_HTTP_COOKIE_JAR_UNLOCK (jar);
}
diff --git a/gst-libs/gst/http/gsthttpcookiejar.h b/gst-libs/gst/http/gsthttpcookiejar.h
index 9d613def0..85c42ef37 100644
--- a/gst-libs/gst/http/gsthttpcookiejar.h
+++ b/gst-libs/gst/http/gsthttpcookiejar.h
@@ -41,6 +41,7 @@ G_BEGIN_DECLS
#define GST_HTTP_IS_COOKIE_JAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_HTTP_COOKIE_JAR))
#define GST_HTTP_IS_COOKIE_JAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), GST_TYPE_HTTP_COOKIE_JAR))
#define GST_HTTP_COOKIE_JAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_HTTP_COOKIE_JAR, GstHttpCookieJarClass))
+#define GST_HTTP_COOKIE_JAR_CAST(obj) ((GstHttpCookieJar *) (obj))
typedef struct _GstHttpCookieJar {
GstObject parent;