diff -Naur a/toys/other/login.c b/toys/other/login.c
--- a/toys/other/login.c	2014-10-02 18:23:27.000000000 +0530
+++ b/toys/other/login.c	2014-10-06 17:12:36.228878766 +0530
@@ -30,10 +30,12 @@
   char *hostname;
 
   int login_timeout, login_fail_timeout;
+  struct termios oldtermio;
 )
 
 static void login_timeout_handler(int sig __attribute__((unused)))
 {
+  tcsetattr(0, TCSANOW, &TT.oldtermio);
   printf("\nLogin timed out after %d seconds.\n", TT.login_timeout);
   exit(0);
 }
@@ -77,6 +79,7 @@
 
   if (*buff != '\n') if(!fgets(&buff[1], HOSTNAME_SIZE-1, stdin)) _exit(1);
 
+  if (!strchr(buff, '\n')) error_exit("name too long");
   while(i<HOSTNAME_SIZE-1 && isgraph(buff[i])) i++;
   buff[i] = 0;
 }
@@ -89,7 +92,7 @@
   if (fd == -1) return;
 
   size = readall(fd, toybuf,sizeof(toybuf)-1);
-  toybuf[size] = 0;
+  if (size != -1) toybuf[size] = 0;
   if (!size) puts("System closed for routine maintenance\n");
   else puts(toybuf);
 
@@ -105,7 +108,7 @@
   if (fd == -1) return;
 
   size = readall(fd, toybuf,sizeof(toybuf)-1);
-  toybuf[size] = 0;
+  if (size != -1) toybuf[size] = 0;
   puts(toybuf);
 
   close(fd);
@@ -148,6 +151,8 @@
   struct spwd * spwd = NULL;
   int auth_fail_cnt = 0;
 
+  tcgetattr(0, &TT.oldtermio);
+
   if (f_flag && toys.optc != 1) error_exit("-f requires username");
 
   if (geteuid()) error_exit("not root");
@@ -191,7 +196,7 @@
 
     f_flag = 0;
     syslog(LOG_WARNING, "invalid password for '%s' on %s %s %s", username,
-      ttyname(0), h_flag?"from":"", h_flag?TT.hostname:"");
+        ttyname(0), h_flag?"from":"", h_flag?TT.hostname:"");
 
     sleep(3);
     puts("Login incorrect");
@@ -199,9 +204,7 @@
     if (++auth_fail_cnt == 3)
       error_exit("Maximum number of tries exceeded (3)\n");
 
-    *username = 0;
-    pwd = 0;
-    spwd = 0;
+    *username = 0, pass = 0, pwd = 0, spwd = 0;
   }
 
   alarm(0);
@@ -215,7 +218,7 @@
   handle_motd();
 
   syslog(LOG_INFO, "%s logged in on %s %s %s", pwd->pw_name,
-    ttyname(0), h_flag?"from":"", h_flag?TT.hostname:"");
+      ttyname(0), h_flag?"from":"", h_flag?TT.hostname:"");
 
   spawn_shell(pwd->pw_shell);
 }
