mirror of
https://github.com/AuxXxilium/eudev.git
synced 2024-12-24 02:20:45 +07:00
unit-printf: before resolving exec context specifiers check whether the object actually has an exec context
This commit is contained in:
parent
41f9172f42
commit
3ef63c3174
@ -1797,6 +1797,8 @@ DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
|
||||
|
||||
const UnitVTable mount_vtable = {
|
||||
.object_size = sizeof(Mount),
|
||||
.exec_context_offset = offsetof(Mount, exec_context),
|
||||
|
||||
.sections =
|
||||
"Unit\0"
|
||||
"Mount\0"
|
||||
|
@ -3837,6 +3837,8 @@ DEFINE_STRING_TABLE_LOOKUP(start_limit_action, StartLimitAction);
|
||||
|
||||
const UnitVTable service_vtable = {
|
||||
.object_size = sizeof(Service),
|
||||
.exec_context_offset = offsetof(Service, exec_context),
|
||||
|
||||
.sections =
|
||||
"Unit\0"
|
||||
"Service\0"
|
||||
|
@ -2196,6 +2196,8 @@ DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
|
||||
|
||||
const UnitVTable socket_vtable = {
|
||||
.object_size = sizeof(Socket),
|
||||
.exec_context_offset = offsetof(Socket, exec_context),
|
||||
|
||||
.sections =
|
||||
"Unit\0"
|
||||
"Socket\0"
|
||||
|
@ -1355,6 +1355,8 @@ DEFINE_STRING_TABLE_LOOKUP(swap_result, SwapResult);
|
||||
|
||||
const UnitVTable swap_vtable = {
|
||||
.object_size = sizeof(Swap),
|
||||
.exec_context_offset = offsetof(Swap, exec_context),
|
||||
|
||||
.sections =
|
||||
"Unit\0"
|
||||
"Swap\0"
|
||||
|
@ -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) {
|
||||
Service *s = userdata;
|
||||
Unit *u = userdata;
|
||||
ExecContext *c;
|
||||
int r;
|
||||
const char *username;
|
||||
|
||||
c = unit_get_exec_context(u);
|
||||
if (!c)
|
||||
return NULL;
|
||||
|
||||
/* get USER env from our own env if set */
|
||||
if (!s->exec_context.user)
|
||||
if (!c->user)
|
||||
return getusername_malloc();
|
||||
|
||||
/* fish username from passwd */
|
||||
username = s->exec_context.user;
|
||||
username = c->user;
|
||||
r = get_user_creds(&username, NULL, NULL, NULL, NULL);
|
||||
if (r < 0)
|
||||
return NULL;
|
||||
@ -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) {
|
||||
Service *s = userdata;
|
||||
Unit *u = userdata;
|
||||
ExecContext *c;
|
||||
int r;
|
||||
const char *username, *home;
|
||||
|
||||
c = unit_get_exec_context(u);
|
||||
if (!c)
|
||||
return NULL;
|
||||
|
||||
/* return HOME if set, otherwise from passwd */
|
||||
if (!s->exec_context.user) {
|
||||
if (!c->user) {
|
||||
char *h;
|
||||
|
||||
r = get_home_dir(&h);
|
||||
@ -152,7 +162,7 @@ static char *specifier_user_home(char specifier, void *data, void *userdata) {
|
||||
return h;
|
||||
}
|
||||
|
||||
username = s->exec_context.user;
|
||||
username = c->user;
|
||||
r = get_user_creds(&username, NULL, NULL, &home, NULL);
|
||||
if (r < 0)
|
||||
return NULL;
|
||||
@ -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) {
|
||||
Service *s = userdata;
|
||||
Unit *u = userdata;
|
||||
ExecContext *c;
|
||||
int r;
|
||||
const char *username, *shell;
|
||||
|
||||
c = unit_get_exec_context(u);
|
||||
if (!c)
|
||||
return NULL;
|
||||
|
||||
/* return HOME if set, otherwise from passwd */
|
||||
if (!s->exec_context.user) {
|
||||
if (!c->user) {
|
||||
char *sh;
|
||||
|
||||
r = get_shell(&sh);
|
||||
@ -176,7 +191,7 @@ static char *specifier_user_shell(char specifier, void *data, void *userdata) {
|
||||
return sh;
|
||||
}
|
||||
|
||||
username = s->exec_context.user;
|
||||
username = c->user;
|
||||
r = get_user_creds(&username, NULL, NULL, NULL, &shell);
|
||||
if (r < 0)
|
||||
return strdup("/bin/sh");
|
||||
|
@ -2684,6 +2684,17 @@ int unit_exec_context_defaults(Unit *u, ExecContext *c) {
|
||||
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] = {
|
||||
[UNIT_ACTIVE] = "active",
|
||||
[UNIT_RELOADING] = "reloading",
|
||||
|
@ -266,6 +266,10 @@ struct UnitVTable {
|
||||
/* How much memory does an object of this unit type need */
|
||||
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
|
||||
* by NUL chars */
|
||||
const char *sections;
|
||||
@ -538,6 +542,8 @@ int unit_add_mount_links(Unit *u);
|
||||
|
||||
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);
|
||||
UnitActiveState unit_active_state_from_string(const char *s);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user