b90364b34f
PR: 249549 PR: 249550 PR: 249570 PR: 249734 PR: 249735 PR: 249738 Approved by: desktop (tcberner) Obtained from: ArchLinux, see Bugzilla PRs for details
118 lines
3.7 KiB
C
118 lines
3.7 KiB
C
--- lib/gibber/gibber-unix-transport.c.orig 2010-10-22 15:15:56 UTC
|
|
+++ lib/gibber/gibber-unix-transport.c
|
|
@@ -217,11 +217,12 @@ gibber_unix_transport_send_credentials (GibberUnixTran
|
|
gsize size)
|
|
{
|
|
int fd, ret;
|
|
- struct ucred *cred;
|
|
struct msghdr msg;
|
|
- struct cmsghdr *ch;
|
|
struct iovec iov;
|
|
- char buffer[CMSG_SPACE (sizeof (struct ucred))];
|
|
+ union {
|
|
+ struct cmsghdr hdr;
|
|
+ char cred[CMSG_SPACE (sizeof (struct cmsgcred))];
|
|
+ } buffer;
|
|
|
|
DEBUG ("send credentials");
|
|
fd = GIBBER_FD_TRANSPORT (transport)->fd;
|
|
@@ -234,21 +235,15 @@ gibber_unix_transport_send_credentials (GibberUnixTran
|
|
memset (&msg, 0, sizeof (msg));
|
|
msg.msg_iov = &iov;
|
|
msg.msg_iovlen = 1;
|
|
- msg.msg_control = buffer;
|
|
- msg.msg_controllen = sizeof (buffer);
|
|
+ msg.msg_control = (caddr_t) &buffer;
|
|
+ msg.msg_controllen = CMSG_SPACE (sizeof (struct cmsgcred));
|
|
memset (buffer, 0, sizeof (buffer));
|
|
|
|
/* Set the credentials */
|
|
- ch = CMSG_FIRSTHDR (&msg);
|
|
- ch->cmsg_len = CMSG_LEN (sizeof (struct ucred));
|
|
- ch->cmsg_level = SOL_SOCKET;
|
|
- ch->cmsg_type = SCM_CREDENTIALS;
|
|
+ buffer.hdr.cmsg_len = CMSG_LEN (sizeof (struct cmsgcred));
|
|
+ buffer.hdr.cmsg_level = SOL_SOCKET;
|
|
+ buffer.hdr.cmsg_type = SCM_CREDS;
|
|
|
|
- cred = (struct ucred *) CMSG_DATA (ch);
|
|
- cred->pid = getpid ();
|
|
- cred->uid = getuid ();
|
|
- cred->gid = getgid ();
|
|
-
|
|
ret = sendmsg (fd, &msg, 0);
|
|
if (ret == -1)
|
|
{
|
|
@@ -274,10 +269,10 @@ gibber_unix_transport_read (GibberFdTransport *transpo
|
|
GibberBuffer buf;
|
|
struct iovec iov;
|
|
struct msghdr msg;
|
|
- char control[CMSG_SPACE (sizeof (struct ucred))];
|
|
- struct cmsghdr *ch;
|
|
- struct ucred *cred;
|
|
- int opt;
|
|
+ union {
|
|
+ struct cmsghdr hdr;
|
|
+ char cred[CMSG_SPACE (sizeof (struct cmsgcred))];
|
|
+ } control;
|
|
|
|
if (priv->recv_creds_cb == NULL)
|
|
return gibber_fd_transport_read (transport, channel, error);
|
|
@@ -285,10 +280,6 @@ gibber_unix_transport_read (GibberFdTransport *transpo
|
|
/* We are waiting for credentials */
|
|
fd = transport->fd;
|
|
|
|
- /* set SO_PASSCRED flag */
|
|
- opt = 1;
|
|
- setsockopt (fd, SOL_SOCKET, SO_PASSCRED, &opt, sizeof (opt));
|
|
-
|
|
memset (buffer, 0, sizeof (buffer));
|
|
memset (&iov, 0, sizeof (iov));
|
|
iov.iov_base = buffer;
|
|
@@ -297,8 +288,9 @@ gibber_unix_transport_read (GibberFdTransport *transpo
|
|
memset (&msg, 0, sizeof (msg));
|
|
msg.msg_iov = &iov;
|
|
msg.msg_iovlen = 1;
|
|
- msg.msg_control = control;
|
|
- msg.msg_controllen = sizeof (control);
|
|
+ memset (&control, 0, sizeof (control));
|
|
+ msg.msg_control = (caddr_t) &control;
|
|
+ msg.msg_controllen = CMSG_SPACE (sizeof (struct cmsgcred));
|
|
|
|
bytes_read = recvmsg (fd, &msg, 0);
|
|
|
|
@@ -317,16 +309,11 @@ gibber_unix_transport_read (GibberFdTransport *transpo
|
|
return GIBBER_FD_IO_RESULT_ERROR;
|
|
}
|
|
|
|
- /* unset SO_PASSCRED flag */
|
|
- opt = 0;
|
|
- setsockopt (fd, SOL_SOCKET, SO_PASSCRED, &opt, sizeof (opt));
|
|
-
|
|
buf.data = buffer;
|
|
buf.length = bytes_read;
|
|
|
|
/* extract the credentials */
|
|
- ch = CMSG_FIRSTHDR (&msg);
|
|
- if (ch == NULL)
|
|
+ if (control.hdr.cmsg_len < CMSG_LEN (sizeof (struct cmsgcred)) || control.hdr.cmsg_type != SCM_CREDS)
|
|
{
|
|
GError *err = NULL;
|
|
|
|
@@ -342,11 +329,12 @@ gibber_unix_transport_read (GibberFdTransport *transpo
|
|
else
|
|
{
|
|
GibberCredentials credentials;
|
|
+ struct cmsgcred *cred;
|
|
|
|
- cred = (struct ucred *) CMSG_DATA (ch);
|
|
- credentials.pid = cred->pid;
|
|
- credentials.uid = cred->uid;
|
|
- credentials.gid = cred->gid;
|
|
+ cred = (struct cmsgcred *) CMSG_DATA (&control);
|
|
+ credentials.pid = cred->cmcred_pid;
|
|
+ credentials.uid = cred->cmcred_uid;
|
|
+ credentials.gid = cred->cmcred_gid;
|
|
|
|
priv->recv_creds_cb (self, &buf, &credentials, NULL,
|
|
priv->recv_creds_data);
|