aboutsummaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2024-10-31 06:01:39 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2024-11-07 05:15:23 +0000
commitc56df6ce71ae96f00b088790d3ad2e0ebebdd59a (patch)
tree87f92e4549afdd862d3e53b96c208ea1db7aa864 /libexec
parentd7214577ff00221ac84a85e61794a5e126b952dd (diff)
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/Symbol.map5
-rw-r--r--libexec/rtld-elf/rtld.c62
2 files changed, 59 insertions, 8 deletions
diff --git a/libexec/rtld-elf/Symbol.map b/libexec/rtld-elf/Symbol.map
index 0b7ad63f60a7..3cdbb30d04a0 100644
--- a/libexec/rtld-elf/Symbol.map
+++ b/libexec/rtld-elf/Symbol.map
@@ -21,6 +21,11 @@ FBSD_1.3 {
fdlopen;
};
+FBSD_1.8 {
+ rtld_get_var;
+ rtld_set_var;
+};
+
FBSDprivate_1.0 {
_rtld_thread_init;
_rtld_allocate_tls;
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 7c61fec44ef7..f1075bc75d5f 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -257,6 +257,8 @@ int _rtld_addr_phdr(const void *, struct dl_phdr_info *) __exported;
int _rtld_get_stack_prot(void) __exported;
int _rtld_is_dlopened(void *) __exported;
void _rtld_error(const char *, ...) __exported;
+const char *rtld_get_var(const char *name) __exported;
+int rtld_set_var(const char *name, const char *val) __exported;
/* Only here to fix -Wmissing-prototypes warnings */
int __getosreldate(void);
@@ -347,31 +349,35 @@ struct ld_env_var_desc {
const char * const n;
const char *val;
const bool unsecure:1;
+ const bool can_update:1;
+ const bool debug:1;
+ bool owned:1;
};
#define LD_ENV_DESC(var, unsec, ...) \
[LD_##var] = { \
.n = #var, \
.unsecure = unsec, \
__VA_ARGS__ \
+ }
static struct ld_env_var_desc ld_env_vars[] = {
LD_ENV_DESC(BIND_NOW, false),
LD_ENV_DESC(PRELOAD, true),
LD_ENV_DESC(LIBMAP, true),
- LD_ENV_DESC(LIBRARY_PATH, true),
- LD_ENV_DESC(LIBRARY_PATH_FDS, true),
+ LD_ENV_DESC(LIBRARY_PATH, true, .can_update = true),
+ LD_ENV_DESC(LIBRARY_PATH_FDS, true, .can_update = true),
LD_ENV_DESC(LIBMAP_DISABLE, true),
LD_ENV_DESC(BIND_NOT, true),
- LD_ENV_DESC(DEBUG, true),
+ LD_ENV_DESC(DEBUG, true, .can_update = true, .debug = true),
LD_ENV_DESC(ELF_HINTS_PATH, true),
LD_ENV_DESC(LOADFLTR, true),
- LD_ENV_DESC(LIBRARY_PATH_RPATH, true),
+ LD_ENV_DESC(LIBRARY_PATH_RPATH, true, .can_update = true),
LD_ENV_DESC(PRELOAD_FDS, true),
- LD_ENV_DESC(DYNAMIC_WEAK, true),
+ LD_ENV_DESC(DYNAMIC_WEAK, true, .can_update = true),
LD_ENV_DESC(TRACE_LOADED_OBJECTS, false),
- LD_ENV_DESC(UTRACE, false),
- LD_ENV_DESC(DUMP_REL_PRE, false),
- LD_ENV_DESC(DUMP_REL_POST, false),
+ LD_ENV_DESC(UTRACE, false, .can_update = true),
+ LD_ENV_DESC(DUMP_REL_PRE, false, .can_update = true),
+ LD_ENV_DESC(DUMP_REL_POST, false, .can_update = true),
LD_ENV_DESC(TRACE_LOADED_OBJECTS_PROGNAME, false),
LD_ENV_DESC(TRACE_LOADED_OBJECTS_FMT1, false),
LD_ENV_DESC(TRACE_LOADED_OBJECTS_FMT2, false),
@@ -6329,6 +6335,46 @@ dump_auxv(Elf_Auxinfo **aux_info)
}
}
+const char *
+rtld_get_var(const char *name)
+{
+ const struct ld_env_var_desc *lvd;
+ u_int i;
+
+ for (i = 0; i < nitems(ld_env_vars); i++) {
+ lvd = &ld_env_vars[i];
+ if (strcmp(lvd->n, name) == 0)
+ return (lvd->val);
+ }
+ return (NULL);
+}
+
+int
+rtld_set_var(const char *name, const char *val)
+{
+ struct ld_env_var_desc *lvd;
+ u_int i;
+
+ for (i = 0; i < nitems(ld_env_vars); i++) {
+ lvd = &ld_env_vars[i];
+ if (strcmp(lvd->n, name) != 0)
+ continue;
+ if (!lvd->can_update || (lvd->unsecure && !trust))
+ return (EPERM);
+ if (lvd->owned)
+ free(__DECONST(char *, lvd->val));
+ if (val != NULL)
+ lvd->val = xstrdup(val);
+ else
+ lvd->val = NULL;
+ lvd->owned = true;
+ if (lvd->debug)
+ debug = lvd->val != NULL && *lvd->val != '\0';
+ return (0);
+ }
+ return (ENOENT);
+}
+
/*
* Overrides for libc_pic-provided functions.
*/