Beispiel #1
0
static
int recv_fd_from_master(struct run_as_worker *worker, enum run_as_cmd cmd, int *fd)
{
	int ret = 0;

	switch (cmd) {
	case RUN_AS_EXTRACT_ELF_SYMBOL_OFFSET:
	case RUN_AS_EXTRACT_SDT_PROBE_OFFSETS:
	case RUN_AS_MKDIRAT:
	case RUN_AS_MKDIRAT_RECURSIVE:
		break;
	case RUN_AS_MKDIR:
	case RUN_AS_MKDIR_RECURSIVE:
		*fd = AT_FDCWD;
		/* fall-through */
	default:
		return 0;
	}

	ret = do_recv_fd(worker->sockpair[1], fd);
	if (ret < 0) {
		PERROR("do_recv_fd error");
		ret = -1;
	}

	return ret;
}
Beispiel #2
0
static
int run_as_cmd(struct run_as_worker *worker,
		enum run_as_cmd cmd,
		struct run_as_data *data,
		uid_t uid, gid_t gid)
{
	ssize_t readlen, writelen;
	struct run_as_ret recvret;

	/*
	 * If we are non-root, we can only deal with our own uid.
	 */
	if (geteuid() != 0) {
		if (uid != geteuid()) {
			recvret.ret = -1;
			recvret._errno = EPERM;
			ERR("Client (%d)/Server (%d) UID mismatch (and sessiond is not root)",
				(int) uid, (int) geteuid());
			goto end;
		}
	}

	data->cmd = cmd;
	data->uid = uid;
	data->gid = gid;

	writelen = lttcomm_send_unix_sock(worker->sockpair[0], data,
			sizeof(*data));
	if (writelen < sizeof(*data)) {
		PERROR("Error writing message to run_as");
		recvret.ret = -1;
		recvret._errno = errno;
		goto end;
	}

	/* receive return value */
	readlen = lttcomm_recv_unix_sock(worker->sockpair[0], &recvret,
			sizeof(recvret));
	if (!readlen) {
		ERR("Run-as worker has hung-up during run_as_cmd");
		recvret.ret = -1;
		recvret._errno = EIO;
		goto end;
	} else if (readlen < sizeof(recvret)) {
		PERROR("Error reading response from run_as");
		recvret.ret = -1;
		recvret._errno = errno;
	}
	if (do_recv_fd(worker, cmd, &recvret.ret)) {
		recvret.ret = -1;
		recvret._errno = EIO;
	}

end:
	errno = recvret._errno;
	return recvret.ret;
}
Beispiel #3
0
static
int recv_fd_from_worker(struct run_as_worker *worker, enum run_as_cmd cmd, int *fd)
{
	int ret = 0;

	switch (cmd) {
	case RUN_AS_OPEN:
		break;
	default:
		return 0;
	}

	ret = do_recv_fd(worker->sockpair[0], fd);
	if (ret < 0) {
		PERROR("do_recv_fd error");
		ret = -1;
	}

	return ret;
}