Commit 3ef63c31 authored by Lennart Poettering's avatar Lennart Poettering
Browse files

unit-printf: before resolving exec context specifiers check whether the object...

unit-printf: before resolving exec context specifiers check whether the object actually has an exec context
parent 41f9172f
...@@ -1797,6 +1797,8 @@ DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult); ...@@ -1797,6 +1797,8 @@ DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
const UnitVTable mount_vtable = { const UnitVTable mount_vtable = {
.object_size = sizeof(Mount), .object_size = sizeof(Mount),
.exec_context_offset = offsetof(Mount, exec_context),
.sections = .sections =
"Unit\0" "Unit\0"
"Mount\0" "Mount\0"
......
...@@ -3837,6 +3837,8 @@ DEFINE_STRING_TABLE_LOOKUP(start_limit_action, StartLimitAction); ...@@ -3837,6 +3837,8 @@ DEFINE_STRING_TABLE_LOOKUP(start_limit_action, StartLimitAction);
const UnitVTable service_vtable = { const UnitVTable service_vtable = {
.object_size = sizeof(Service), .object_size = sizeof(Service),
.exec_context_offset = offsetof(Service, exec_context),
.sections = .sections =
"Unit\0" "Unit\0"
"Service\0" "Service\0"
......
...@@ -2196,6 +2196,8 @@ DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult); ...@@ -2196,6 +2196,8 @@ DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
const UnitVTable socket_vtable = { const UnitVTable socket_vtable = {
.object_size = sizeof(Socket), .object_size = sizeof(Socket),
.exec_context_offset = offsetof(Socket, exec_context),
.sections = .sections =
"Unit\0" "Unit\0"
"Socket\0" "Socket\0"
......
...@@ -1355,6 +1355,8 @@ DEFINE_STRING_TABLE_LOOKUP(swap_result, SwapResult); ...@@ -1355,6 +1355,8 @@ DEFINE_STRING_TABLE_LOOKUP(swap_result, SwapResult);
const UnitVTable swap_vtable = { const UnitVTable swap_vtable = {
.object_size = sizeof(Swap), .object_size = sizeof(Swap),
.exec_context_offset = offsetof(Swap, exec_context),
.sections = .sections =
"Unit\0" "Unit\0"
"Swap\0" "Swap\0"
......
...@@ -119,16 +119,21 @@ static char *specifier_runtime(char specifier, void *data, void *userdata) { ...@@ -119,16 +119,21 @@ static char *specifier_runtime(char specifier, void *data, void *userdata) {
} }
static char *specifier_user_name(char specifier, void *data, void *userdata) { static char *specifier_user_name(char specifier, void *data, void *userdata) {
Service *s = userdata; Unit *u = userdata;
ExecContext *c;
int r; int r;
const char *username; const char *username;
c = unit_get_exec_context(u);
if (!c)
return NULL;
/* get USER env from our own env if set */ /* get USER env from our own env if set */
if (!s->exec_context.user) if (!c->user)
return getusername_malloc(); return getusername_malloc();
/* fish username from passwd */ /* fish username from passwd */
username = s->exec_context.user; username = c->user;
r = get_user_creds(&username, NULL, NULL, NULL, NULL); r = get_user_creds(&username, NULL, NULL, NULL, NULL);
if (r < 0) if (r < 0)
return NULL; return NULL;
...@@ -137,12 +142,17 @@ static char *specifier_user_name(char specifier, void *data, void *userdata) { ...@@ -137,12 +142,17 @@ static char *specifier_user_name(char specifier, void *data, void *userdata) {
} }
static char *specifier_user_home(char specifier, void *data, void *userdata) { static char *specifier_user_home(char specifier, void *data, void *userdata) {
Service *s = userdata; Unit *u = userdata;
ExecContext *c;
int r; int r;
const char *username, *home; const char *username, *home;
c = unit_get_exec_context(u);
if (!c)
return NULL;
/* return HOME if set, otherwise from passwd */ /* return HOME if set, otherwise from passwd */
if (!s->exec_context.user) { if (!c->user) {
char *h; char *h;
r = get_home_dir(&h); r = get_home_dir(&h);
...@@ -152,7 +162,7 @@ static char *specifier_user_home(char specifier, void *data, void *userdata) { ...@@ -152,7 +162,7 @@ static char *specifier_user_home(char specifier, void *data, void *userdata) {
return h; return h;
} }
username = s->exec_context.user; username = c->user;
r = get_user_creds(&username, NULL, NULL, &home, NULL); r = get_user_creds(&username, NULL, NULL, &home, NULL);
if (r < 0) if (r < 0)
return NULL; return NULL;
...@@ -161,12 +171,17 @@ static char *specifier_user_home(char specifier, void *data, void *userdata) { ...@@ -161,12 +171,17 @@ static char *specifier_user_home(char specifier, void *data, void *userdata) {
} }
static char *specifier_user_shell(char specifier, void *data, void *userdata) { static char *specifier_user_shell(char specifier, void *data, void *userdata) {
Service *s = userdata; Unit *u = userdata;
ExecContext *c;
int r; int r;
const char *username, *shell; const char *username, *shell;
c = unit_get_exec_context(u);
if (!c)
return NULL;
/* return HOME if set, otherwise from passwd */ /* return HOME if set, otherwise from passwd */
if (!s->exec_context.user) { if (!c->user) {
char *sh; char *sh;
r = get_shell(&sh); r = get_shell(&sh);
...@@ -176,7 +191,7 @@ static char *specifier_user_shell(char specifier, void *data, void *userdata) { ...@@ -176,7 +191,7 @@ static char *specifier_user_shell(char specifier, void *data, void *userdata) {
return sh; return sh;
} }
username = s->exec_context.user; username = c->user;
r = get_user_creds(&username, NULL, NULL, NULL, &shell); r = get_user_creds(&username, NULL, NULL, NULL, &shell);
if (r < 0) if (r < 0)
return strdup("/bin/sh"); return strdup("/bin/sh");
......
...@@ -2684,6 +2684,17 @@ int unit_exec_context_defaults(Unit *u, ExecContext *c) { ...@@ -2684,6 +2684,17 @@ int unit_exec_context_defaults(Unit *u, ExecContext *c) {
return 0; return 0;
} }
ExecContext *unit_get_exec_context(Unit *u) {
size_t offset;
assert(u);
offset = UNIT_VTABLE(u)->exec_context_offset;
if (offset <= 0)
return NULL;
return (ExecContext*) ((uint8_t*) u + offset);
}
static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = { static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
[UNIT_ACTIVE] = "active", [UNIT_ACTIVE] = "active",
[UNIT_RELOADING] = "reloading", [UNIT_RELOADING] = "reloading",
......
...@@ -266,6 +266,10 @@ struct UnitVTable { ...@@ -266,6 +266,10 @@ struct UnitVTable {
/* How much memory does an object of this unit type need */ /* How much memory does an object of this unit type need */
size_t object_size; size_t object_size;
/* If greater than 0, the offset into the object where
* ExecContext is found, if the unit type has that */
size_t exec_context_offset;
/* Config file sections this unit type understands, separated /* Config file sections this unit type understands, separated
* by NUL chars */ * by NUL chars */
const char *sections; const char *sections;
...@@ -538,6 +542,8 @@ int unit_add_mount_links(Unit *u); ...@@ -538,6 +542,8 @@ int unit_add_mount_links(Unit *u);
int unit_exec_context_defaults(Unit *u, ExecContext *c); int unit_exec_context_defaults(Unit *u, ExecContext *c);
ExecContext *unit_get_exec_context(Unit *u);
const char *unit_active_state_to_string(UnitActiveState i); const char *unit_active_state_to_string(UnitActiveState i);
UnitActiveState unit_active_state_from_string(const char *s); UnitActiveState unit_active_state_from_string(const char *s);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment