58 lines
1.7 KiB
C
58 lines
1.7 KiB
C
--- gnome-keyring-daemon-io.c.orig Wed May 4 03:17:18 2005
|
|
+++ gnome-keyring-daemon-io.c Sat Jul 16 21:46:13 2005
|
|
@@ -100,14 +100,17 @@ read_unix_socket_credentials (int fd,
|
|
char buf;
|
|
|
|
#ifdef HAVE_CMSGCRED
|
|
- char cmsgmem[CMSG_SPACE (sizeof (struct cmsgcred))];
|
|
- struct cmsghdr *cmsg = (struct cmsghdr *) cmsgmem;
|
|
+ struct cmsgcred *cred;
|
|
+ union {
|
|
+ struct cmsghdr hdr;
|
|
+ char cred[CMSG_SPACE (sizeof (struct cmsgcred))];
|
|
+ } cmsg;
|
|
#endif
|
|
|
|
*pid = 0;
|
|
*uid = 0;
|
|
|
|
-#if defined(LOCAL_CREDS) && defined(HAVE_CMSGCRED)
|
|
+#if defined(LOCAL_CREDS) && defined(HAVE_CMSGCRED) && !defined(__FreeBSD__)
|
|
/* Set the socket to receive credentials on the next message */
|
|
{
|
|
int on = 1;
|
|
@@ -126,9 +129,9 @@ read_unix_socket_credentials (int fd,
|
|
msg.msg_iovlen = 1;
|
|
|
|
#ifdef HAVE_CMSGCRED
|
|
- memset (cmsgmem, 0, sizeof (cmsgmem));
|
|
- msg.msg_control = cmsgmem;
|
|
- msg.msg_controllen = sizeof (cmsgmem);
|
|
+ memset (&cmsg, 0, sizeof (cmsg));
|
|
+ msg.msg_control = (caddr_t) &cmsg;
|
|
+ msg.msg_controllen = CMSG_SPACE (sizeof (struct cmsgcred));
|
|
#endif
|
|
|
|
again:
|
|
@@ -147,7 +150,8 @@ read_unix_socket_credentials (int fd,
|
|
}
|
|
|
|
#ifdef HAVE_CMSGCRED
|
|
- if (cmsg->cmsg_len < sizeof (cmsgmem) || cmsg->cmsg_type != SCM_CREDS) {
|
|
+ if (cmsg.hdr.cmsg_len < CMSG_LEN (sizeof (struct cmsgcred)) ||
|
|
+ cmsg.hdr.cmsg_type != SCM_CREDS) {
|
|
g_warning ("Message from recvmsg() was not SCM_CREDS\n");
|
|
return FALSE;
|
|
}
|
|
@@ -168,10 +172,7 @@ read_unix_socket_credentials (int fd,
|
|
return FALSE;
|
|
}
|
|
#elif defined(HAVE_CMSGCRED)
|
|
- struct cmsgcred *cred;
|
|
-
|
|
- cred = (struct cmsgcred *) CMSG_DATA (cmsg);
|
|
-
|
|
+ cred = (struct cmsgcred *) CMSG_DATA (&cmsg);
|
|
*pid = cred->cmcred_pid;
|
|
*uid = cred->cmcred_euid;
|
|
#else /* !SO_PEERCRED && !HAVE_CMSGCRED */
|