diff --git a/ChangeLog b/ChangeLog
index b3bca4819125859a71102af699299309abcee987..0dbd2356dd161fa1f57a1779a3d85332cf9dc072 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,8 @@ General
 	- Change open call flags, basically copy joe's way of doing it so
 	  a more recent version will actually be included in (un)stable.
 	- Remove useless fstat call.
+  open_file()
+	- Added check for S_ISBLK and S_ISCHR, don't open device files!
 - nano.c:
   renumber()
 	- Dont stupidly assign the value of prev->lineno if prev == NULL!
diff --git a/files.c b/files.c
index fedba8816d242b3e421b24e928a4a4e2bcfefce6..aa797e1467b634204f65cb973eb659727258ab59 100644
--- a/files.c
+++ b/files.c
@@ -229,8 +229,14 @@ int open_file(char *filename, int insert, int quiet)
 	    statusbar("%s: %s", strerror(errno), filename);
 	return -1;
     } else {			/* File is A-OK */
-	if (S_ISDIR(fileinfo.st_mode)) {
-	    statusbar(_("File \"%s\" is a directory"), filename);
+	if (S_ISDIR(fileinfo.st_mode) || S_ISCHR(fileinfo.st_mode) || 
+		S_ISBLK(fileinfo.st_mode)) {
+	    if (S_ISDIR(fileinfo.st_mode))
+		statusbar(_("File \"%s\" is a directory"), filename);
+	    else
+		/* Don't open character or block files.  Sorry, /dev/sndstat! */
+		statusbar(_("File \"%s\" is a device file"), filename);
+
 	    if (!insert)
 		new_file();
 	    return -1;
@@ -303,7 +309,7 @@ int write_file(char *name, int tmp)
     char buf[PATH_MAX + 1];
     filestruct *fileptr;
     int fd, mask = 0, realexists, anyexists;
-    struct stat st, lst, st2;
+    struct stat st, lst;
     static char *realname = NULL;
 
     if (!strcmp(name, "")) {