Fix: close socket on protocol error, sendmsg MSG_NOSIGNAL
[lttng-ust.git] / liblttng-ust / lttng-ust-comm.c
index 049667bf298d2122ffb904fc554b96744eb0083f..fbdee7d3af8ea0d8d122ab3e4b3bb8a251ccc9a0 100644 (file)
@@ -111,8 +111,15 @@ static int lttng_ust_comm_should_quit;
 int ust_lock(void)
 {
        sigset_t sig_all_blocked, orig_mask;
-       int ret;
+       int ret, oldstate;
 
+       ret = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
+       if (ret) {
+               ERR("pthread_setcancelstate: %s", strerror(ret));
+       }
+       if (oldstate != PTHREAD_CANCEL_ENABLE) {
+               ERR("pthread_setcancelstate: unexpected oldstate");
+       }
        sigfillset(&sig_all_blocked);
        ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_mask);
        if (ret) {
@@ -140,8 +147,15 @@ int ust_lock(void)
 void ust_lock_nocheck(void)
 {
        sigset_t sig_all_blocked, orig_mask;
-       int ret;
+       int ret, oldstate;
 
+       ret = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
+       if (ret) {
+               ERR("pthread_setcancelstate: %s", strerror(ret));
+       }
+       if (oldstate != PTHREAD_CANCEL_ENABLE) {
+               ERR("pthread_setcancelstate: unexpected oldstate");
+       }
        sigfillset(&sig_all_blocked);
        ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_mask);
        if (ret) {
@@ -161,7 +175,7 @@ void ust_lock_nocheck(void)
 void ust_unlock(void)
 {
        sigset_t sig_all_blocked, orig_mask;
-       int ret;
+       int ret, oldstate;
 
        sigfillset(&sig_all_blocked);
        ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_mask);
@@ -174,6 +188,13 @@ void ust_unlock(void)
        if (ret) {
                ERR("pthread_sigmask: %s", strerror(ret));
        }
+       ret = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
+       if (ret) {
+               ERR("pthread_setcancelstate: %s", strerror(ret));
+       }
+       if (oldstate != PTHREAD_CANCEL_DISABLE) {
+               ERR("pthread_setcancelstate: unexpected oldstate");
+       }
 }
 
 /*
@@ -552,13 +573,13 @@ int handle_message(struct sock_info *sock_info,
 
        if (ust_lock()) {
                ret = -LTTNG_UST_ERR_EXITING;
-               goto end;
+               goto error;
        }
 
        ops = objd_ops(lum->handle);
        if (!ops) {
                ret = -ENOENT;
-               goto end;
+               goto error;
        }
 
        switch (lum->cmd) {
@@ -619,12 +640,12 @@ int handle_message(struct sock_info *sock_info,
                                }
                                ret = len;
                                free(bytecode);
-                               goto end;
+                               goto error;
                        } else {
                                DBG("incorrect filter data message size: %zd", len);
                                ret = -EINVAL;
                                free(bytecode);
-                               goto end;
+                               goto error;
                        }
                }
                bytecode->bc.len = lum->u.filter.data_size;
@@ -684,12 +705,12 @@ int handle_message(struct sock_info *sock_info,
                                }
                                ret = len;
                                free(node);
-                               goto end;
+                               goto error;
                        } else {
                                DBG("Incorrect exclusion data message size: %zd", len);
                                ret = -EINVAL;
                                free(node);
-                               goto end;
+                               goto error;
                        }
                }
                if (ops->cmd) {
@@ -730,11 +751,11 @@ int handle_message(struct sock_info *sock_info,
                                        goto error;
                                }
                                ret = len;
-                               goto end;
+                               goto error;
                        } else {
                                DBG("incorrect channel data message size: %zd", len);
                                ret = -EINVAL;
-                               goto end;
+                               goto error;
                        }
                }
                args.channel.chan_data = chan_data;
@@ -755,7 +776,7 @@ int handle_message(struct sock_info *sock_info,
                        &args.stream.shm_fd,
                        &args.stream.wakeup_fd);
                if (ret) {
-                       goto end;
+                       goto error;
                }
                if (ops->cmd)
                        ret = ops->cmd(lum->handle, lum->cmd,
@@ -775,7 +796,6 @@ int handle_message(struct sock_info *sock_info,
                break;
        }
 
-end:
        lur.handle = lum->handle;
        lur.cmd = lum->cmd;
        lur.ret_val = ret;
@@ -1376,7 +1396,13 @@ restart:
                        print_cmd(lum.cmd, lum.handle);
                        ret = handle_message(sock_info, sock, &lum);
                        if (ret) {
-                               ERR("Error handling message for %s socket", sock_info->name);
+                               ERR("Error handling message for %s socket",
+                                       sock_info->name);
+                               /*
+                                * Close socket if protocol error is
+                                * detected.
+                                */
+                               goto end;
                        }
                        continue;
                default:
This page took 0.024748 seconds and 4 git commands to generate.