summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHwankyu Jhun <h.jhun@samsung.com>2016-07-06 15:24:16 +0900
committerHwankyu Jhun <h.jhun@samsung.com>2016-07-06 15:24:16 +0900
commit430dbe2e74269dd7f4a2389d7bc98c8f755cdaa4 (patch)
treec7e7e662c966db07d3945ea20248c34901501a14
parent42cd958b6a32dc8b6dd5635b8b300ebb243c32d8 (diff)
downloadlaunchpad-430dbe2e74269dd7f4a2389d7bc98c8f755cdaa4.tar.gz
launchpad-430dbe2e74269dd7f4a2389d7bc98c8f755cdaa4.tar.bz2
launchpad-430dbe2e74269dd7f4a2389d7bc98c8f755cdaa4.zip
Change-Id: Iafd862f582e9eb9bbeecf542c2dafcb510798cfb Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
-rw-r--r--inc/launchpad_common.h1
-rwxr-xr-xsrc/launchpad.c7
-rw-r--r--src/launchpad_common.c41
-rw-r--r--src/launchpad_loader.c7
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)