***/
#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/types.h>
-#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
-#include <sys/poll.h>
#include <sys/prctl.h>
#include <stddef.h>
#include <getopt.h>
#include "log.h"
#include "util.h"
-#include "hashmap.h"
-#include "socket-util.h"
#include "sd-daemon.h"
-#include "sd-bus.h"
#include "bus-internal.h"
-#include "bus-message.h"
-#include "bus-util.h"
#include "build.h"
#include "strv.h"
#include "def.h"
#include "capability.h"
-#include "bus-control.h"
-#include "smack-util.h"
-#include "set.h"
#include "bus-xml-policy.h"
-#include "driver.h"
#include "proxy.h"
-#include "synthesize.h"
static char *arg_address = NULL;
static char **arg_configuration = NULL;
typedef struct {
int fd;
SharedPolicy *policy;
+ uid_t bus_uid;
} ClientContext;
static ClientContext *client_context_free(ClientContext *c) {
if (!c)
return NULL;
- close(c->fd);
+ safe_close(c->fd);
free(c);
return NULL;
c = new0(ClientContext, 1);
if (!c)
- return log_oom();
+ return -ENOMEM;
c->fd = -1;
if (r < 0)
goto exit;
+ c->fd = -1;
+
/* set comm to "p$PIDu$UID" and suffix with '*' if truncated */
r = snprintf(comm, sizeof(comm), "p" PID_FMT "u" UID_FMT, p->local_creds.pid, p->local_creds.uid);
if (r >= (ssize_t)sizeof(comm))
if (r < 0)
goto exit;
- r = proxy_hello_policy(p, getuid());
+ r = proxy_hello_policy(p, c->bus_uid);
if (r < 0)
goto exit;
return NULL;
}
-static int loop_clients(int accept_fd) {
+static int loop_clients(int accept_fd, uid_t bus_uid) {
_cleanup_(shared_policy_freep) SharedPolicy *sp = NULL;
pthread_attr_t attr;
int r;
r = pthread_attr_init(&attr);
if (r < 0) {
- r = log_error_errno(errno, "Cannot initialize pthread attributes: %m");
- goto exit;
+ return log_error_errno(errno, "Cannot initialize pthread attributes: %m");
}
r = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (r < 0) {
r = log_error_errno(errno, "Cannot mark pthread attributes as detached: %m");
- goto exit_attr;
+ goto finish;
}
r = shared_policy_new(&sp);
if (r < 0)
- goto exit_attr;
+ goto finish;
for (;;) {
ClientContext *c;
continue;
r = log_error_errno(errno, "accept4() failed: %m");
- break;
+ goto finish;
}
r = client_context_new(&c);
c->fd = fd;
c->policy = sp;
+ c->bus_uid = bus_uid;
r = pthread_create(&tid, &attr, run_client, c);
if (r < 0) {
}
}
-exit_attr:
+finish:
pthread_attr_destroy(&attr);
-exit:
return r;
}
puts(SYSTEMD_FEATURES);
return 0;
- case ARG_ADDRESS: {
- char *a;
-
- a = strdup(optarg);
- if (!a)
+ case ARG_ADDRESS:
+ r = free_and_strdup(&arg_address, optarg);
+ if (r < 0)
return log_oom();
-
- free(arg_address);
- arg_address = a;
break;
- }
case ARG_CONFIGURATION:
r = strv_extend(&arg_configuration, optarg);
int main(int argc, char *argv[]) {
int r, accept_fd;
+ uid_t uid, bus_uid;
+ gid_t gid;
log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
log_parse_environment();
log_open();
+ bus_uid = getuid();
+
+ if (geteuid() == 0) {
+ const char *user = "systemd-bus-proxy";
+
+ r = get_user_creds(&user, &uid, &gid, NULL, NULL);
+ if (r < 0) {
+ log_error_errno(r, "Cannot resolve user name %s: %m", user);
+ goto finish;
+ }
+
+ r = drop_privileges(uid, gid, 1ULL << CAP_IPC_OWNER);
+ if (r < 0) {
+ log_error_errno(r, "Cannot drop privileges: %m");
+ goto finish;
+ }
+ }
+
r = parse_argv(argc, argv);
if (r <= 0)
goto finish;
}
accept_fd = SD_LISTEN_FDS_START;
+
r = fd_nonblock(accept_fd, false);
if (r < 0) {
log_error_errno(r, "Cannot mark accept-fd non-blocking: %m");
goto finish;
}
- r = loop_clients(accept_fd);
+ r = loop_clients(accept_fd, bus_uid);
finish:
sd_notify(false,