diff options
author | Denis Vlasenko | 2007-09-27 10:17:16 +0000 |
---|---|---|
committer | Denis Vlasenko | 2007-09-27 10:17:16 +0000 |
commit | 86b29ea9e8d14436fde48fedf2896ae679201266 (patch) | |
tree | 985b0acfb1736428b9f444570eddfdbe143ac180 /libbb | |
parent | 33b900f984e7397c4143c580eef9c8930677a9e2 (diff) | |
download | busybox-86b29ea9e8d14436fde48fedf2896ae679201266.zip busybox-86b29ea9e8d14436fde48fedf2896ae679201266.tar.gz |
lineedit: plug memory leak
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/lineedit.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index a018a53..a66398a 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -81,8 +81,9 @@ static int num_ok_lines = 1; #endif #if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR -static char *user_buf = (char*)""; -static char *home_pwd_buf = (char*)""; +static const char null_str[] = ""; +static char *user_buf; +static char *home_pwd_buf = (char*)null_str; #endif /* Put 'command_ps[cursor]', cursor++. @@ -311,7 +312,7 @@ static void username_tab_completion(char *ud, char *with_shash_flg) if (with_shash_flg) { /* "~/..." or "~user/..." */ char *sav_ud = ud - 1; - char *home = 0; + char *home = NULL; char *temp; if (*ud == '/') { /* "~/..." */ @@ -1119,7 +1120,7 @@ static void parse_prompt(const char *prmt_ptr) switch (c) { #if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR case 'u': - pbuf = user_buf; + pbuf = user_buf ? user_buf : (char*)""; break; #endif case 'h': @@ -1143,7 +1144,7 @@ static void parse_prompt(const char *prmt_ptr) case 'w': pbuf = pwd_buf; l = strlen(home_pwd_buf); - if (home_pwd_buf[0] != 0 + if (l != 0 && strncmp(home_pwd_buf, pbuf, l) == 0 && (pbuf[l]=='/' || pbuf[l]=='\0') && strlen(pwd_buf+l)<PATH_MAX @@ -1310,8 +1311,14 @@ int read_line_input(const char* prompt, char* command, int maxsize, line_input_t entry = getpwuid(geteuid()); if (entry) { + /* If we enter read_line_input for the Nth time, + * they may be already allocated! Need to free. */ + free(user_buf); + if (home_pwd_buf != null_str); + free(home_pwd_buf); user_buf = xstrdup(entry->pw_name); home_pwd_buf = xstrdup(entry->pw_dir); + /* They are not freed on exit (too small to bother) */ } } #endif |