From: George Joseph Date: Fri, 15 Sep 2023 17:19:18 +0000 (-0600) Subject: asterisk.c: Use the euid's home directory to read/write cli history X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fc516f5781bbf14ba3c4d3f27d614d6ca564a6cd;p=thirdparty%2Fasterisk.git asterisk.c: Use the euid's home directory to read/write cli history The CLI .asterisk_history file is read from/written to the directory specified by the HOME environment variable. If the root user starts asterisk with the -U/-G options, or with runuser/rungroup set in asterisk.conf, the asterisk process is started as root but then it calls setuid/setgid to set the new user/group. This does NOT reset the HOME environment variable to the new user's home directory though so it's still left as "/root". In this case, the new user will almost certainly NOT have access to read from or write to the history file. * Added function process_histfile() which calls getpwuid(geteuid()) and uses pw->dir as the home directory instead of the HOME environment variable. * ast_el_read_default_histfile() and ast_el_write_default_histfile() have been modified to use the new process_histfile() function. Resolves: #337 --- diff --git a/main/asterisk.c b/main/asterisk.c index 51dfa9cc23..650591d6ff 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -3173,26 +3173,41 @@ static int ast_el_read_history(const char *filename) return history(el_hist, &ev, H_LOAD, filename); } -static void ast_el_read_default_histfile(void) +static void process_histfile(int (*readwrite)(const char *filename)) { - char histfile[80] = ""; - const char *home = getenv("HOME"); + struct passwd *pw = getpwuid(geteuid()); + int ret = 0; + char *name = NULL; - if (!ast_strlen_zero(home)) { - snprintf(histfile, sizeof(histfile), "%s/.asterisk_history", home); - ast_el_read_history(histfile); + if (!pw || ast_strlen_zero(pw->pw_dir)) { + ast_log(LOG_ERROR, "Unable to determine home directory. History read/write disabled.\n"); + return; } + + ret = ast_asprintf(&name, "%s/.asterisk_history", pw->pw_dir); + if (ret <= 0) { + ast_log(LOG_ERROR, "Unable to create history file name. History read/write disabled.\n"); + return; + } + + ret = readwrite(name); + if (ret < 0) { + ast_log(LOG_ERROR, "Unable to read or write history file '%s'\n", name); + } + + ast_free(name); + + return; } -static void ast_el_write_default_histfile(void) +static void ast_el_read_default_histfile(void) { - char histfile[80] = ""; - const char *home = getenv("HOME"); + process_histfile(ast_el_read_history); +} - if (!ast_strlen_zero(home)) { - snprintf(histfile, sizeof(histfile), "%s/.asterisk_history", home); - ast_el_write_history(histfile); - } +static void ast_el_write_default_histfile(void) +{ + process_histfile(ast_el_write_history); } static void ast_remotecontrol(char *data)