lineedit: plug memory leak

This commit is contained in:
Denis Vlasenko 2007-09-27 10:17:16 +00:00
parent 33b900f984
commit 86b29ea9e8

View File

@ -81,8 +81,9 @@ static int num_ok_lines = 1;
#endif #endif
#if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR #if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR
static char *user_buf = (char*)""; static const char null_str[] = "";
static char *home_pwd_buf = (char*)""; static char *user_buf;
static char *home_pwd_buf = (char*)null_str;
#endif #endif
/* Put 'command_ps[cursor]', cursor++. /* 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/..." */ if (with_shash_flg) { /* "~/..." or "~user/..." */
char *sav_ud = ud - 1; char *sav_ud = ud - 1;
char *home = 0; char *home = NULL;
char *temp; char *temp;
if (*ud == '/') { /* "~/..." */ if (*ud == '/') { /* "~/..." */
@ -1119,7 +1120,7 @@ static void parse_prompt(const char *prmt_ptr)
switch (c) { switch (c) {
#if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR #if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR
case 'u': case 'u':
pbuf = user_buf; pbuf = user_buf ? user_buf : (char*)"";
break; break;
#endif #endif
case 'h': case 'h':
@ -1143,7 +1144,7 @@ static void parse_prompt(const char *prmt_ptr)
case 'w': case 'w':
pbuf = pwd_buf; pbuf = pwd_buf;
l = strlen(home_pwd_buf); l = strlen(home_pwd_buf);
if (home_pwd_buf[0] != 0 if (l != 0
&& strncmp(home_pwd_buf, pbuf, l) == 0 && strncmp(home_pwd_buf, pbuf, l) == 0
&& (pbuf[l]=='/' || pbuf[l]=='\0') && (pbuf[l]=='/' || pbuf[l]=='\0')
&& strlen(pwd_buf+l)<PATH_MAX && 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()); entry = getpwuid(geteuid());
if (entry) { 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); user_buf = xstrdup(entry->pw_name);
home_pwd_buf = xstrdup(entry->pw_dir); home_pwd_buf = xstrdup(entry->pw_dir);
/* They are not freed on exit (too small to bother) */
} }
} }
#endif #endif