diff --git a/ChangeLog b/ChangeLog
index 2fbeeac9ef87ee4d3ef2a38164401af17694323c..b0fdf24baf577244492e153d2a57dc45dc0692c9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -325,6 +325,13 @@ CVS code -
 	  the number of lines and characters in the file or selection,
 	  as wc does. (DLR)
 - winio.c:
+  get_key_buffer()
+	- Only save all open buffers and hang up when a blocking
+	  wgetch() returns ERR and errno is set to EIO (input/output
+	  error).  If errno is set to something else, recover properly.
+	  This fixes problems with nano's erroneously hanging up while
+	  e.g. resizing or unsuspending in a chroot. (DLR, found by Mike
+	  Frysinger)
   get_escape_seq_kbinput()
 	- Fix typo preventing the VT100/VT220/VT320/xterm/rxvt escape
 	  sequence for ',' on the numeric keypad with NumLock off from
diff --git a/src/winio.c b/src/winio.c
index e2487bf18a92dc7c61b77bc0799c66832f8e654b..be0b832ad09456862d0b868f46981dbfc7c6104d 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -27,6 +27,7 @@
 #include <stdarg.h>
 #include <string.h>
 #include <unistd.h>
+#include <errno.h>
 #include <ctype.h>
 #include "proto.h"
 
@@ -142,12 +143,13 @@ void get_key_buffer(WINDOW *win)
      * screen updates. */
     doupdate();
 
-    input = wgetch(win);
+    while ((input = wgetch(win)) == ERR) {
+	/* If errno is EIO, it means that the input source that we were
+	 * using is gone, so die gracefully. */
+	if (errno == EIO)
+	    handle_hupterm(0);
+    }
 
-    /* If we get ERR when using blocking input, it means that the input
-     * source that we were using is gone, so die gracefully. */
-    if (input == ERR)
-	handle_hupterm(0);
 
 #ifndef NANO_SMALL
     allow_pending_sigwinch(FALSE);