To: vim-dev@vim.org Subject: Patch 7.0.130 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.0.130 (extra) Problem: Win32: Trying to edit or write devices may cause Vim to get stuck. Solution: Add the 'opendevice' option, default off. Disallow reading/writing from/to devices when it's off. Also detect more devices by the full name starting with "\\.\". Files: runtime/doc/options.txt, src/fileio.c, src/option.c, src/option.h, src/os_win32.c *** ../vim-7.0.129/runtime/doc/options.txt Sun May 7 17:07:10 2006 --- runtime/doc/options.txt Tue Oct 10 17:34:48 2006 *************** *** 4792,4801 **** completion with CTRL-X CTRL-O. |i_CTRL-X_CTRL-O| See |complete-functions| for an explanation of how the function is invoked and what it should return. ! This option is usually set by a filetype plugin. |:filetype-plugin-on| *'operatorfunc'* *'opfunc'* 'operatorfunc' 'opfunc' string (default: empty) global --- 4815,4836 ---- completion with CTRL-X CTRL-O. |i_CTRL-X_CTRL-O| See |complete-functions| for an explanation of how the function is invoked and what it should return. ! This option is usually set by a filetype plugin: |:filetype-plugin-on| + *'opendevice* *'odev* *'noopendevice* *'noodev* + 'opendevice' 'odev' boolean (default off) + global + {not in Vi} + {only for MS-DOS, MS-Windows and OS/2} + Enable reading and writing from devices. This may get Vim stuck on a + device that can be opened but doesn't actually do the I/O. Therefore + it is off by default. + Note that on MS-Windows editing "aux.h", "lpt1.txt" and the like also + result in editing a device. + + *'operatorfunc'* *'opfunc'* 'operatorfunc' 'opfunc' string (default: empty) global *** ../vim-7.0.129/src/fileio.c Thu Sep 14 11:07:08 2006 --- src/fileio.c Tue Oct 10 18:41:24 2006 *************** *** 419,424 **** --- 419,438 ---- } #endif + #if defined(MSDOS) || defined(MSWIN) || defined(OS2) + /* + * MS-Windows allows opening a device, but we will probably get stuck + * trying to read it. + */ + if (!p_odev && mch_nodetype(fname) == NODE_WRITABLE) + { + filemess(curbuf, fname, (char_u *)_("is a device (disabled with 'opendevice' option"), 0); + msg_end(); + msg_scroll = msg_save; + return FAIL; + } + #endif + /* set default 'fileformat' */ if (set_options) { *************** *** 3163,3168 **** --- 3177,3192 ---- } if (c == NODE_WRITABLE) { + # if defined(MSDOS) || defined(MSWIN) || defined(OS2) + /* MS-Windows allows opening a device, but we will probably get stuck + * trying to write to it. */ + if (!p_odev) + { + errnum = (char_u *)"E796: "; + errmsg = (char_u *)_("writing to device disabled with 'opendevice' option"); + goto fail; + } + # endif device = TRUE; newfile = TRUE; perm = -1; *** ../vim-7.0.129/src/option.c Tue Sep 5 16:29:38 2006 --- src/option.c Tue Oct 10 17:16:00 2006 *************** *** 1810,1815 **** --- 1810,1823 ---- {"open", NULL, P_BOOL|P_VI_DEF, (char_u *)NULL, PV_NONE, {(char_u *)FALSE, (char_u *)0L}}, + {"opendevice", "odev", P_BOOL|P_VI_DEF, + #if defined(MSDOS) || defined(MSWIN) || defined(OS2) + (char_u *)&p_odev, PV_NONE, + #else + (char_u *)NULL, PV_NONE, + #endif + {(char_u *)FALSE, (char_u *)FALSE} + }, {"operatorfunc", "opfunc", P_STRING|P_VI_DEF|P_SECURE, (char_u *)&p_opfunc, PV_NONE, {(char_u *)"", (char_u *)0L} }, *** ../vim-7.0.129/src/option.h Mon Apr 24 21:37:06 2006 --- src/option.h Tue Oct 10 17:17:09 2006 *************** *** 618,623 **** --- 618,626 ---- #ifdef FEAT_MZSCHEME EXTERN long p_mzq; /* 'mzquantum */ #endif + #if defined(MSDOS) || defined(MSWIN) || defined(OS2) + EXTERN int p_odev; /* 'opendevice' */ + #endif EXTERN char_u *p_opfunc; /* 'operatorfunc' */ EXTERN char_u *p_para; /* 'paragraphs' */ EXTERN int p_paste; /* 'paste' */ *** ../vim-7.0.129/src/os_win32.c Sun Apr 23 00:24:31 2006 --- src/os_win32.c Tue Oct 10 17:08:23 2006 *************** *** 2702,2707 **** --- 2702,2713 ---- HANDLE hFile; int type; + /* We can't open a file with a name "\\.\con" or "\\.\prn" and trying to + * read from it later will cause Vim to hang. Thus return NODE_WRITABLE + * here. */ + if (STRNCMP(name, "\\\\.\\", 4) == 0) + return NODE_WRITABLE; + hFile = CreateFile(name, /* file name */ GENERIC_WRITE, /* access mode */ 0, /* share mode */ *** ../vim-7.0.129/src/version.c Tue Oct 10 18:29:21 2006 --- src/version.c Tue Oct 10 18:37:12 2006 *************** *** 668,669 **** --- 668,671 ---- { /* Add new patch number below this line */ + /**/ + 130, /**/ -- "Space is big. Really big. You just won't believe how vastly hugely mind- bogglingly big it is. I mean, you may think it's a long way down the road to the chemist, but that's just peanuts to space." -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///