[-]
[+]
|
Changed |
_service:tar_git:libgbinder.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,6 +2,6 @@
<service name="tar_git">
<param name="url">https://github.com/mer-hybris/libgbinder.git</param>
<param name="branch">master</param>
- <param name="revision">141bda151b94d6640df8434abdd97b7146972c82</param>
+ <param name="revision">1.0.32</param>
</service>
</services>
\ No newline at end of file
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/Makefile
^
|
@@ -2,7 +2,7 @@
.PHONY: clean all debug release test
.PHONY: print_debug_so print_release_so
-.PHONY: print_debug_lib print_release_lib
+.PHONY: print_debug_lib print_release_lib print_coverage_lib
.PHONY: print_debug_link print_release_link
.PHONY: print_debug_path print_release_path
@@ -24,7 +24,7 @@
VERSION_MAJOR = 1
VERSION_MINOR = 0
-VERSION_RELEASE = 30
+VERSION_RELEASE = 32
# Version for pkg-config
PCVERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_RELEASE)
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/debian/changelog
^
|
@@ -1,3 +1,15 @@
+libgbinder (1.0.32) unstable; urgency=low
+
+ * Refuse to perform transactions with dead objects
+
+ -- Slava Monich <slava.monich@jolla.com> Fri, 17 May 2019 15:57:30 +0300
+
+libgbinder (1.0.31) unstable; urgency=low
+
+ * Invalidate handle when remote object dies
+
+ -- Slava Monich <slava.monich@jolla.com> Mon, 13 May 2019 18:05:35 +0300
+
libgbinder (1.0.30) unstable; urgency=low
* Added gbinder_local_object_new()
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/src/gbinder_client.c
^
|
@@ -205,12 +205,15 @@
if (G_LIKELY(self)) {
GBinderRemoteObject* obj = self->remote;
- if (!req) {
- /* Default empty request (just the header, no parameters) */
- req = gbinder_client_cast(self)->basic_req;
+ if (G_LIKELY(!obj->dead)) {
+ if (!req) {
+ /* Default empty request (just the header, no parameters) */
+ req = gbinder_client_cast(self)->basic_req;
+ }
+ return gbinder_ipc_transact_sync_reply(obj->ipc, obj->handle,
+ code, req, status);
}
- return gbinder_ipc_transact_sync_reply(obj->ipc, obj->handle,
- code, req, status);
+ GDEBUG("Refusing to perform transaction with a dead object");
}
return NULL;
}
@@ -224,15 +227,18 @@
if (G_LIKELY(self)) {
GBinderRemoteObject* obj = self->remote;
- if (!req) {
- /* Default empty request (just the header, no parameters) */
- req = gbinder_client_cast(self)->basic_req;
+ if (G_LIKELY(!obj->dead)) {
+ if (!req) {
+ /* Default empty request (just the header, no parameters) */
+ req = gbinder_client_cast(self)->basic_req;
+ }
+ return gbinder_ipc_transact_sync_oneway(obj->ipc, obj->handle,
+ code, req);
}
- return gbinder_ipc_transact_sync_oneway(obj->ipc, obj->handle,
- code, req);
- } else {
- return (-EINVAL);
+ GDEBUG("Refusing to perform transaction with a dead object");
+ return (-ESTALE);
}
+ return (-EINVAL);
}
gulong
@@ -247,23 +253,27 @@
{
if (G_LIKELY(self)) {
GBinderRemoteObject* obj = self->remote;
- GBinderClientTx* tx = g_slice_new0(GBinderClientTx);
- tx->client = gbinder_client_ref(self);
- tx->reply = reply;
- tx->destroy = destroy;
- tx->user_data = user_data;
-
- if (!req) {
- /* Default empty request (just the header, no parameters) */
- req = gbinder_client_cast(self)->basic_req;
- }
+ if (G_LIKELY(!obj->dead)) {
+ GBinderClientTx* tx = g_slice_new0(GBinderClientTx);
- return gbinder_ipc_transact(obj->ipc, obj->handle, code, flags, req,
- gbinder_client_transact_reply, gbinder_client_transact_destroy, tx);
- } else {
- return 0;
+ tx->client = gbinder_client_ref(self);
+ tx->reply = reply;
+ tx->destroy = destroy;
+ tx->user_data = user_data;
+
+ if (!req) {
+ /* Default empty request (just the header, no parameters) */
+ req = gbinder_client_cast(self)->basic_req;
+ }
+
+ return gbinder_ipc_transact(obj->ipc, obj->handle, code,
+ flags, req, gbinder_client_transact_reply,
+ gbinder_client_transact_destroy, tx);
+ }
+ GDEBUG("Refusing to perform transaction with a dead object");
}
+ return 0;
}
void
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/src/gbinder_defaultservicemanager.c
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018 Jolla Ltd.
- * Copyright (C) 2018 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2019 Jolla Ltd.
+ * Copyright (C) 2018-2019 Slava Monich <slava.monich@jolla.com>
*
* You may use this file under the terms of BSD license as follows:
*
@@ -76,8 +76,6 @@
LIST_SERVICES_TRANSACTION
};
-/* As a special case, ServiceManager's handle is zero */
-#define DEFAULTSERVICEMANAGER_HANDLE (0)
#define DEFAULTSERVICEMANAGER_IFACE "android.os.IServiceManager"
GBinderServiceManager*
@@ -301,7 +299,6 @@
gbinder_defaultservicemanager_class_init(
GBinderDefaultServiceManagerClass* klass)
{
- klass->handle = DEFAULTSERVICEMANAGER_HANDLE;
klass->iface = DEFAULTSERVICEMANAGER_IFACE;
klass->default_device = GBINDER_DEFAULT_BINDER;
klass->rpc_protocol = &gbinder_rpc_protocol_binder;
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/src/gbinder_hwservicemanager.c
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018 Jolla Ltd.
- * Copyright (C) 2018 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2019 Jolla Ltd.
+ * Copyright (C) 2018-2019 Slava Monich <slava.monich@jolla.com>
*
* You may use this file under the terms of BSD license as follows:
*
@@ -80,8 +80,6 @@
ON_REGISTRATION_TRANSACTION = GBINDER_FIRST_CALL_TRANSACTION
};
-/* As a special case, ServiceManager's handle is zero */
-#define HWSERVICEMANAGER_HANDLE (0)
#define HWSERVICEMANAGER_IFACE "android.hidl.manager@1.0::IServiceManager"
#define HWSERVICEMANAGER_NOTIFICATION_IFACE \
"android.hidl.manager@1.0::IServiceNotification"
@@ -378,7 +376,6 @@
gbinder_hwservicemanager_class_init(
GBinderHwServiceManagerClass* klass)
{
- klass->handle = HWSERVICEMANAGER_HANDLE;
klass->iface = HWSERVICEMANAGER_IFACE;
klass->default_device = GBINDER_DEFAULT_HWBINDER;
klass->rpc_protocol = &gbinder_rpc_protocol_hwbinder;
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/src/gbinder_ipc.c
^
|
@@ -865,8 +865,39 @@
* GBinderObjectRegistry
*==========================================================================*/
+static
+void
+gbinder_ipc_invalidate_remote_handle_locked(
+ GBinderIpcPriv* priv,
+ guint32 handle)
+{
+ /* Caller holds priv->remote_objects_mutex */
+ if (priv->remote_objects) {
+ GVERBOSE_("handle %u", handle);
+ g_hash_table_remove(priv->remote_objects, GINT_TO_POINTER(handle));
+ if (g_hash_table_size(priv->remote_objects) == 0) {
+ g_hash_table_unref(priv->remote_objects);
+ priv->remote_objects = NULL;
+ }
+ }
+}
+
+void
+gbinder_ipc_invalidate_remote_handle(
+ GBinderIpc* self,
+ guint32 handle)
+{
+ GBinderIpcPriv* priv = self->priv;
+
+ /* Lock */
+ g_mutex_lock(&priv->remote_objects_mutex);
+ gbinder_ipc_invalidate_remote_handle_locked(priv, handle);
+ g_mutex_unlock(&priv->remote_objects_mutex);
+ /* Unlock */
+}
+
/**
- * Internal function called by gbinder_object_dispose(). Among other things,
+ * Internal functions called by gbinder_object_dispose(). Among other things,
* it means that it doesn't have to check GBinderIpc pointer for NULL.
*
* Note the following scenario (where object may be either local or remote):
@@ -914,16 +945,8 @@
/* Lock */
g_mutex_lock(&priv->remote_objects_mutex);
- if (obj->object.ref_count == 1 && priv->remote_objects) {
- void* key = GINT_TO_POINTER(obj->handle);
-
- GVERBOSE_("handle %u", obj->handle);
- GASSERT(g_hash_table_contains(priv->remote_objects, key));
- g_hash_table_remove(priv->remote_objects, key);
- if (g_hash_table_size(priv->remote_objects) == 0) {
- g_hash_table_unref(priv->remote_objects);
- priv->remote_objects = NULL;
- }
+ if (obj->object.ref_count == 1) {
+ gbinder_ipc_invalidate_remote_handle_locked(priv, obj->handle);
}
g_mutex_unlock(&priv->remote_objects_mutex);
/* Unlock */
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/src/gbinder_ipc.h
^
|
@@ -100,6 +100,11 @@
guint32 handle,
gboolean maybe_dead);
+void
+gbinder_ipc_invalidate_remote_handle(
+ GBinderIpc* ipc,
+ guint32 handle);
+
GBinderRemoteReply*
gbinder_ipc_transact_sync_reply(
GBinderIpc* ipc,
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/src/gbinder_remote_object.c
^
|
@@ -33,6 +33,7 @@
#include "gbinder_driver.h"
#include "gbinder_ipc.h"
#include "gbinder_remote_object_p.h"
+#include "gbinder_servicemanager_p.h"
#include "gbinder_log.h"
struct gbinder_remote_object_priv {
@@ -71,6 +72,10 @@
GASSERT(!self->dead);
if (!self->dead) {
self->dead = TRUE;
+ /* ServiceManager always has the same handle, and can be reanimated. */
+ if (self->handle != GBINDER_SERVICEMANAGER_HANDLE) {
+ gbinder_ipc_invalidate_remote_handle(self->ipc, self->handle);
+ }
gbinder_driver_clear_death_notification(driver, self);
gbinder_driver_release(driver, self->handle);
g_signal_emit(self, gbinder_remote_object_signals[SIGNAL_DEATH], 0);
@@ -104,6 +109,7 @@
GBinderObjectRegistry* reg = gbinder_ipc_object_registry(ipc);
/* Kick the horse */
+ GASSERT(self->handle == GBINDER_SERVICEMANAGER_HANDLE);
if (gbinder_driver_ping(ipc->driver, reg, self->handle) == 0) {
/* Wow, it's alive! */
self->dead = FALSE;
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/src/gbinder_servicemanager.c
^
|
@@ -407,7 +407,7 @@
if (ipc) {
/* Create a possible dead remote object */
GBinderRemoteObject* object = gbinder_ipc_get_remote_object
- (ipc, klass->handle, TRUE);
+ (ipc, GBINDER_SERVICEMANAGER_HANDLE, TRUE);
if (object) {
gboolean first_ref;
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/src/gbinder_servicemanager_p.h
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018 Jolla Ltd.
- * Copyright (C) 2018 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2019 Jolla Ltd.
+ * Copyright (C) 2018-2019 Slava Monich <slava.monich@jolla.com>
*
* You may use this file under the terms of BSD license as follows:
*
@@ -39,6 +39,9 @@
#include <glib-object.h>
+/* As a special case, ServiceManager's handle is zero */
+#define GBINDER_SERVICEMANAGER_HANDLE (0)
+
typedef struct gbinder_servicemanager_priv GBinderServiceManagerPriv;
typedef struct gbinder_servicemanager {
@@ -60,7 +63,6 @@
GMutex mutex;
GHashTable* table;
- guint32 handle;
const char* iface;
const char* default_device;
const GBinderRpcProtocol* rpc_protocol;
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/unit/unit_client/unit_client.c
^
|
@@ -131,6 +131,44 @@
}
/*==========================================================================*
+ * dead
+ *==========================================================================*/
+
+static
+void
+test_dead_done(
+ GBinderRemoteObject* obj,
+ void* user_data)
+{
+ GVERBOSE_("");
+ test_quit_later((GMainLoop*)user_data);
+}
+
+static
+void
+test_dead(
+ void)
+{
+ const guint handle = 1;
+ GBinderClient* client = test_client_new(handle, "foo");
+ GBinderRemoteObject* obj = client->remote;
+ GMainLoop* loop = g_main_loop_new(NULL, FALSE);
+ const int fd = gbinder_driver_fd(gbinder_client_ipc(client)->driver);
+ gbinder_remote_object_add_death_handler(obj, test_dead_done, loop);
+
+ test_binder_br_dead_binder(fd, handle);
+ test_binder_set_looper_enabled(fd, TRUE);
+ test_run(&test_opt, loop);
+ g_assert(gbinder_remote_object_is_dead(obj));
+
+ g_assert(!gbinder_client_transact_sync_reply(client, 0, NULL, NULL));
+ g_assert(gbinder_client_transact_sync_oneway(client, 0, NULL) == -ESTALE);
+ g_assert(!gbinder_client_transact(client, 0, 0, NULL, NULL, NULL, NULL));
+
+ gbinder_client_unref(client);
+}
+
+/*==========================================================================*
* sync_oneway
*==========================================================================*/
@@ -352,6 +390,7 @@
g_test_init(&argc, &argv, NULL);
g_test_add_func(TEST_("null"), test_null);
g_test_add_func(TEST_("basic"), test_basic);
+ g_test_add_func(TEST_("dead"), test_dead);
g_test_add_func(TEST_("no_header"), test_no_header);
g_test_add_func(TEST_("sync_oneway"), test_sync_oneway);
g_test_add_func(TEST_("sync_reply"), test_sync_reply);
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/unit/unit_servicemanager/unit_servicemanager.c
^
|
@@ -209,7 +209,6 @@
G_DEFINE_TYPE(TestHwServiceManager, test_hwservicemanager,
GBINDER_TYPE_SERVICEMANAGER)
-#define TEST_HWSERVICEMANAGER_HANDLE (0)
#define TEST_HWSERVICEMANAGER_IFACE "android.hidl.manager@1.0::IServiceManager"
#define TEST_TYPE_HWSERVICEMANAGER (test_hwservicemanager_get_type())
#define TEST_IS_HWSERVICEMANAGER(obj) \
@@ -280,7 +279,6 @@
test_hwservicemanager_class_init(
TestHwServiceManagerClass* klass)
{
- klass->handle = TEST_HWSERVICEMANAGER_HANDLE;
klass->iface = TEST_HWSERVICEMANAGER_IFACE;
klass->default_device = GBINDER_DEFAULT_HWBINDER;
klass->rpc_protocol = &gbinder_rpc_protocol_hwbinder;
@@ -312,7 +310,6 @@
G_DEFINE_TYPE(TestDefServiceManager, test_defservicemanager,
GBINDER_TYPE_SERVICEMANAGER)
-#define TEST_DEFSERVICEMANAGER_HANDLE (0)
#define TEST_DEFSERVICEMANAGER_IFACE "android.os.IServiceManager"
#define TEST_TYPE_DEFSERVICEMANAGER (test_defservicemanager_get_type())
#define TEST_IS_DEFSERVICEMANAGER(obj) \
@@ -366,7 +363,6 @@
test_defservicemanager_class_init(
TestDefServiceManagerClass* klass)
{
- klass->handle = TEST_DEFSERVICEMANAGER_HANDLE;
klass->iface = TEST_DEFSERVICEMANAGER_IFACE;
klass->default_device = GBINDER_DEFAULT_BINDER;
klass->rpc_protocol = &gbinder_rpc_protocol_binder;
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/unit/unit_servicename/unit_servicename.c
^
|
@@ -93,7 +93,6 @@
G_DEFINE_TYPE(TestServiceManager, test_servicemanager,
GBINDER_TYPE_SERVICEMANAGER)
-#define TEST_SERVICEMANAGER_HANDLE (0)
#define TEST_SERVICEMANAGER_IFACE "android.os.IServiceManager"
#define TEST_TYPE_SERVICEMANAGER (test_servicemanager_get_type())
#define TEST_SERVICEMANAGER(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), \
@@ -201,7 +200,6 @@
test_servicemanager_class_init(
TestServiceManagerClass* klass)
{
- klass->handle = TEST_SERVICEMANAGER_HANDLE;
klass->iface = TEST_SERVICEMANAGER_IFACE;
klass->default_device = GBINDER_DEFAULT_HWBINDER;
klass->rpc_protocol = &gbinder_rpc_protocol_binder;
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-1.0.32.tar.bz2/unit/unit_servicepoll/unit_servicepoll.c
^
|
@@ -71,7 +71,6 @@
G_DEFINE_TYPE(TestServiceManager, test_servicemanager,
GBINDER_TYPE_SERVICEMANAGER)
-#define TEST_SERVICEMANAGER_HANDLE (0)
#define TEST_SERVICEMANAGER_IFACE "android.os.IServiceManager"
#define TEST_TYPE_SERVICEMANAGER (test_servicemanager_get_type())
#define TEST_SERVICEMANAGER(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), \
@@ -173,7 +172,6 @@
test_servicemanager_class_init(
TestServiceManagerClass* klass)
{
- klass->handle = TEST_SERVICEMANAGER_HANDLE;
klass->iface = TEST_SERVICEMANAGER_IFACE;
klass->default_device = GBINDER_DEFAULT_HWBINDER;
klass->rpc_protocol = &gbinder_rpc_protocol_binder;
|