return 1;
}
-static int check_perms(struct ucred *c)
+static int check_perms(uid_t uid)
{
int i;
if (!conf.user_allow_given)
return 1;
for (i = 0; i < conf.user_allow_given; i++)
- if (c->uid == conf.user_allow_arg[i])
+ if (uid == conf.user_allow_arg[i])
return 1;
return -E_UCRED_PERM;
}
static int handle_connect(void)
{
int i, argc, ret, clifd = -1;
- struct ucred c;
char *buf = para_malloc(MAXLINE), **argv = NULL;
struct sockaddr_un unix_addr;
if (ret < 0)
goto out;
clifd = ret;
- ret = recv_cred_buffer(clifd, buf, MAXLINE - 1, &c);
+ ret = recv_cred_buffer(clifd, buf, MAXLINE - 1);
if (ret < 0)
goto out;
- PARA_INFO_LOG("pid: %i, uid: %i, gid: %i, ret: %i, buf: %s\n", c.pid, c.uid, c.gid, ret, buf);
+ PARA_INFO_LOG("connection from user %i\n", ret);
buf[ret] = '\0';
- ret = check_perms(&c);
+ ret = check_perms(ret);
if (ret < 0)
goto out;
argc = split_args(buf, &argv, "\n");
* \param size the size of \a buffer
* \param cred the credentials are returned here
*
+ * \return negative on errors, the user id on success.
+ *
* \sa okir's Black Hats Manual
* \sa recvmsg(2)
*/
-int recv_cred_buffer(int fd, char *buf, size_t size, struct ucred *cred)
+int recv_cred_buffer(int fd, char *buf, size_t size)
{
char control[255];
struct msghdr msg;
struct iovec iov;
int result;
int yes = 1;
+ struct ucred cred;
setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &yes, sizeof(int));
memset(&msg, 0, sizeof(msg));
while (cmsg) {
if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type
== SCM_CREDENTIALS) {
- memcpy(cred, CMSG_DATA(cmsg), sizeof(struct ucred));
- result = iov.iov_len;
+ memcpy(&cred, CMSG_DATA(cmsg), sizeof(struct ucred));
+ result = cred.uid;
} else
if (cmsg->cmsg_level == SOL_SOCKET
&& cmsg->cmsg_type == SCM_RIGHTS) {
int para_accept(int, void *addr, socklen_t size);
int create_pf_socket(const char *, struct sockaddr_un *, int mod);
int init_unix_addr(struct sockaddr_un *, const char *);
-int recv_cred_buffer(int, char *, size_t, struct ucred *);
+int recv_cred_buffer(int, char *, size_t);
ssize_t send_cred_buffer(int, char*);
int recv_pattern(int fd, const char *pattern, size_t bufsize);
int init_tcp_socket(int port);