fix launchpad fd smack issue 49/52249/3 accepted/tizen/mobile/20151122.234132 accepted/tizen/tv/20151122.234138 accepted/tizen/wearable/20151122.234145 submit/tizen/20151120.075035
authorHwankyu Jhun <h.jhun@samsung.com>
Fri, 20 Nov 2015 06:56:18 +0000 (15:56 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Fri, 20 Nov 2015 07:37:41 +0000 (16:37 +0900)
- close all open fds before launching an app
- change launchpad-process-pool socket name
- fix socket activation about launchpad-process-pool

Change-Id: Ic1035199a2401e2d322230468cd3764adb4547b4
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
inc/launchpad_common.h
packaging/launchpad-process-pool.socket
src/launchpad.c
src/launchpad_common.c
src/launchpad_lib.c

index ddd2fabd7c5404fe2514ee5991d442bbd90037f7..71779e2311467bb9220c728add46764a1bde151e 100644 (file)
@@ -69,7 +69,7 @@ char *_proc_get_cmdline_bypid(int pid);
 app_info_from_db *_get_app_info_from_bundle_by_pkgname(const char *pkgname, bundle *kb);
 void _modify_bundle(bundle * kb, int caller_pid, app_info_from_db * menu_info, int cmd);
 
-int _create_server_sock(int pid);
+int _create_server_sock(const char *name);
 app_pkt_t *_recv_pkt_raw(int fd, int *clifd, struct ucred *cr);
 int _send_pkt_raw(int client_fd, app_pkt_t *pkt);
 int  _connect_to_launchpad(int type);
index 611fcc74fa0ffb08e9a3b796ce8e08bc34f9e154..6d68ff584f338b3223b92fdce7a9c00c80329a79 100644 (file)
@@ -1,8 +1,5 @@
 [Socket]
-ListenStream=/run/user/%U/-5
-ListenStream=/run/user/%U/.launchpad-type0
-ListenStream=/run/user/%U/.launchpad-type1
-ListenStream=/run/user/%U/.launchpad-type2
+ListenStream=/run/user/%U/.launchpad-process-pool-sock
 
 Service=launchpad-process-pool.service
 
index 423126bac3daf81a91f8645d60d46d6ce5a37d21..82b8029ad21348f3c642cb13de7121230c210d44 100755 (executable)
@@ -42,7 +42,7 @@
 #define EXEC_CANDIDATE_WAIT 1
 #define DIFF(a,b) (((a)>(b))?(a)-(b):(b)-(a))
 #define CANDIDATE_NONE 0
-#define PROCESS_POOL_LAUNCHPAD_PID  -5
+#define PROCESS_POOL_LAUNCHPAD_SOCK ".launchpad-process-pool-sock"
 
 typedef struct {
        int pid;
@@ -128,8 +128,6 @@ static int __listen_candidate_process(int type)
 {
        struct sockaddr_un addr;
        int fd = -1;
-       int listen_fds = 0;
-       int i;
 
        _D("[launchpad] enter, type: %d", type);
 
@@ -138,20 +136,6 @@ static int __listen_candidate_process(int type)
        snprintf(addr.sun_path, UNIX_PATH_MAX, "%s/%d/%s%d", SOCKET_PATH, getuid(),
                LAUNCHPAD_LOADER_SOCKET_NAME, type);
 
-       listen_fds = sd_listen_fds(0);
-       if (listen_fds < 0) {
-               _E("Invalid systemd environment");
-               return -1;
-       } else if (listen_fds > 0) {
-               for (i = 0; i < listen_fds; i++) {
-                       fd = SD_LISTEN_FDS_START + i;
-                       if (sd_is_socket_unix(fd, SOCK_STREAM, 1, addr.sun_path, 0))
-                               return fd;
-               }
-               _E("Socket not found: %s", addr.sun_path);
-               return -1;
-       }
-
        fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
        if (fd < 0) {
                _E("Socket error");
@@ -486,15 +470,20 @@ static int __launch_directly(const char *appid, const char *app_path, int clifd,
 {
        char sock_path[UNIX_PATH_MAX] = {0,};
        int pid = fork();
+       int max_fd;
+       int iter_fd;
 
        if (pid == 0) {
                PERF("fork done");
                _D("lock up test log(no error) : fork done");
 
-               close(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);
+
                snprintf(sock_path, UNIX_PATH_MAX, "/run/user/%d/%d", getuid(), getpid());
                unlink(sock_path);
 
@@ -633,6 +622,21 @@ end:
        }
 }
 
+static int __create_sock_activation(void)
+{
+       int fds;
+
+       fds = sd_listen_fds(0);
+       if (fds == 1)
+               return SD_LISTEN_FDS_START;
+       else if (fds > 1)
+               _E("Too many file descriptors received.\n");
+       else
+               _D("There is no socket stream");
+
+       return -1;
+}
+
 static int __launchpad_pre_init(int argc, char **argv)
 {
        int fd;
@@ -641,10 +645,13 @@ static int __launchpad_pre_init(int argc, char **argv)
        __signal_init();
 
        /* create launchpad sock */
-       fd = _create_server_sock(PROCESS_POOL_LAUNCHPAD_PID);
+       fd = __create_sock_activation();
        if (fd < 0) {
-               _E("server sock error %d", fd);
-               return -1;
+               fd = _create_server_sock(PROCESS_POOL_LAUNCHPAD_SOCK);
+               if (fd < 0) {
+                       _E("server sock error %d", fd);
+                       return -1;
+               }
        }
 
        return fd;
index afa2deefe345d3b3e36870849d492f45ee5c027f..f37c369f90eb1a2d3447a0c352b7d7856ae67bd3 100644 (file)
@@ -173,7 +173,7 @@ static int __parse_app_path(const char *arg, char *out, int out_size)
        return -2;
 }
 
-int _create_server_sock(int pid)
+int _create_server_sock(const char *name)
 {
        struct sockaddr_un saddr;
        int fd;
@@ -195,7 +195,7 @@ int _create_server_sock(int pid)
 
        memset(&saddr, 0, sizeof(saddr));
        saddr.sun_family = AF_UNIX;
-       snprintf(saddr.sun_path, UNIX_PATH_MAX, "/run/user/%d/%d", getuid(), pid);
+       snprintf(saddr.sun_path, UNIX_PATH_MAX, "/run/user/%d/%s", getuid(), name);
        unlink(saddr.sun_path);
 
        if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
index 376c3c0b674898b7a25f8c500fd5596b11826703..5aca7a6a7171e2e9f2dd22e0f2d28f92d5fe2b8f 100644 (file)
@@ -267,11 +267,11 @@ static void __receiver_cb(int fd)
        _D("[candidate] recv_ret: %d, pkt->len: %d", recv_ret, pkt->len);
 
        __loader_adapter->remove_fd(__loader_user_data, fd);
+       close(fd);
        ret = __candidate_process_launchpad_main_loop(pkt, __argv[0], &__argc, &__argv,
                __loader_type);
        SECURE_LOGD("[candidate] real app argv[0]: %s, real app argc: %d", __argv[0],
                    __argc);
-       close(fd);
        free(pkt);
 
        if (ret >= 0) {