Update vis(3) the latest from NetBSD.

This adds VIS_DQ for compatiblity with OpenBSD.

Correct by an off-by-one error and a read buffer overflow detected using
asan.

MFC after:	1 day
This commit is contained in:
Brooks Davis 2017-11-28 01:35:28 +00:00
commit ff88ef4183
4 changed files with 39 additions and 21 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: unvis.3,v 1.27 2012/12/15 07:34:36 wiz Exp $ .\" $NetBSD: unvis.3,v 1.29 2017/10/24 19:14:55 abhinav Exp $
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.\" Copyright (c) 1989, 1991, 1993 .\" Copyright (c) 1989, 1991, 1993
@ -35,7 +35,10 @@
.Os .Os
.Sh NAME .Sh NAME
.Nm unvis , .Nm unvis ,
.Nm strunvis .Nm strunvis ,
.Nm strnunvis ,
.Nm strunvisx ,
.Nm strnunvisx
.Nd decode a visual representation of characters .Nd decode a visual representation of characters
.Sh LIBRARY .Sh LIBRARY
.Lb libc .Lb libc
@ -184,7 +187,7 @@ char out;
while ((ch = getchar()) != EOF) { while ((ch = getchar()) != EOF) {
again: again:
switch(unvis(\*[Am]out, ch, \*[Am]state, 0)) { switch(unvis(&out, ch, &state, 0)) {
case 0: case 0:
case UNVIS_NOCHAR: case UNVIS_NOCHAR:
break; break;
@ -198,7 +201,7 @@ again:
errx(EXIT_FAILURE, "Bad character sequence!"); errx(EXIT_FAILURE, "Bad character sequence!");
} }
} }
if (unvis(\*[Am]out, '\e0', \*[Am]state, UNVIS_END) == UNVIS_VALID) if (unvis(&out, '\e0', &state, UNVIS_END) == UNVIS_VALID)
(void)putchar(out); (void)putchar(out);
.Ed .Ed
.Sh ERRORS .Sh ERRORS

View File

