2.30.1
This commit is contained in:
parent
910d213340
commit
c5e62818f6
1
.gitignore
vendored
1
.gitignore
vendored
@ -28,3 +28,4 @@ glib-2.25.13.tar.bz2
|
||||
/glib-2.29.90.tar.xz
|
||||
/glib-2.29.92.tar.xz
|
||||
/glib-2.30.0.tar.xz
|
||||
/glib-2.30.1.tar.xz
|
||||
|
@ -1,27 +0,0 @@
|
||||
From eb454a1cb4d8ea16f6b5575c69e58c2877ea350e Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Clasen <mclasen@redhat.com>
|
||||
Date: Sun, 27 Jun 2010 19:27:04 -0400
|
||||
Subject: [PATCH] Fix a alloc/free mismatch
|
||||
|
||||
Pointed out in http://bugzilla.redhat.com/show_bug.cgi?id=608453
|
||||
by David Tardon.
|
||||
---
|
||||
glib/gbuffer.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/glib/gbuffer.c b/glib/gbuffer.c
|
||||
index 4eb83df..5830f04 100644
|
||||
--- a/glib/gbuffer.c
|
||||
+++ b/glib/gbuffer.c
|
||||
@@ -138,7 +138,7 @@ g_buffer_free_usernotify (GBuffer *buffer)
|
||||
GUserNotifyBuffer *ubuffer = (GUserNotifyBuffer *) buffer;
|
||||
|
||||
ubuffer->user_destroy (ubuffer->user_data);
|
||||
- g_slice_free (GBuffer, buffer);
|
||||
+ g_slice_free (GUserNotifyBuffer, ubuffer);
|
||||
}
|
||||
|
||||
/* < private >
|
||||
--
|
||||
1.7.1
|
||||
|
@ -1,225 +0,0 @@
|
||||
From 5bb94348f4760352f6ae974002db48cb130343a4 Mon Sep 17 00:00:00 2001
|
||||
From: David Zeuthen <davidz@redhat.com>
|
||||
Date: Wed, 18 Aug 2010 11:35:25 -0400
|
||||
Subject: [PATCH 1/4] GDBusProxy: Call into well-known name if no name owner currently exists
|
||||
|
||||
This is really what (API) users expect from GDBusProxy - in
|
||||
particular, mclasen and I ran into this problem while debugging a
|
||||
upower issue, see
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=624125
|
||||
|
||||
In a nutshell, the problem is that polkitd crashes while upower holds
|
||||
a PolkitAuthority object (which in turns contains a GDBusProxy for the
|
||||
well-known name org.freedesktop.PolicyKit1). This means that
|
||||
subsequent calls on the PolkitAuthority (which is translated into
|
||||
calls into the GDBusProxy) fails since :g-name-owner is NULL.
|
||||
|
||||
With this fix, we'll be requesting the bus daemon to launch polkitd
|
||||
since we will start calling into org.freedesktop.PolicyKit1 as soon as
|
||||
we notice that there is no owner for this name.
|
||||
|
||||
Unfortunately our test suite doesn't cover service activation so there
|
||||
is no way to reliably test this. I will file a bug about this.
|
||||
|
||||
Signed-off-by: David Zeuthen <davidz@redhat.com>
|
||||
---
|
||||
gio/gdbusproxy.c | 108 ++++++++++++++++++++++++++++++++++++++++--------------
|
||||
1 files changed, 80 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/gio/gdbusproxy.c b/gio/gdbusproxy.c
|
||||
index d47a4ad..17e6730 100644
|
||||
--- a/gio/gdbusproxy.c
|
||||
+++ b/gio/gdbusproxy.c
|
||||
@@ -61,9 +61,13 @@
|
||||
* name is tracked and can be read from
|
||||
* #GDBusProxy:g-name-owner. Connect to the #GObject::notify signal to
|
||||
* get notified of changes. Additionally, only signals and property
|
||||
- * changes emitted from the current name owner are considered. This
|
||||
- * avoids a number of race conditions when the name is lost by one
|
||||
- * owner and claimed by another.
|
||||
+ * changes emitted from the current name owner are considered and
|
||||
+ * calls are always sent to the current name owner. This avoids a
|
||||
+ * number of race conditions when the name is lost by one owner and
|
||||
+ * claimed by another. However, if no name owner currently exists,
|
||||
+ * then calls will be sent to the well-known name which may result in
|
||||
+ * the message bus launching an owner (unless
|
||||
+ * %G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START is set).
|
||||
*
|
||||
* The generic #GDBusProxy::g-properties-changed and #GDBusProxy::g-signal
|
||||
* signals are not very convenient to work with. Therefore, the recommended
|
||||
@@ -2179,6 +2183,31 @@ lookup_method_info_or_warn (GDBusProxy *proxy,
|
||||
return info;
|
||||
}
|
||||
|
||||
+static const gchar *
|
||||
+get_destination_for_call (GDBusProxy *proxy)
|
||||
+{
|
||||
+ const gchar *ret;
|
||||
+
|
||||
+ ret = NULL;
|
||||
+
|
||||
+ /* If proxy->priv->name is a unique name, then proxy->priv->name_owner
|
||||
+ * is never NULL and always the same as proxy->priv->name. We use this
|
||||
+ * knowledge to avoid checking if proxy->priv->name is a unique or
|
||||
+ * well-known name.
|
||||
+ */
|
||||
+ ret = proxy->priv->name_owner;
|
||||
+ if (ret != NULL)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START)
|
||||
+ goto out;
|
||||
+
|
||||
+ ret = proxy->priv->name;
|
||||
+
|
||||
+ out:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* g_dbus_proxy_call:
|
||||
* @proxy: A #GDBusProxy.
|
||||
@@ -2243,9 +2272,9 @@ g_dbus_proxy_call (GDBusProxy *proxy,
|
||||
gboolean was_split;
|
||||
gchar *split_interface_name;
|
||||
const gchar *split_method_name;
|
||||
- const GDBusMethodInfo *expected_method_info;
|
||||
const gchar *target_method_name;
|
||||
const gchar *target_interface_name;
|
||||
+ const gchar *destination;
|
||||
GVariantType *reply_type;
|
||||
|
||||
g_return_if_fail (G_IS_DBUS_PROXY (proxy));
|
||||
@@ -2253,6 +2282,9 @@ g_dbus_proxy_call (GDBusProxy *proxy,
|
||||
g_return_if_fail (parameters == NULL || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE));
|
||||
g_return_if_fail (timeout_msec == -1 || timeout_msec >= 0);
|
||||
|
||||
+ reply_type = NULL;
|
||||
+ split_interface_name = NULL;
|
||||
+
|
||||
simple = g_simple_async_result_new (G_OBJECT (proxy),
|
||||
callback,
|
||||
user_data,
|
||||
@@ -2265,17 +2297,30 @@ g_dbus_proxy_call (GDBusProxy *proxy,
|
||||
g_object_set_data_full (G_OBJECT (simple), "-gdbus-proxy-method-name", g_strdup (target_method_name), g_free);
|
||||
|
||||
/* Warn if method is unexpected (cf. :g-interface-info) */
|
||||
- expected_method_info = NULL;
|
||||
if (!was_split)
|
||||
- expected_method_info = lookup_method_info_or_warn (proxy, target_method_name);
|
||||
+ {
|
||||
+ const GDBusMethodInfo *expected_method_info;
|
||||
+ expected_method_info = lookup_method_info_or_warn (proxy, target_method_name);
|
||||
+ if (expected_method_info != NULL)
|
||||
+ reply_type = _g_dbus_compute_complete_signature (expected_method_info->out_args);
|
||||
+ }
|
||||
|
||||
- if (expected_method_info)
|
||||
- reply_type = _g_dbus_compute_complete_signature (expected_method_info->out_args);
|
||||
- else
|
||||
- reply_type = NULL;
|
||||
+ destination = NULL;
|
||||
+ if (proxy->priv->name != NULL)
|
||||
+ {
|
||||
+ destination = get_destination_for_call (proxy);
|
||||
+ if (destination == NULL)
|
||||
+ {
|
||||
+ g_simple_async_result_set_error (simple,
|
||||
+ G_IO_ERROR,
|
||||
+ G_IO_ERROR_FAILED,
|
||||
+ _("Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag"));
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
g_dbus_connection_call (proxy->priv->connection,
|
||||
- proxy->priv->name_owner,
|
||||
+ destination,
|
||||
proxy->priv->object_path,
|
||||
target_interface_name,
|
||||
target_method_name,
|
||||
@@ -2287,6 +2332,7 @@ g_dbus_proxy_call (GDBusProxy *proxy,
|
||||
(GAsyncReadyCallback) reply_cb,
|
||||
simple);
|
||||
|
||||
+ out:
|
||||
if (reply_type != NULL)
|
||||
g_variant_type_free (reply_type);
|
||||
|
||||
@@ -2392,9 +2438,9 @@ g_dbus_proxy_call_sync (GDBusProxy *proxy,
|
||||
gboolean was_split;
|
||||
gchar *split_interface_name;
|
||||
const gchar *split_method_name;
|
||||
- const GDBusMethodInfo *expected_method_info;
|
||||
const gchar *target_method_name;
|
||||
const gchar *target_interface_name;
|
||||
+ const gchar *destination;
|
||||
GVariantType *reply_type;
|
||||
|
||||
g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL);
|
||||
@@ -2403,32 +2449,37 @@ g_dbus_proxy_call_sync (GDBusProxy *proxy,
|
||||
g_return_val_if_fail (timeout_msec == -1 || timeout_msec >= 0, NULL);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||
|
||||
+ reply_type = NULL;
|
||||
+
|
||||
was_split = maybe_split_method_name (method_name, &split_interface_name, &split_method_name);
|
||||
target_method_name = was_split ? split_method_name : method_name;
|
||||
target_interface_name = was_split ? split_interface_name : proxy->priv->interface_name;
|
||||
|
||||
- if (proxy->priv->expected_interface)
|
||||
+ /* Warn if method is unexpected (cf. :g-interface-info) */
|
||||
+ if (!was_split)
|
||||
{
|
||||
- expected_method_info = g_dbus_interface_info_lookup_method (proxy->priv->expected_interface, target_method_name);
|
||||
- if (expected_method_info == NULL)
|
||||
- {
|
||||
- g_warning ("Trying to invoke method `%s' which isn't in expected interface `%s'",
|
||||
- target_method_name,
|
||||
- target_interface_name);
|
||||
- }
|
||||
+ const GDBusMethodInfo *expected_method_info;
|
||||
+ expected_method_info = lookup_method_info_or_warn (proxy, target_method_name);
|
||||
+ if (expected_method_info != NULL)
|
||||
+ reply_type = _g_dbus_compute_complete_signature (expected_method_info->out_args);
|
||||
}
|
||||
- else
|
||||
+
|
||||
+ destination = NULL;
|
||||
+ if (proxy->priv->name != NULL)
|
||||
{
|
||||
- expected_method_info = NULL;
|
||||
+ destination = get_destination_for_call (proxy);
|
||||
+ if (destination == NULL)
|
||||
+ {
|
||||
+ g_set_error_literal (error,
|
||||
+ G_IO_ERROR,
|
||||
+ G_IO_ERROR_FAILED,
|
||||
+ _("Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag"));
|
||||
+ goto out;
|
||||
+ }
|
||||
}
|
||||
|
||||
- if (expected_method_info)
|
||||
- reply_type = _g_dbus_compute_complete_signature (expected_method_info->out_args);
|
||||
- else
|
||||
- reply_type = NULL;
|
||||
-
|
||||
ret = g_dbus_connection_call_sync (proxy->priv->connection,
|
||||
- proxy->priv->name_owner,
|
||||
+ destination,
|
||||
proxy->priv->object_path,
|
||||
target_interface_name,
|
||||
target_method_name,
|
||||
@@ -2439,6 +2490,7 @@ g_dbus_proxy_call_sync (GDBusProxy *proxy,
|
||||
cancellable,
|
||||
error);
|
||||
|
||||
+ out:
|
||||
if (reply_type != NULL)
|
||||
g_variant_type_free (reply_type);
|
||||
|
||||
--
|
||||
1.7.2.1
|
||||
|
@ -1,110 +0,0 @@
|
||||
From c91720255261222d7be685f3a8f039706f04cce5 Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Clasen <mclasen@redhat.com>
|
||||
Date: Mon, 6 Jun 2011 23:23:29 -0400
|
||||
Subject: [PATCH 1/2] GDataList: don't hold the bitlock over callbacks
|
||||
|
||||
g_datalist_id_clear_i was dropping the dataset lock around
|
||||
the destroy notifies, but kept the bitlock. This was causing
|
||||
deadlocks when finalizing widgets.
|
||||
---
|
||||
glib/gdataset.c | 45 +++++++++++++++++++++++++++++----------------
|
||||
1 files changed, 29 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/glib/gdataset.c b/glib/gdataset.c
|
||||
index e1b55c1..0c1f9c1 100644
|
||||
--- a/glib/gdataset.c
|
||||
+++ b/glib/gdataset.c
|
||||
@@ -176,8 +176,7 @@ struct _GDataset
|
||||
|
||||
/* --- prototypes --- */
|
||||
static inline GDataset* g_dataset_lookup (gconstpointer dataset_location);
|
||||
-static inline void g_datalist_clear_i (GData **datalist,
|
||||
- gboolean unlock_dataset);
|
||||
+static inline void g_datalist_clear_i (GData **datalist);
|
||||
static void g_dataset_destroy_internal (GDataset *dataset);
|
||||
static inline gpointer g_data_set_internal (GData **datalist,
|
||||
GQuark key_id,
|
||||
@@ -228,8 +227,8 @@ g_datalist_unlock (GData **datalist)
|
||||
/* Called with the datalist lock held, or the dataset global
|
||||
* lock for dataset lists
|
||||
*/
|
||||
-void
|
||||
-g_datalist_clear_i (GData **datalist, gboolean unlock_dataset)
|
||||
+static void
|
||||
+g_datalist_clear_i (GData **datalist)
|
||||
{
|
||||
GData *data;
|
||||
gint i;
|
||||
@@ -239,15 +238,13 @@ g_datalist_clear_i (GData **datalist, gboolean unlock_dataset)
|
||||
|
||||
if (data)
|
||||
{
|
||||
- if (unlock_dataset)
|
||||
- G_UNLOCK (g_dataset_global);
|
||||
+ G_UNLOCK (g_dataset_global);
|
||||
for (i = 0; i < data->len; i++)
|
||||
- {
|
||||
- if (data->data[i].data && data->data[i].destroy)
|
||||
- data->data[i].destroy (data->data[i].data);
|
||||
- }
|
||||
- if (unlock_dataset)
|
||||
- G_LOCK (g_dataset_global);
|
||||
+ {
|
||||
+ if (data->data[i].data && data->data[i].destroy)
|
||||
+ data->data[i].destroy (data->data[i].data);
|
||||
+ }
|
||||
+ G_LOCK (g_dataset_global);
|
||||
|
||||
g_free (data);
|
||||
}
|
||||
@@ -258,19 +255,35 @@ g_datalist_clear_i (GData **datalist, gboolean unlock_dataset)
|
||||
* g_datalist_clear:
|
||||
* @datalist: a datalist.
|
||||
*
|
||||
- * Frees all the data elements of the datalist. The data elements'
|
||||
- * destroy functions are called if they have been set.
|
||||
+ * Frees all the data elements of the datalist.
|
||||
+ * The data elements' destroy functions are called
|
||||
+ * if they have been set.
|
||||
**/
|
||||
void
|
||||
g_datalist_clear (GData **datalist)
|
||||
{
|
||||
+ GData *data;
|
||||
+ gint i;
|
||||
+
|
||||
g_return_if_fail (datalist != NULL);
|
||||
|
||||
g_datalist_lock (datalist);
|
||||
|
||||
- g_datalist_clear_i (datalist, FALSE);
|
||||
+ data = G_DATALIST_GET_POINTER (datalist);
|
||||
+ G_DATALIST_SET_POINTER (datalist, NULL);
|
||||
|
||||
g_datalist_unlock (datalist);
|
||||
+
|
||||
+ if (data)
|
||||
+ {
|
||||
+ for (i = 0; i < data->len; i++)
|
||||
+ {
|
||||
+ if (data->data[i].data && data->data[i].destroy)
|
||||
+ data->data[i].destroy (data->data[i].data);
|
||||
+ }
|
||||
+
|
||||
+ g_free (data);
|
||||
+ }
|
||||
}
|
||||
|
||||
/* HOLDS: g_dataset_global_lock */
|
||||
@@ -307,7 +320,7 @@ g_dataset_destroy_internal (GDataset *dataset)
|
||||
break;
|
||||
}
|
||||
|
||||
- g_datalist_clear_i (&dataset->datalist, TRUE);
|
||||
+ g_datalist_clear_i (&dataset->datalist);
|
||||
dataset = g_dataset_lookup (dataset_location);
|
||||
}
|
||||
}
|
||||
--
|
||||
1.7.5.2
|
||||
|
@ -1,62 +0,0 @@
|
||||
From 3ce857f9a489ef3dbfda685623aaea108e53c89a Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Matthew <jonathan@d14n.org>
|
||||
Date: Sun, 27 Mar 2011 10:44:31 +1000
|
||||
Subject: [PATCH] introspection: add annotations for g_file_load_contents and friends
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=645789
|
||||
---
|
||||
gio/gfile.c | 10 +++++-----
|
||||
1 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/gio/gfile.c b/gio/gfile.c
|
||||
index da3477b..4cecc8a 100644
|
||||
--- a/gio/gfile.c
|
||||
+++ b/gio/gfile.c
|
||||
@@ -6124,7 +6124,7 @@ g_file_query_default_handler (GFile *file,
|
||||
* g_file_load_contents:
|
||||
* @file: input #GFile.
|
||||
* @cancellable: optional #GCancellable object, %NULL to ignore.
|
||||
- * @contents: (out) (transfer full): a location to place the contents of the file.
|
||||
+ * @contents: (out) (transfer full) (element-type guint8) (array length=length): a location to place the contents of the file.
|
||||
* @length: (out) (allow-none): a location to place the length of the contents of the file,
|
||||
* or %NULL if the length is not needed
|
||||
* @etag_out: (out) (allow-none): a location to place the current entity tag for the file,
|
||||
@@ -6431,7 +6431,7 @@ g_file_load_partial_contents_async (GFile *file,
|
||||
* g_file_load_partial_contents_finish:
|
||||
* @file: input #GFile.
|
||||
* @res: a #GAsyncResult.
|
||||
- * @contents: (out) (transfer full): a location to place the contents of the file.
|
||||
+ * @contents: (out) (transfer full) (element-type guint8) (array length=length): a location to place the contents of the file.
|
||||
* @length: (out) (allow-none): a location to place the length of the contents of the file,
|
||||
* or %NULL if the length is not needed
|
||||
* @etag_out: (out) (allow-none): a location to place the current entity tag for the file,
|
||||
@@ -6537,7 +6537,7 @@ g_file_load_contents_async (GFile *file,
|
||||
* g_file_load_contents_finish:
|
||||
* @file: input #GFile.
|
||||
* @res: a #GAsyncResult.
|
||||
- * @contents: (out) (transfer full): a location to place the contents of the file.
|
||||
+ * @contents: (out) (transfer full) (element-type guint8) (array length=length): a location to place the contents of the file.
|
||||
* @length: (out) (allow-none): a location to place the length of the contents of the file,
|
||||
* or %NULL if the length is not needed
|
||||
* @etag_out: (out) (allow-none): a location to place the current entity tag for the file,
|
||||
@@ -6572,7 +6572,7 @@ g_file_load_contents_finish (GFile *file,
|
||||
/**
|
||||
* g_file_replace_contents:
|
||||
* @file: input #GFile.
|
||||
- * @contents: a string containing the new contents for @file.
|
||||
+ * @contents: (element-type guint8) (array length=length): a string containing the new contents for @file.
|
||||
* @length: the length of @contents in bytes.
|
||||
* @etag: (allow-none): the old <link linkend="gfile-etag">entity tag</link>
|
||||
* for the document, or %NULL
|
||||
@@ -6785,7 +6785,7 @@ replace_contents_open_callback (GObject *obj,
|
||||
/**
|
||||
* g_file_replace_contents_async:
|
||||
* @file: input #GFile.
|
||||
- * @contents: string of contents to replace the file with.
|
||||
+ * @contents: (element-type guint8) (array length=length): string of contents to replace the file with.
|
||||
* @length: the length of @contents in bytes.
|
||||
* @etag: (allow-none): a new <link linkend="gfile-etag">entity tag</link> for the @file, or %NULL
|
||||
* @make_backup: %TRUE if a backup should be created.
|
||||
--
|
||||
1.7.4.2
|
||||
|
@ -1,36 +0,0 @@
|
||||
From a7689537605ade51b19be76baa3fba303527483d Mon Sep 17 00:00:00 2001
|
||||
From: Ryan Lortie <desrt@desrt.ca>
|
||||
Date: Sat, 19 Jun 2010 11:38:57 -0400
|
||||
Subject: [PATCH 03/45] Fix bug in strinfo
|
||||
|
||||
We can't search for a larger needle inside of a smaller haystack, and
|
||||
unsigned integer subtraction tends to result in very large numbers
|
||||
rather than small ones.
|
||||
|
||||
Add a check for this case and abort out immediately.
|
||||
|
||||
Also add a test case (lifted directly from the docs) that demonstrates
|
||||
the problem.
|
||||
|
||||
Issue discovered and tracked down by Milan Bouchet-Valat
|
||||
---
|
||||
gio/strinfo.c | 3 ++
|
||||
gio/tests/gschema-compile.c | 3 +-
|
||||
gio/tests/schema-tests/from-docs.gschema.xml | 34 ++++++++++++++++++++++++++
|
||||
3 files changed, 39 insertions(+), 1 deletions(-)
|
||||
create mode 100644 gio/tests/schema-tests/from-docs.gschema.xml
|
||||
|
||||
diff --git a/gio/strinfo.c b/gio/strinfo.c
|
||||
index 9ba18aa..f762fc5 100644
|
||||
--- a/gio/strinfo.c
|
||||
+++ b/gio/strinfo.c
|
||||
@@ -147,6 +147,9 @@ strinfo_scan (const guint32 *strinfo,
|
||||
{
|
||||
guint i = 0;
|
||||
|
||||
+ if (length < n_words)
|
||||
+ return -1;
|
||||
+
|
||||
while (i <= length - n_words)
|
||||
{
|
||||
guint j = 0;
|
@ -1,120 +0,0 @@
|
||||
Index: gio/glocalfileinfo.c
|
||||
===================================================================
|
||||
--- gio/glocalfileinfo.c (revision 6871)
|
||||
+++ gio/glocalfileinfo.c (working copy)
|
||||
@@ -1706,6 +1706,24 @@
|
||||
#endif
|
||||
|
||||
static gboolean
|
||||
+get_string (const GFileAttributeValue *value,
|
||||
+ const char **val_out,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ if (value->type != G_FILE_ATTRIBUTE_TYPE_STRING)
|
||||
+ {
|
||||
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
|
||||
+ _("Invalid attribute type (byte string expected)"));
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ *val_out = value->u.string;
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static gboolean
|
||||
set_unix_mode (char *filename,
|
||||
const GFileAttributeValue *value,
|
||||
GError **error)
|
||||
@@ -1948,6 +1966,52 @@
|
||||
}
|
||||
#endif
|
||||
|
||||
+
|
||||
+static gboolean
|
||||
+set_selinux_context (char *filename,
|
||||
+ const GFileAttributeValue *value,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ const char *val;
|
||||
+
|
||||
+ if (!get_string (value, &val, error))
|
||||
+ return FALSE;
|
||||
+
|
||||
+ if (val == NULL)
|
||||
+ {
|
||||
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
|
||||
+ _("SELinux context must be non-NULL"));
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+#ifdef HAVE_SELINUX
|
||||
+ if (is_selinux_enabled ()) {
|
||||
+ security_context_t val_s;
|
||||
+
|
||||
+ val_s = g_strdup (val);
|
||||
+
|
||||
+ if (setfilecon_raw (filename, val_s) < 0)
|
||||
+ {
|
||||
+ int errsv = errno;
|
||||
+
|
||||
+ g_set_error (error, G_IO_ERROR,
|
||||
+ g_io_error_from_errno (errsv),
|
||||
+ _("Error setting SELinux context: %s"),
|
||||
+ g_strerror (errsv));
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+ g_free (val_s);
|
||||
+ } else {
|
||||
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
|
||||
+ _("SELinux is not enabled on this system"));
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+
|
||||
gboolean
|
||||
_g_local_file_info_set_attribute (char *filename,
|
||||
const char *attribute,
|
||||
@@ -1993,6 +2057,11 @@
|
||||
else if (g_str_has_prefix (attribute, "xattr-sys::"))
|
||||
return set_xattr (filename, attribute, &value, error);
|
||||
#endif
|
||||
+
|
||||
+#ifdef HAVE_SELINUX
|
||||
+ else if (strcmp (attribute, G_FILE_ATTRIBUTE_SELINUX_CONTEXT) == 0)
|
||||
+ return set_selinux_context (filename, &value, error);
|
||||
+#endif
|
||||
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||
_("Setting attribute %s not supported"), attribute);
|
||||
@@ -2110,5 +2179,25 @@
|
||||
|
||||
/* xattrs are handled by default callback */
|
||||
|
||||
+
|
||||
+ /* SELinux context */
|
||||
+#ifdef HAVE_SELINUX
|
||||
+ if (is_selinux_enabled ()) {
|
||||
+ value = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_SELINUX_CONTEXT);
|
||||
+ if (value)
|
||||
+ {
|
||||
+ if (!set_selinux_context (filename, value, error))
|
||||
+ {
|
||||
+ value->status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING;
|
||||
+ res = FALSE;
|
||||
+ /* Don't set error multiple times */
|
||||
+ error = NULL;
|
||||
+ }
|
||||
+ else
|
||||
+ value->status = G_FILE_ATTRIBUTE_STATUS_SET;
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
return res;
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
diff -up glib-2.23.2/glib/gtestutils.c.abort_msg glib-2.23.2/glib/gtestutils.c
|
||||
--- glib-2.23.2/glib/gtestutils.c.abort_msg 2010-01-25 18:32:10.793495994 -0500
|
||||
+++ glib-2.23.2/glib/gtestutils.c 2010-01-25 18:33:23.898497049 -0500
|
||||
@@ -40,7 +40,12 @@
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif /* HAVE_SYS_SELECT_H */
|
||||
-
|
||||
+
|
||||
+/* We can't use the libc variable, since rpm doesn't let us depend on
|
||||
+ * GLIBC_PRIVATE symbols.
|
||||
+ */
|
||||
+#undef HAVE_LIBC_ABORT_MSG
|
||||
+
|
||||
/* if we have a recent enough glibc, use its __abort_msg variable for storing
|
||||
* assertion messages (just like assert()). If not, declare our own variable,
|
||||
* so that platforms with older glibc or different libc implementations can use
|
@ -2,13 +2,13 @@
|
||||
|
||||
Summary: A library of handy utility functions
|
||||
Name: glib2
|
||||
Version: 2.30.0
|
||||
Release: 2%{?dist}
|
||||
Version: 2.30.1
|
||||
Release: 1%{?dist}
|
||||
License: LGPLv2+
|
||||
Group: System Environment/Libraries
|
||||
URL: http://www.gtk.org
|
||||
#VCS: git:git://git.gnome.org/glib
|
||||
Source: http://download.gnome.org/sources/glib/2.29/glib-%{version}.tar.xz
|
||||
Source: http://download.gnome.org/sources/glib/2.30/glib-%{version}.tar.xz
|
||||
|
||||
Patch0: 0001-closure-fix-handling-of-ENUMs-and-integral-return-ty.patch
|
||||
|
||||
@ -162,6 +162,9 @@ gio-querymodules-%{__isa_bits} %{_libdir}/gio/modules
|
||||
|
||||
|
||||
%changelog
|
||||
* Fri Oct 14 2011 Matthias Clasen <mclasen@redhat.com> - 2.30.1-1
|
||||
- Update to 2.30.1
|
||||
|
||||
* Wed Oct 05 2011 Dan Williams <dcbw@redhat.com> - 2.30.0-2
|
||||
- Fix signal marshalling on 64-bit big-endian platforms (rh #736489)
|
||||
|
||||
|
43
pyloc.patch
43
pyloc.patch
@ -1,43 +0,0 @@
|
||||
diff -up glib-2.22.0/configure.in.pyloc glib-2.22.0/configure.in
|
||||
--- glib-2.22.0/configure.in.pyloc 2009-09-22 09:40:56.000000000 -0400
|
||||
+++ glib-2.22.0/configure.in 2009-09-23 15:37:23.729418282 -0400
|
||||
@@ -256,8 +256,10 @@ AC_ARG_WITH(runtime-libdir,
|
||||
[Install runtime libraries relative to libdir])],
|
||||
[],
|
||||
[with_runtime_libdir=""])
|
||||
-GLIB_RUNTIME_LIBDIR=$with_runtime_libdir
|
||||
+GLIB_RUNTIME_LIBDIR="$with_runtime_libdir"
|
||||
+ABS_GLIB_RUNTIME_LIBDIR="`readlink -f $libdir/$with_runtime_libdir`"
|
||||
AC_SUBST(GLIB_RUNTIME_LIBDIR)
|
||||
+AC_SUBST(ABS_GLIB_RUNTIME_LIBDIR)
|
||||
AM_CONDITIONAL(HAVE_GLIB_RUNTIME_LIBDIR, [test "x$with_runtime_libdir" != "x"])
|
||||
|
||||
dnl Checks for programs.
|
||||
diff -up glib-2.22.0/glib/Makefile.am.pyloc glib-2.22.0/glib/Makefile.am
|
||||
--- glib-2.22.0/glib/Makefile.am.pyloc 2009-09-22 16:19:35.000000000 -0400
|
||||
+++ glib-2.22.0/glib/Makefile.am 2009-09-23 15:53:09.109395306 -0400
|
||||
@@ -380,8 +380,8 @@ libglib-gdb.py: libglib-gdb.py.in
|
||||
|
||||
|
||||
install-data-hook: libglib-gdb.py
|
||||
- mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load${libdir}
|
||||
- $(INSTALL) libglib-gdb.py $(DESTDIR)$(datadir)/gdb/auto-load${libdir}/libglib-2.0.so.0.$(LT_CURRENT).0-gdb.py
|
||||
+ mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load$(ABS_GLIB_RUNTIME_LIBDIR)
|
||||
+ $(INSTALL) libglib-gdb.py $(DESTDIR)$(datadir)/gdb/auto-load$(ABS_GLIB_RUNTIME_LIBDIR)/libglib-2.0.so.0.$(LT_CURRENT).0-gdb.py
|
||||
if HAVE_GLIB_RUNTIME_LIBDIR
|
||||
mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR)
|
||||
mv $(DESTDIR)$(libdir)/libglib-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR)
|
||||
diff -up glib-2.22.0/gobject/Makefile.am.pyloc glib-2.22.0/gobject/Makefile.am
|
||||
--- glib-2.22.0/gobject/Makefile.am.pyloc 2009-09-22 16:19:20.000000000 -0400
|
||||
+++ glib-2.22.0/gobject/Makefile.am 2009-09-23 15:53:18.011645753 -0400
|
||||
@@ -274,8 +274,8 @@ uninstall-gdb:
|
||||
-rm -r $(DESTDIR)$(datadir)/gdb
|
||||
|
||||
install-data-hook: libgobject-gdb.py
|
||||
- mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load${libdir}
|
||||
- $(INSTALL) libgobject-gdb.py $(DESTDIR)$(datadir)/gdb/auto-load${libdir}/libgobject-2.0.so.0.$(LT_CURRENT).0-gdb.py
|
||||
+ mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load/$(ABS_GLIB_RUNTIME_LIBDIR)
|
||||
+ $(INSTALL) libgobject-gdb.py $(DESTDIR)$(datadir)/gdb/auto-load/$(ABS_GLIB_RUNTIME_LIBDIR)/libgobject-2.0.so.0.$(LT_CURRENT).0-gdb.py
|
||||
if HAVE_GLIB_RUNTIME_LIBDIR
|
||||
mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR)
|
||||
mv $(DESTDIR)$(libdir)/libgobject-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR)
|
Loading…
Reference in New Issue
Block a user