Date: Tue, 31 Dec 1996 18:10:02 -0500 From: gbuchanan@sympatico.ca To: FreeBSD-gnats-submit@freebsd.org Subject: bin/2339: ex/vi/nex/nvi incorrect handling of -- arg Message-ID: <199612312310.SAA01006@localhost> Resent-Message-ID: <199612312320.PAA29694@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 2339
>Category: bin
>Synopsis: ex/vi/nex/nvi incorrect handling of -- arg
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Dec 31 15:20:02 PST 1996
>Last-Modified:
>Originator: Gardner Buchanan
>Organization:
>Release: FreeBSD 2.1-STABLE i386
>Environment:
Seen in 2.1-RELEASE, 2.1.6-RELEASE
>Description:
nvi and friends do something weird when asked to edit a
file whose name begins with a plus (+). This is as a
result of some broken code which nominally handles
compatibility with the original vi's handling of +options.
>How-To-Repeat:
Do this:
vi -- +x
You will be editing a file called "-cx". Certainly not
what you would expect.
Doing:
vi +x
Does something unexpected too, but in the spirit of
getopt(3), the -- should protect me from that, and it
doesn't.
>Fix:
Apply this patch to /usr/src/usr.bin/vi/common/main.c
------------------------------------------------------------------------
*** main.c.old Tue Dec 31 17:50:52 1996
--- main.c Tue Dec 31 17:58:49 1996
***************
*** 677,687 ****
* Translate old style arguments into something getopt will like.
* Make sure it's not text space memory, because ex changes the
* strings.
* Change "+" into "-c$".
* Change "+<anything else>" into "-c<anything else>".
* Change "-" into "-s"
*/
! while (*++argv)
if (argv[0][0] == '+') {
if (argv[0][1] == '\0') {
MALLOC_NOMSG(NULL, argv[0], char *, 4);
--- 677,693 ----
* Translate old style arguments into something getopt will like.
* Make sure it's not text space memory, because ex changes the
* strings.
+ * Leave anything after "--" alone. (Like getopt(3))
* Change "+" into "-c$".
* Change "+<anything else>" into "-c<anything else>".
* Change "-" into "-s"
*/
! while (*++argv) {
! if (argv[0][0] == '-' &&
! argv[0][1] == '-' &&
! argv[0][2] == '\0')
! break;
!
if (argv[0][0] == '+') {
if (argv[0][1] == '\0') {
MALLOC_NOMSG(NULL, argv[0], char *, 4);
***************
*** 704,709 ****
--- 710,716 ----
err(1, NULL);
(void)strcpy(argv[0], "-s");
}
+ }
}
static void
------------------------------------------------------------------------
Have fun.
============================================
Gardner Buchanan <gbuchanan@sympatico.ca>
Ottawa, ON
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199612312310.SAA01006>
