diff --git a/ChangeLog b/ChangeLog
index 092f9e564b2cdeb88266158bec5b61eb60a717a8..56ac3f2945e9d076860125ce407d405745763599 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
 2007-04-18  David Lawrence Ramsey  <pooka109@gmail.com>
 
+	* files.c (real_dir_from_tilde): Simplify.
 	* winio.c (parse_kbinput): Interpret Cancel and Shift-Cancel.
 	* winio.c (get_escape_seq_kbinput): Add missing comments.
 
diff --git a/src/files.c b/src/files.c
index d4c5995e4707a8760f0cfea09a4bde03975044b5..68a1288e08c17d5b5053bdfe901c9e07b5345653 100644
--- a/src/files.c
+++ b/src/files.c
@@ -1973,13 +1973,13 @@ void do_writeout_void(void)
  * convert ~user/ and ~/ notation. */
 char *real_dir_from_tilde(const char *buf)
 {
-    char *dirtmp = NULL;
+    char *retval;
 
     assert(buf != NULL);
 
     if (buf[0] == '~') {
 	size_t i;
-	const char *tilde_dir = NULL;
+	char *tilde_dir;
 
 	/* Figure out how much of the str we need to compare. */
 	for (i = 1; buf[i] != '/' && buf[i] != '\0'; i++)
@@ -1988,32 +1988,30 @@ char *real_dir_from_tilde(const char *buf)
 	/* Get the home directory. */
 	if (i == 1) {
 	    get_homedir();
-	    tilde_dir = homedir;
+	    tilde_dir = mallocstrcpy(NULL, homedir);
 	} else {
 	    const struct passwd *userdata;
 
+	    tilde_dir = mallocstrncpy(NULL, buf, i + 1);
+	    tilde_dir[i] = '\0';
+
 	    do {
 		userdata = getpwent();
 	    } while (userdata != NULL &&
-		(strncmp(userdata->pw_name, buf + 1, i - 1) != 0 ||
-		strlen(userdata->pw_name) != strnlen(buf + 1, i - 1)));
+		strcmp(userdata->pw_name, tilde_dir + 1) != 0);
 	    endpwent();
 	    if (userdata != NULL)
-		tilde_dir = userdata->pw_dir;
+		tilde_dir = mallocstrcpy(tilde_dir, userdata->pw_dir);
 	}
 
-	if (tilde_dir != NULL) {
-	    dirtmp = charalloc(strlen(tilde_dir) + strlen(buf + i) + 1);
-	    sprintf(dirtmp, "%s%s", tilde_dir, buf + i);
-	}
-    }
+	retval = charalloc(strlen(tilde_dir) + strlen(buf + i) + 1);
+	sprintf(retval, "%s%s", tilde_dir, buf + i);
 
-    /* Set a default value for dirtmp, in case the user's home directory
-     * isn't found. */
-    if (dirtmp == NULL)
-	dirtmp = mallocstrcpy(NULL, buf);
+	free(tilde_dir);
+    } else
+	retval = mallocstrcpy(NULL, buf);
 
-    return dirtmp;
+    return retval;
 }
 
 #if !defined(DISABLE_TABCOMP) || !defined(DISABLE_BROWSER)