diff options
author | Hwankyu Jhun <h.jhun@samsung.com> | 2016-07-06 15:24:16 +0900 |
---|---|---|
committer | Hwankyu Jhun <h.jhun@samsung.com> | 2016-07-06 15:24:16 +0900 |
commit | 430dbe2e74269dd7f4a2389d7bc98c8f755cdaa4 (patch) | |
tree | c7e7e662c966db07d3945ea20248c34901501a14 | |
parent | 42cd958b6a32dc8b6dd5635b8b300ebb243c32d8 (diff) | |
download | launchpad-430dbe2e74269dd7f4a2389d7bc98c8f755cdaa4.tar.gz launchpad-430dbe2e74269dd7f4a2389d7bc98c8f755cdaa4.tar.bz2 launchpad-430dbe2e74269dd7f4a2389d7bc98c8f755cdaa4.zip |
Modify closing all open fdssubmit/tizen/20160707.014055accepted/tizen/wearable/20160707.043226accepted/tizen/tv/20160707.043046accepted/tizen/mobile/20160707.043235accepted/tizen/ivi/20160707.043156accepted/tizen/common/20160707.171555
Change-Id: Iafd862f582e9eb9bbeecf542c2dafcb510798cfb
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
-rw-r--r-- | inc/launchpad_common.h | 1 | ||||
-rwxr-xr-x | src/launchpad.c | 7 | ||||
-rw-r--r-- | src/launchpad_common.c | 41 | ||||
-rw-r--r-- | src/launchpad_loader.c | 7 |
4 files changed, 44 insertions, 12 deletions
diff --git a/inc/launchpad_common.h b/inc/launchpad_common.h index 4f13aaa..1c07962 100644 --- a/inc/launchpad_common.h +++ b/inc/launchpad_common.h @@ -116,6 +116,7 @@ appinfo_t *_appinfo_create(bundle *kb); void _appinfo_free(appinfo_t *menu_info); char *_appinfo_get_app_path(appinfo_t *menu_info); int _proc_get_attr_by_pid(int pid, char *buf, int size); +int _close_all_fds(int except); #endif /* __LAUNCHPAD_COMMON_H__ */ diff --git a/src/launchpad.c b/src/launchpad.c index c12abc6..4d85ea9 100755 --- a/src/launchpad.c +++ b/src/launchpad.c @@ -544,8 +544,6 @@ static int __launch_directly(const char *appid, const char *app_path, int clifd, candidate_process_context_t *cpc) { int pid = fork(); - int max_fd; - int iter_fd; if (pid == 0) { PERF("fork done"); @@ -554,10 +552,7 @@ static int __launch_directly(const char *appid, const char *app_path, int clifd, __signal_unblock_sigchld(); __signal_fini(); - max_fd = sysconf(_SC_OPEN_MAX); - for (iter_fd = 3; iter_fd <= max_fd; iter_fd++) - close(iter_fd); - + _close_all_fds(0); _delete_sock_path(getpid(), getuid()); PERF("prepare exec - first done"); diff --git a/src/launchpad_common.c b/src/launchpad_common.c index f9f318d..810dc9f 100644 --- a/src/launchpad_common.c +++ b/src/launchpad_common.c @@ -764,3 +764,44 @@ int _delete_sock_path(int pid, uid_t uid) return 0; } +int _close_all_fds(const int except) +{ + DIR *dp; + struct dirent dentry; + struct dirent *result = NULL; + int fd; + int max_fd; + + dp = opendir("/proc/self/fd"); + if (dp == NULL) { + /* fallback */ + max_fd = sysconf(_SC_OPEN_MAX); + for (fd = 3; fd < max_fd; fd++) { + if (fd != except) + close(fd); + } + + return 0; + } + + while (readdir_r(dp, &dentry, &result) == 0 && result) { + if (!isdigit(dentry.d_name[0])) + continue; + + fd = atoi(dentry.d_name); + if (fd < 3) + continue; + + if (fd == dirfd(dp)) + continue; + + if (fd == except) + continue; + + close(fd); + } + closedir(dp); + + return 0; +} + diff --git a/src/launchpad_loader.c b/src/launchpad_loader.c index 2e9d18b..c7d7220 100644 --- a/src/launchpad_loader.c +++ b/src/launchpad_loader.c @@ -266,8 +266,6 @@ static int __loader_launch_cb(int argc, char **argv, const char *app_path, static void __close_fds(void) { - int iter_fd; - int max_fd = sysconf(_SC_OPEN_MAX); int fd = -1; const char *sockfd; @@ -275,10 +273,7 @@ static void __close_fds(void) if (sockfd) fd = atoi(sockfd); - for (iter_fd = 3; iter_fd <= max_fd; iter_fd++) { - if (iter_fd != fd) - close(iter_fd); - } + _close_all_fds(fd); } static int __loader_terminate_cb(int argc, char **argv, void *user_data) |