From a26b4caf4cf5241e5c2145f53ec7170200ab4bb9 Mon Sep 17 00:00:00 2001 From: Kyle Russell Date: Mon, 19 Nov 2012 16:29:58 -0500 Subject: [PATCH] autosuspend_inited flag set even if initialization fails Prevents possible SIGSEGV on second autosuspend_enable attempt when first intialization attempt fails. autosuspend_inited should only be set once autosuspend_ops has been assigned. Consider the first call to autosuspend_enable(). autosuspend_init() sets its inited flag to true, and attempts to set autosuspend_ops. If all the other autosuspend_*_init() attempts fail, autosuspend_init() returns -1, which autosuspend_enable() will return as a failure. A second call to autosuspend_enable() will check autosuspend_init() and see that autosuspend has already been initialized. It will attempt to access autosuspend_ops, which were not set in the first initialization attempt, causing a SIGSEGV. Change-Id: Ib2d3ee62fee4c3b6d0323e5b7f3709a23c6b923f --- libsuspend/autosuspend.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libsuspend/autosuspend.c b/libsuspend/autosuspend.c index 7d1d973334e5..eb1f66e37074 100644 --- a/libsuspend/autosuspend.c +++ b/libsuspend/autosuspend.c @@ -33,8 +33,6 @@ static int autosuspend_init(void) return 0; } - autosuspend_inited = true; - autosuspend_ops = autosuspend_earlysuspend_init(); if (autosuspend_ops) { goto out; @@ -56,6 +54,8 @@ static int autosuspend_init(void) } out: + autosuspend_inited = true; + ALOGV("autosuspend initialized\n"); return 0; }