@ -1,4 +1,4 @@
.\" $NetBSD: vis.3,v 1.45 2016/06/08 15:00:04 wiz Exp $ .\" $NetBSD: vis.3,v 1.49 2017/08/05 20:22:29 wiz Exp $
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.\" Copyright (c) 1989, 1991, 1993 .\" Copyright (c) 1989, 1991, 1993
@ -30,7 +30,7 @@
.\" .\"
.\" @(#)vis.3 8.1 (Berkeley) 6/9/93 .\" @(#)vis.3 8.1 (Berkeley) 6/9/93
.\" .\"
.Dd January 14, 2015 .Dd April 22, 2017
.Dt VIS 3 .Dt VIS 3
.Os .Os
.Sh NAME .Sh NAME
@ -243,6 +243,8 @@ except space, tab, and newline are encoded (see
The following flags The following flags
alter this: alter this:
.Bl -tag -width VIS_WHITEX .Bl -tag -width VIS_WHITEX
.It Dv VIS_DQ
Also encode double quotes
.It Dv VIS_GLOB .It Dv VIS_GLOB
Also encode the magic characters Also encode the magic characters
.Ql ( * , .Ql ( * ,
@ -310,7 +312,7 @@ warning on the use of the
.Dv VIS_NOSLASH .Dv VIS_NOSLASH
flag below). flag below).
.Pp .Pp
There are four forms of encoding. There are six forms of encoding.
All forms use the backslash character All forms use the backslash character
.Ql \e .Ql \e
to introduce a special to introduce a special
@ -401,6 +403,9 @@ If
.Fa nextc .Fa nextc
is an octal digit, the latter representation is used to is an octal digit, the latter representation is used to
avoid ambiguity. avoid ambiguity.
.Pp
Non-printable characters without C-style
backslash sequences use the default representation.
.It Dv VIS_OCTAL .It Dv VIS_OCTAL
Use a three digit octal sequence. Use a three digit octal sequence.
The form is The form is
@ -408,6 +413,11 @@ The form is
where where
.Em d .Em d
represents an octal digit. represents an octal digit.
.It Dv VIS_CSTYLE \&| Dv VIS_OCTAL
Same as
.Dv VIS_CSTYLE
except that non-printable characters without C-style
backslash sequences use a three digit octal sequence.
.It Dv VIS_HTTPSTYLE .It Dv VIS_HTTPSTYLE
Use URI encoding as described in RFC 1738. Use URI encoding as described in RFC 1738.
The form is The form is

View File

@ -1,4 +1,4 @@
/* $NetBSD: vis.c,v 1.71 2016/01/14 20:41:23 christos Exp $ */ /* $NetBSD: vis.c,v 1.74 2017/11/27 16:37:21 christos Exp $ */
/*- /*-
* Copyright (c) 1989, 1993 * Copyright (c) 1989, 1993
@ -57,7 +57,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: vis.c,v 1.71 2016/01/14 20:41:23 christos Exp $"); __RCSID("$NetBSD: vis.c,v 1.74 2017/11/27 16:37:21 christos Exp $");
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#ifdef __FBSDID #ifdef __FBSDID
__FBSDID("$FreeBSD$"); __FBSDID("$FreeBSD$");
@ -379,6 +379,7 @@ makeextralist(int flags, const char *src)
if (flags & VIS_SP) *d++ = L' '; if (flags & VIS_SP) *d++ = L' ';
if (flags & VIS_TAB) *d++ = L'\t'; if (flags & VIS_TAB) *d++ = L'\t';
if (flags & VIS_NL) *d++ = L'\n'; if (flags & VIS_NL) *d++ = L'\n';
if (flags & VIS_DQ) *d++ = L'"';
if ((flags & VIS_NOSLASH) == 0) *d++ = L'\\'; if ((flags & VIS_NOSLASH) == 0) *d++ = L'\\';
*d = L'\0'; *d = L'\0';
@ -408,6 +409,14 @@ istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength,
_DIAGASSERT(mbsrc != NULL || mblength == 0); _DIAGASSERT(mbsrc != NULL || mblength == 0);
_DIAGASSERT(mbextra != NULL); _DIAGASSERT(mbextra != NULL);
mbslength = (ssize_t)mblength;
/*
* When inputing a single character, must also read in the
* next character for nextc, the look-ahead character.
*/
if (mbslength == 1)
mbslength++;
/* /*
* Input (mbsrc) is a char string considered to be multibyte * Input (mbsrc) is a char string considered to be multibyte
* characters. The input loop will read this string pulling * characters. The input loop will read this string pulling
@ -424,12 +433,12 @@ istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength,
/* Allocate space for the wide char strings */ /* Allocate space for the wide char strings */
psrc = pdst = extra = NULL; psrc = pdst = extra = NULL;
mdst = NULL; mdst = NULL;
if ((psrc = calloc(mblength + 1, sizeof(*psrc))) == NULL) if ((psrc = calloc(mbslength + 1, sizeof(*psrc))) == NULL)
return -1; return -1;
if ((pdst = calloc((4 * mblength) + 1, sizeof(*pdst))) == NULL) if ((pdst = calloc((16 * mbslength) + 1, sizeof(*pdst))) == NULL)
goto out; goto out;
if (*mbdstp == NULL) { if (*mbdstp == NULL) {
if ((mdst = calloc((4 * mblength) + 1, sizeof(*mdst))) == NULL) if ((mdst = calloc((16 * mbslength) + 1, sizeof(*mdst))) == NULL)
goto out; goto out;
*mbdstp = mdst; *mbdstp = mdst;
} }
@ -452,13 +461,6 @@ istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength,
* stop at NULs because we may be processing a block of data * stop at NULs because we may be processing a block of data
* that includes NULs. * that includes NULs.
*/ */
mbslength = (ssize_t)mblength;
/*
* When inputing a single character, must also read in the
* next character for nextc, the look-ahead character.
*/
if (mbslength == 1)
mbslength++;
bzero(&mbstate, sizeof(mbstate)); bzero(&mbstate, sizeof(mbstate));
while (mbslength > 0) { while (mbslength > 0) {
/* Convert one multibyte character to wchar_t. */ /* Convert one multibyte character to wchar_t. */
@ -470,12 +472,13 @@ istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength,
clen = 1; clen = 1;
cerr = 1; cerr = 1;
} }
if (clen == 0) if (clen == 0) {
/* /*
* NUL in input gives 0 return value. process * NUL in input gives 0 return value. process
* as single NUL byte and keep going. * as single NUL byte and keep going.
*/ */
clen = 1; clen = 1;
}
/* Advance buffer character pointer. */ /* Advance buffer character pointer. */
src++; src++;
/* Advance input pointer by number of bytes read. */ /* Advance input pointer by number of bytes read. */
@ -485,6 +488,7 @@ istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength,
} }
len = src - psrc; len = src - psrc;
src = psrc; src = psrc;
/* /*
* In the single character input case, we will have actually * In the single character input case, we will have actually
* processed two characters, c and nextc. Reset len back to * processed two characters, c and nextc. Reset len back to

View File

@ -1,4 +1,4 @@
/* $NetBSD: vis.h,v 1.24 2016/01/14 20:42:14 christos Exp $ */ /* $NetBSD: vis.h,v 1.25 2017/04/23 01:57:36 christos Exp $ */
/* $FreeBSD$ */ /* $FreeBSD$ */
/*- /*-
@ -52,6 +52,7 @@
#define VIS_NL 0x0010 /* also encode newline */ #define VIS_NL 0x0010 /* also encode newline */
#define VIS_WHITE (VIS_SP | VIS_TAB | VIS_NL) #define VIS_WHITE (VIS_SP | VIS_TAB | VIS_NL)
#define VIS_SAFE 0x0020 /* only encode "unsafe" characters */ #define VIS_SAFE 0x0020 /* only encode "unsafe" characters */
#define VIS_DQ 0x8000 /* also encode double quotes */
/* /*
* other * other