+static char *bt_secure_getenv(const char *name)
+{
+ if (is_setuid_setgid()) {
+ printf_err("Disregarding %s environment variable for setuid/setgid binary", name);
+ return NULL;
+ }
+ return getenv(name);
+}
+
+static const char *get_home_dir(void)
+{
+ char *val = NULL;
+ struct passwd *pwd;
+
+ val = bt_secure_getenv(HOME_ENV_VAR);
+ if (val) {
+ goto end;
+ }
+ /* Fallback on password file. */
+ pwd = getpwuid(getuid());
+ if (!pwd) {
+ goto end;
+ }
+ val = pwd->pw_dir;
+end:
+ return val;
+}
+
+static int add_internal_plugin_paths(struct bt_config *cfg)
+{
+ if (!omit_home_plugin_path) {
+ char path[PATH_MAX];
+ const char *home_dir;
+
+ if (is_setuid_setgid()) {
+ printf_debug("Skipping non-system plugin paths for setuid/setgid binary.");
+ } else {
+ home_dir = get_home_dir();
+ if (home_dir) {
+ if (strlen(home_dir) + strlen(HOME_SUBPATH) + 1
+ >= PATH_MAX) {
+ printf_err("Home directory path too long\n");
+ goto error;
+ }
+ strcpy(path, home_dir);
+ strcat(path, HOME_SUBPATH);
+ if (plugin_paths_from_arg(cfg->plugin_paths, path)) {
+ printf_err("Invalid home plugin path\n");
+ goto error;
+ }
+ }
+ }
+ }
+
+ if (!omit_system_plugin_path) {
+ if (plugin_paths_from_arg(cfg->plugin_paths,
+ SYSTEM_PLUGIN_PATH)) {
+ printf_err("Invalid system plugin path\n");
+ goto error;
+ }
+ }
+ return 0;
+error:
+ return -1;
+}
+