lineedit: plug memory leak
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 27 Sep 2007 10:17:16 +0000 (10:17 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 27 Sep 2007 10:17:16 +0000 (10:17 -0000)
libbb/lineedit.c

index a018a53ff533246564e48efe47efed4f0d723f68..a66398a95a29a90c28896066fcf22c0daa467cd7 100644 (file)
@@ -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