From a44542ca74b7da5b44ba30c205c3244805bb0600 Mon Sep 17 00:00:00 2001 From: Serban Constantinescu Date: Thu, 30 Jan 2014 15:16:45 +0000 Subject: [PATCH] ServiceManager: Add extra error handling This patch extends the error handling. It also adds a check for a matching binder version - kernel/userspace. Change-Id: I43a262934b38c5711536aaa42754fed1ef04b39e Signed-off-by: Serban Constantinescu --- cmds/servicemanager/bctest.c | 4 ++++ cmds/servicemanager/binder.c | 9 +++++++-- cmds/servicemanager/service_manager.c | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/cmds/servicemanager/bctest.c b/cmds/servicemanager/bctest.c index ff5acedfa..ee49679fd 100644 --- a/cmds/servicemanager/bctest.c +++ b/cmds/servicemanager/bctest.c @@ -62,6 +62,10 @@ int main(int argc, char **argv) void *svcmgr = BINDER_SERVICE_MANAGER; bs = binder_open(128*1024); + if (!bs) { + fprintf(stderr, "failed to open binder driver\n"); + return -1; + } argc--; argv++; diff --git a/cmds/servicemanager/binder.c b/cmds/servicemanager/binder.c index 43cb7d35c..7fdd841ed 100644 --- a/cmds/servicemanager/binder.c +++ b/cmds/servicemanager/binder.c @@ -94,6 +94,7 @@ struct binder_state struct binder_state *binder_open(unsigned mapsize) { struct binder_state *bs; + struct binder_version vers; bs = malloc(sizeof(*bs)); if (!bs) { @@ -108,6 +109,12 @@ struct binder_state *binder_open(unsigned mapsize) goto fail_open; } + if ((ioctl(bs->fd, BINDER_VERSION, &vers) == -1) || + (vers.protocol_version != BINDER_CURRENT_PROTOCOL_VERSION)) { + fprintf(stderr, "binder: driver version differs from user space\n"); + goto fail_open; + } + bs->mapsize = mapsize; bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0); if (bs->mapped == MAP_FAILED) { @@ -116,8 +123,6 @@ struct binder_state *binder_open(unsigned mapsize) goto fail_map; } - /* TODO: check version */ - return bs; fail_map: diff --git a/cmds/servicemanager/service_manager.c b/cmds/servicemanager/service_manager.c index 3625e29f1..c8b219baf 100644 --- a/cmds/servicemanager/service_manager.c +++ b/cmds/servicemanager/service_manager.c @@ -275,6 +275,10 @@ int main(int argc, char **argv) void *svcmgr = BINDER_SERVICE_MANAGER; bs = binder_open(128*1024); + if (!bs) { + ALOGE("failed to open binder driver\n"); + return -1; + } if (binder_become_context_manager(bs)) { ALOGE("cannot become context manager (%s)\n", strerror(errno));