← Back to team overview

kernel-packages team mailing list archive

[Bug 1540731] Re: SocketMessenger::update_session_creds() fails to get client PID, causing "[ FAILED ] PromptSessionClientAPI.client_pid_is_associated_with_session" on kernel 4.4 (but kernel 4.3 works)

 

I built a Xenial test kernel with this commit reverted.  I confirmed
this test kernel resolves the bug on my setup.  It would be great if
others can test this kernel to confirm it resolves the bug.  It can be
downloaded from:

http://kernel.ubuntu.com/~jsalisbury/lp1540731/Commit3822b5cReverted/

Note, with this test kernel, you need to install both the linux-image
and linux-image-extra .deb packages.

If it is confirmed reverting this commit solves the bug, I will ping
upstream and have this commit reverted or fixed.

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1540731

Title:
  SocketMessenger::update_session_creds() fails to get client PID,
  causing "[ FAILED ]
  PromptSessionClientAPI.client_pid_is_associated_with_session" on
  kernel 4.4 (but kernel 4.3 works)

Status in GLibC:
  New
Status in Mir:
  Confirmed
Status in linux package in Ubuntu:
  In Progress

Bug description:
  Since updating to the 4.4.0-2 kernel recvmsg() fails SCM_CREDENTIALS
  request with EOPNOTSUPP.

  This manifests as a test failure in Mir:

      [ RUN      ] PromptSessionClientAPI.client_pid_is_associated_with_session
      unknown file: Failure

  Test case:

  #include <stdlib.h>
  #include <stdio.h>
  #include <sys/socket.h>
  #include <sys/stat.h>
  #include <assert.h>
  #include <errno.h>
  #include <string.h>

  int main()
  {
      enum { server, client, size };
      int socket_fd[size];
      int const opt = 1;

      assert(socketpair(AF_LOCAL, SOCK_STREAM, 0, socket_fd) == 0);

      char const msg[] = "A random message";
      send(socket_fd[client], msg, sizeof msg, MSG_DONTWAIT | MSG_NOSIGNAL);

      assert(setsockopt(socket_fd[server], SOL_SOCKET, SO_PASSCRED,
  &opt, sizeof(opt)) != -1);

      union {
          struct cmsghdr cmh;
          char control[CMSG_SPACE(sizeof(ucred))];
      } control_un;

      control_un.cmh.cmsg_len = CMSG_LEN(sizeof(ucred));
      control_un.cmh.cmsg_level = SOL_SOCKET;
      control_un.cmh.cmsg_type = SCM_CREDENTIALS;

      msghdr msgh;
      msgh.msg_name = NULL;
      msgh.msg_namelen = 0;
      msgh.msg_iov = NULL;
      msgh.msg_iovlen = 0;
      msgh.msg_control = control_un.control;
      msgh.msg_controllen = sizeof(control_un.control);

      errno = 0;

      if (recvmsg(socket_fd[server], &msgh, MSG_PEEK) == -1)
      {
          printf("Error: %s\n", strerror(errno));
          exit(EXIT_FAILURE);
      }
      else
      {
          printf("Success!\n");
          exit(EXIT_SUCCESS);
      }
  }

To manage notifications about this bug go to:
https://bugs.launchpad.net/glibc/+bug/1540731/+subscriptions