Compare commits

..

23 Commits

Author SHA1 Message Date
Ole André Vadla Ravnås fa5f378176 subprojects: Prepare for release 2026-03-08 20:35:48 +01:00
Ole André Vadla Ravnås a814a4aa9b Revert "meson: Switch Python resolution strategy (#270)"
Turns out this breaks our CI. We should probably make this an option
instead.

This reverts commit 60a4a032d6.
2026-03-08 20:07:43 +01:00
Ole André Vadla Ravnås a48ff22b6f subprojects: Bump outdated 2026-03-08 19:44:15 +01:00
Ole André Vadla Ravnås eb4f8d37f3 subprojects: Bump outdated 2026-03-07 23:51:50 +01:00
James 60a4a032d6 meson: Switch Python resolution strategy (#270)
Use the `system` strategy, as .pc metadata is often wrong.
2026-03-07 14:49:23 +01:00
Ole André Vadla Ravnås 9f46dfaa80 subprojects: Bump outdated 2026-02-18 22:54:10 +01:00
Ole André Vadla Ravnås e57ca181f8 submodules: Bump releng 2026-02-18 22:54:10 +01:00
Ole André Vadla Ravnås 0fccd75bc7 subprojects: Prepare for release 2026-02-16 22:45:45 +01:00
Ole André Vadla Ravnås dea4ffb1c9 subprojects: Bump outdated 2026-02-16 22:08:19 +01:00
Ole André Vadla Ravnås da17d3badb subprojects: Prepare for release 2026-02-14 10:52:14 +01:00
Ole André Vadla Ravnås 33922241fc subprojects: Bump outdated 2026-02-14 10:50:37 +01:00
Ole André Vadla Ravnås fb8fdbb231 variant: Support cast to uint64 2026-02-14 10:49:06 +01:00
Ole André Vadla Ravnås 0f50b58a04 subprojects: Prepare for release 2026-02-13 22:48:36 +01:00
Ole André Vadla Ravnås f63ea5903f subprojects: Bump outdated 2026-02-13 22:47:43 +01:00
Ole André Vadla Ravnås a99767e501 subprojects: Prepare for release 2026-02-13 15:12:36 +01:00
Ole André Vadla Ravnås 07bbd3d488 subprojects: Bump outdated 2026-02-13 15:09:57 +01:00
Ole André Vadla Ravnås 81403cf383 subprojects: Bump outdated 2026-02-12 20:46:27 +01:00
Ole André Vadla Ravnås 2ea0b944a2 subprojects: Bump outdated 2026-02-12 13:27:14 +01:00
Ole André Vadla Ravnås 35c412c6cf subprojects: Bump outdated 2026-02-07 21:19:57 +01:00
Ole André Vadla Ravnås ec4524d155 submodules: Bump releng 2026-02-07 21:19:57 +01:00
Ole André Vadla Ravnås d9d53a89cc service: Fix Service.request() GVariant lifetime
The variant unmarshal helpers returned floating GVariants. When these
values were stored in containers, the floating reference was consumed.

Service.request() later unref'd the same GVariant, leading to refcount
underflow and memory corruption, or appearing to work by accident when
the memory was not yet reused.

Ensure all unmarshalled GVariants are non-floating before returning them
so that Service.request() always owns a full reference.
2026-01-29 14:59:10 +01:00
Ole André Vadla Ravnås dfb002de49 variant: Fix signedness in uint64 marshaling 2026-01-29 12:46:38 +01:00
Ole André Vadla Ravnås 0f56e44abd variant: Add support for additional GVariant types
This adds support for:
- Additional integer types: byte, int16, uint16, int32, uint32
- Tuples
- Nested variants in any context
2026-01-29 12:45:54 +01:00
3 changed files with 85 additions and 19 deletions
+83 -17
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2023 Ole André Vadla Ravnås <oleavr@nowsecure.com>
* Copyright (C) 2013-2026 Ole André Vadla Ravnås <oleavr@nowsecure.com>
* Copyright (C) 2024 Håvard Sørbø <havard@hsorbo.no>
*
* Licence: wxWindows Library Licence, Version 3.1
@@ -378,6 +378,7 @@ static PyObject * PyGObject_marshal_variant (GVariant * variant);
static PyObject * PyGObject_marshal_variant_byte_array (GVariant * variant);
static PyObject * PyGObject_marshal_variant_dict (GVariant * variant);
static PyObject * PyGObject_marshal_variant_array (GVariant * variant);
static PyObject * PyGObject_marshal_variant_tuple (GVariant * variant);
static gboolean PyGObject_unmarshal_variant (PyObject * value, GVariant ** variant);
static gboolean PyGObject_unmarshal_variant_from_mapping (PyObject * mapping, GVariant ** variant);
static gboolean PyGObject_unmarshal_variant_from_sequence (PyObject * sequence, GVariant ** variant);
@@ -1749,10 +1750,20 @@ PyGObject_marshal_variant (GVariant * variant)
{
case G_VARIANT_CLASS_STRING:
return PyGObject_marshal_string (g_variant_get_string (variant, NULL));
case G_VARIANT_CLASS_BYTE:
return PyLong_FromLong (g_variant_get_byte (variant));
case G_VARIANT_CLASS_INT16:
return PyLong_FromLong (g_variant_get_int16 (variant));
case G_VARIANT_CLASS_UINT16:
return PyLong_FromUnsignedLong (g_variant_get_uint16 (variant));
case G_VARIANT_CLASS_INT32:
return PyLong_FromLong (g_variant_get_int32 (variant));
case G_VARIANT_CLASS_UINT32:
return PyLong_FromUnsignedLong (g_variant_get_uint32 (variant));
case G_VARIANT_CLASS_INT64:
return PyLong_FromLongLong (g_variant_get_int64 (variant));
case G_VARIANT_CLASS_UINT64:
return PyLong_FromLongLong (g_variant_get_uint64 (variant));
return PyLong_FromUnsignedLongLong (g_variant_get_uint64 (variant));
case G_VARIANT_CLASS_DOUBLE:
return PyFloat_FromDouble (g_variant_get_double (variant));
case G_VARIANT_CLASS_BOOLEAN:
@@ -1765,6 +1776,19 @@ PyGObject_marshal_variant (GVariant * variant)
return PyGObject_marshal_variant_dict (variant);
return PyGObject_marshal_variant_array (variant);
case G_VARIANT_CLASS_TUPLE:
return PyGObject_marshal_variant_tuple (variant);
case G_VARIANT_CLASS_VARIANT:
{
GVariant * inner;
PyObject * result;
inner = g_variant_get_variant (variant);
result = PyGObject_marshal_variant (inner);
g_variant_unref (inner);
return result;
}
default:
break;
}
@@ -1823,13 +1847,6 @@ PyGObject_marshal_variant_array (GVariant * variant)
for (i = 0; (child = g_variant_iter_next_value (&iter)) != NULL; i++)
{
if (g_variant_is_of_type (child, G_VARIANT_TYPE_VARIANT))
{
GVariant * inner = g_variant_get_variant (child);
g_variant_unref (child);
child = inner;
}
PyList_SetItem (list, i, PyGObject_marshal_variant (child));
g_variant_unref (child);
@@ -1838,6 +1855,28 @@ PyGObject_marshal_variant_array (GVariant * variant)
return list;
}
static PyObject *
PyGObject_marshal_variant_tuple (GVariant * variant)
{
GVariantIter iter;
PyObject * tuple;
guint i;
GVariant * child;
g_variant_iter_init (&iter, variant);
tuple = PyTuple_New (g_variant_iter_n_children (&iter));
for (i = 0; (child = g_variant_iter_next_value (&iter)) != NULL; i++)
{
PyTuple_SetItem (tuple, i, PyGObject_marshal_variant (child));
g_variant_unref (child);
}
return tuple;
}
static gboolean
PyGObject_unmarshal_variant (PyObject * value, GVariant ** variant)
{
@@ -1847,14 +1886,14 @@ PyGObject_unmarshal_variant (PyObject * value, GVariant ** variant)
PyGObject_unmarshal_string (value, &str);
*variant = g_variant_new_take_string (str);
*variant = g_variant_ref_sink (g_variant_new_take_string (str));
return TRUE;
}
if (PyBool_Check (value))
{
*variant = g_variant_new_boolean (value == Py_True);
*variant = g_variant_ref_sink (g_variant_new_boolean (value == Py_True));
return TRUE;
}
@@ -1867,14 +1906,14 @@ PyGObject_unmarshal_variant (PyObject * value, GVariant ** variant)
if (l == -1 && PyErr_Occurred ())
return FALSE;
*variant = g_variant_new_int64 (l);
*variant = g_variant_ref_sink (g_variant_new_int64 (l));
return TRUE;
}
if (PyFloat_Check (value))
{
*variant = g_variant_new_double (PyFloat_AsDouble (value));
*variant = g_variant_ref_sink (g_variant_new_double (PyFloat_AsDouble (value)));
return TRUE;
}
@@ -1888,7 +1927,7 @@ PyGObject_unmarshal_variant (PyObject * value, GVariant ** variant)
PyBytes_AsStringAndSize (value, &buffer, &length);
copy = g_memdup2 (buffer, length);
*variant = g_variant_new_from_data (G_VARIANT_TYPE_BYTESTRING, copy, length, TRUE, g_free, copy);
*variant = g_variant_ref_sink (g_variant_new_from_data (G_VARIANT_TYPE_BYTESTRING, copy, length, TRUE, g_free, copy));
return TRUE;
}
@@ -1934,12 +1973,13 @@ PyGObject_unmarshal_variant_from_mapping (PyObject * mapping, GVariant ** varian
g_variant_builder_add (&builder, "{sv}", PyBytes_AsString (key_bytes), raw_value);
g_variant_unref (raw_value);
Py_DecRef (key_bytes);
}
Py_DecRef (items);
*variant = g_variant_builder_end (&builder);
*variant = g_variant_ref_sink (g_variant_builder_end (&builder));
return TRUE;
@@ -1962,6 +2002,31 @@ PyGObject_unmarshal_variant_from_sequence (PyObject * sequence, GVariant ** vari
is_tuple = PyTuple_Check (sequence);
if (is_tuple && PyTuple_Size (sequence) == 2)
{
gchar * type;
gboolean is_uint64_cast;
if (!PyGObject_unmarshal_string (PyTuple_GetItem (sequence, 0), &type))
return FALSE;
is_uint64_cast = strcmp (type, "uint64") == 0;
g_free (type);
if (is_uint64_cast)
{
unsigned PY_LONG_LONG l;
l = PyLong_AsUnsignedLongLong (PyTuple_GetItem (sequence, 1));
if (l == (unsigned PY_LONG_LONG) -1 && PyErr_Occurred ())
return FALSE;
*variant = g_variant_ref_sink (g_variant_new_uint64 (l));
return TRUE;
}
}
g_variant_builder_init (&builder, is_tuple ? G_VARIANT_TYPE_TUPLE : G_VARIANT_TYPE ("av"));
n = PySequence_Length (sequence);
@@ -1984,10 +2049,11 @@ PyGObject_unmarshal_variant_from_sequence (PyObject * sequence, GVariant ** vari
else
g_variant_builder_add (&builder, "v", raw_value);
g_variant_unref (raw_value);
Py_DecRef (val);
}
*variant = g_variant_builder_end (&builder);
*variant = g_variant_ref_sink (g_variant_builder_end (&builder));
return TRUE;
@@ -2887,7 +2953,7 @@ PyDevice_spawn (PyDevice * self, PyObject * args, PyObject * kw)
goto invalid_dict_value;
}
g_hash_table_insert (aux, raw_key, g_variant_ref_sink (raw_value));
g_hash_table_insert (aux, raw_key, raw_value);
}
}
+1 -1
Submodule releng updated: 60585cf5cf...852c527081
+1 -1
View File
@@ -1,6 +1,6 @@
[wrap-git]
url = https://github.com/frida/frida-core.git
revision = 17.6.2
revision = 17.8.0
depth = 1
[provide]