summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHwankyu Jhun <h.jhun@samsung.com>2015-11-03 16:42:22 +0900
committerHwankyu Jhun <h.jhun@samsung.com>2015-11-03 16:51:00 +0900
commitc935b4b48f0be70c2650143ae5ac4268e028f368 (patch)
tree34223cd937a104801c7c846cbe7f51d397150e38
parent134e7467c5b2bc3a3611b35458c3c55dffb08d60 (diff)
downloadappcore-agent-c935b4b48f0be70c2650143ae5ac4268e028f368.tar.gz
appcore-agent-c935b4b48f0be70c2650143ae5ac4268e028f368.tar.bz2
appcore-agent-c935b4b48f0be70c2650143ae5ac4268e028f368.zip
- Fix double free Change-Id: Icb6064f8d29fe9004f23fb118c96acd1c4743eb3 Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
-rw-r--r--include/service_app.h3
-rw-r--r--src/appcore-agent.c44
-rw-r--r--src/service_app_error.c15
-rw-r--r--src/service_app_main.c68
4 files changed, 29 insertions, 101 deletions
diff --git a/include/service_app.h b/include/service_app.h
index ac11273..55ed3d7 100644
--- a/include/service_app.h
+++ b/include/service_app.h
@@ -84,8 +84,7 @@ typedef void (*service_app_control_cb) (app_control_h app_control, void *user_da
* @see service_app_terminate_cb()
* @see service_app_control_cb()
*/
-typedef struct
-{
+typedef struct {
service_app_create_cb create; /**< This callback function is called at the start of the application. */
service_app_terminate_cb terminate; /**< This callback function is called once after the main loop of the application exits. */
service_app_control_cb app_control; /**< This callback function is called when another application sends the launch request to the application. */
diff --git a/src/appcore-agent.c b/src/appcore-agent.c
index 50f6d36..4848a2f 100644
--- a/src/appcore-agent.c
+++ b/src/appcore-agent.c
@@ -248,7 +248,6 @@ static void __exit_loop(void *data)
static void __do_app(enum agent_event event, void *data, bundle * b)
{
- int r = 0;
struct agent_priv *svc = data;
app_control_h app_control = NULL;
@@ -263,20 +262,18 @@ static void __do_app(enum agent_event event, void *data, bundle * b)
_ret_if(svc->ops == NULL);
if (app_control_create_event(b, &app_control) != 0)
- {
return;
- }
switch (event) {
case AGE_REQUEST:
if (svc->ops->app_control)
- r = svc->ops->app_control(app_control, svc->ops->data);
+ svc->ops->app_control(app_control, svc->ops->data);
svc->state = AGS_RUNNING;
break;
/* case AGE_STOP:
if(svc->state == AGS_RUNNING) {
if (svc->ops->stop)
- r = svc->ops->stop(svc->ops->data);
+ svc->ops->stop(svc->ops->data);
svc->state = AGS_STOPED;
}
break;
@@ -412,9 +409,8 @@ static int __sys_langchg_pre(void *data, void *evt)
r = setlocale(LC_ALL, lang);
if (r == NULL) {
r = setlocale(LC_ALL, lang);
- if (r) {
+ if (r)
_DBG("*****appcore-agent setlocale=%s\n", r);
- }
}
}
@@ -452,9 +448,8 @@ static int __sys_regionchg_pre(void *data, void *evt)
setenv("LC_IDENTIFICATION", region, 1);
r = setlocale(LC_ALL, "");
- if (r != NULL) {
+ if (r != NULL)
_DBG("*****appcore-agent setlocale=%s\n", r);
- }
}
return 0;
@@ -590,21 +585,19 @@ static int __del_vconf_list(void)
static int __aul_handler(aul_type type, bundle *b, void *data)
{
- int ret;
-
switch (type) {
case AUL_START:
- ret = __agent_request(data, b);
+ __agent_request(data, b);
break;
case AUL_RESUME:
break;
/* case AUL_STOP:
- ret = __service_stop(data);
+ __service_stop(data);
break;
*/
case AUL_TERMINATE:
case AUL_TERMINATE_BGAPP:
- ret = __agent_terminate(data);
+ __agent_terminate(data);
break;
default:
/* do nothing */
@@ -685,7 +678,7 @@ EXPORT_API int appcore_agent_init(const struct agent_ops *ops,
int argc, char **argv)
{
int r;
- char *dirname;
+ const char *dirname;
char *app_name = NULL;
int pid;
@@ -712,22 +705,20 @@ EXPORT_API int appcore_agent_init(const struct agent_ops *ops,
_retv_if(r == -1, -1);
r = aul_launch_init(__aul_handler, &core);
- if (r < 0) {
+ if (r < 0)
goto err;
- }
r = aul_launch_argv_handler(argc, argv);
- if (r < 0) {
+ if (r < 0)
goto err;
- }
core.ops = ops;
- core.state = 1; /* TODO: use enum value */
+ core.state = 1; /* TODO: use enum value */
return 0;
err:
__del_vconf_list();
- //__clear(&core);
+
return -1;
}
@@ -749,7 +740,6 @@ static int __before_loop(struct agent_priv *agent, int argc, char **argv)
if (agent->ops && agent->ops->create) {
r = agent->ops->create(agent->ops->data);
if (r < 0) {
- //appcore_exit();
if (agent->ops && agent->ops->terminate)
agent->ops->terminate(agent->ops->data);
errno = ECANCELED;
@@ -774,16 +764,16 @@ EXPORT_API int appcore_agent_terminate()
{
__del_vconf_list();
ecore_main_loop_thread_safe_call_sync((Ecore_Data_Cb)__exit_loop, NULL);
+
return 0;
}
EXPORT_API int appcore_agent_terminate_without_restart()
{
- int ret;
-
__del_vconf_list();
aul_status_update(STATUS_NORESTART);
ecore_main_loop_thread_safe_call_sync((Ecore_Data_Cb)__exit_loop, NULL);
+
return 0;
}
@@ -796,10 +786,8 @@ EXPORT_API int appcore_agent_main(int argc, char **argv,
_retv_if(r == -1, -1);
r = __before_loop(&priv, argc, argv);
- if (r == -1) {
- //__unset_data(&priv);
+ if (r == -1)
return -1;
- }
ecore_main_loop_begin();
@@ -807,7 +795,5 @@ EXPORT_API int appcore_agent_main(int argc, char **argv,
__after_loop(&priv);
- //__unset_data(&priv);
-
return 0;
}
diff --git a/src/service_app_error.c b/src/service_app_error.c
index b2f7c26..814808c 100644
--- a/src/service_app_error.c
+++ b/src/service_app_error.c
@@ -31,27 +31,20 @@
static const char* service_app_error_to_string(app_error_e error)
{
- switch (error)
- {
+ switch (error) {
case APP_ERROR_NONE:
return "NONE";
-
case APP_ERROR_INVALID_PARAMETER:
return "INVALID_PARAMETER";
-
case APP_ERROR_OUT_OF_MEMORY:
return "OUT_OF_MEMORY";
-
case APP_ERROR_INVALID_CONTEXT:
return "INVALID_CONTEXT";
-
case APP_ERROR_NO_SUCH_FILE:
return "NO_SUCH_FILE";
-
case APP_ERROR_ALREADY_RUNNING:
return "ALREADY_RUNNING";
-
- default :
+ default:
return "UNKNOWN";
}
}
@@ -59,13 +52,9 @@ static const char* service_app_error_to_string(app_error_e error)
int service_app_error(app_error_e error, const char* function, const char *description)
{
if (description)
- {
LOGE("[%s] %s(0x%08x) : %s", function, service_app_error_to_string(error), error, description);
- }
else
- {
LOGE("[%s] %s(0x%08x)", function, service_app_error_to_string(error), error);
- }
return error;
}
diff --git a/src/service_app_main.c b/src/service_app_main.c
index 3155a5f..a8704f7 100644
--- a/src/service_app_main.c
+++ b/src/service_app_main.c
@@ -16,22 +16,18 @@
#include <stdlib.h>
-
+#include <unistd.h>
#include <bundle.h>
#include <aul.h>
#include <dlog.h>
#include <vconf-internal-keys.h>
#include <app_common.h>
-
#include <Eina.h>
-
#include <appcore-agent.h>
+
#include "service_app_private.h"
#include "service_app_extension.h"
-#include <unistd.h>
-
-
#ifdef LOG_TAG
#undef LOG_TAG
#endif
@@ -40,13 +36,12 @@
#define TIZEN_PATH_MAX 1024
#endif
-
#define LOG_TAG "CAPI_APPFW_APPLICATION"
typedef enum {
- SERVICE_APP_STATE_NOT_RUNNING, // The application has been launched or was running but was terminated
- SERVICE_APP_STATE_CREATING, // The application is initializing the resources on service_app_create_cb callback
- SERVICE_APP_STATE_RUNNING, // The application is running in the foreground and background
+ SERVICE_APP_STATE_NOT_RUNNING, /* The application has been launched or was running but was terminated */
+ SERVICE_APP_STATE_CREATING, /* The application is initializing the resources on service_app_create_cb callback */
+ SERVICE_APP_STATE_RUNNING, /* The application is running in the foreground and background */
} service_app_state_e;
static int _service_app_get_id(char **id)
@@ -55,30 +50,20 @@ static int _service_app_get_id(char **id)
int ret = -1;
if (id == NULL)
- {
return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
- }
- if (id_buf[0] == '\0')
- {
+ if (id_buf[0] == '\0') {
ret = aul_app_get_appid_bypid(getpid(), id_buf, sizeof(id_buf));
-
- if (ret < 0) {
+ if (ret < 0)
return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, "failed to get the application ID");
- }
}
if (id_buf[0] == '\0')
- {
return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, "failed to get the application ID");
- }
*id = strdup(id_buf);
-
if (*id == NULL)
- {
return service_app_error(APP_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
- }
return APP_ERROR_NONE;
}
@@ -88,26 +73,18 @@ static int _service_appget_package_app_name(const char *appid, char **name)
char *name_token = NULL;
if (appid == NULL)
- {
return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
- }
- // com.vendor.name -> name
+ /* com.vendor.name -> name */
name_token = strrchr(appid, '.');
-
if (name_token == NULL)
- {
return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, NULL);
- }
name_token++;
*name = strdup(name_token);
-
if (*name == NULL)
- {
return service_app_error(APP_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
- }
return APP_ERROR_NONE;
}
@@ -297,19 +274,14 @@ static int _service_app_create(void *data)
service_app_create_cb create_cb;
if (app_context == NULL)
- {
return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, NULL);
- }
appcore_agent_initialized = 1;
_service_app_set_appcore_event_cb();
create_cb = app_context->callback->create;
-
if (create_cb == NULL || create_cb(app_context->data) == false)
- {
return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, "service_app_create_cb() returns false");
- }
app_context->state = SERVICE_APP_STATE_RUNNING;
@@ -322,16 +294,11 @@ static int _service_app_terminate(void *data)
service_app_terminate_cb terminate_cb;
if (app_context == NULL)
- {
return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, NULL);
- }
terminate_cb = app_context->callback->terminate;
-
if (terminate_cb != NULL)
- {
terminate_cb(app_context->data);
- }
_service_app_unset_appcore_event_cb();
@@ -347,16 +314,11 @@ static int _service_app_reset(app_control_h app_control, void *data)
service_app_control_cb service_cb;
if (app_context == NULL)
- {
return service_app_error(APP_ERROR_INVALID_CONTEXT, __FUNCTION__, NULL);
- }
service_cb = app_context->callback->app_control;
-
if (service_cb != NULL)
- {
service_cb(app_control, app_context->data);
- }
return APP_ERROR_NONE;
}
@@ -377,26 +339,18 @@ EXPORT_API int service_app_main(int argc, char **argv, service_app_lifecycle_cal
};
if (argc <= 0 || argv == NULL || callback == NULL)
- {
return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
- }
if (callback->create == NULL)
- {
return service_app_error(APP_ERROR_INVALID_PARAMETER, __FUNCTION__, "service_app_create_cb() callback must be registered");
- }
if (app_context.state != SERVICE_APP_STATE_NOT_RUNNING)
- {
return service_app_error(APP_ERROR_ALREADY_RUNNING, __FUNCTION__, NULL);
- }
-
- if (_service_app_get_id(&(app_context.package)) == APP_ERROR_NONE)
- {
- if (_service_appget_package_app_name(app_context.package, &(app_context.service_app_name)) != APP_ERROR_NONE)
- {
+ if (_service_app_get_id(&(app_context.package)) == APP_ERROR_NONE) {
+ if (_service_appget_package_app_name(app_context.package, &(app_context.service_app_name)) != APP_ERROR_NONE) {
free(app_context.package);
+ app_context.package = NULL;
}
}