summaryrefslogtreecommitdiffstats
path: root/lib/libedit/key.c
diff options
context:
space:
mode:
authorstefanf <stefanf@FreeBSD.org>2007-03-11 18:30:22 +0000
committerstefanf <stefanf@FreeBSD.org>2007-03-11 18:30:22 +0000
commit11fa4c47513c298a58113f8fd2a473ec7f643254 (patch)
tree509b6d0c810b13835386c30b69cd13d7ebcd95d7 /lib/libedit/key.c
parent8355c667d5270a72a500fdd281ef01faca0fa571 (diff)
downloadFreeBSD-src-11fa4c47513c298a58113f8fd2a473ec7f643254.zip
FreeBSD-src-11fa4c47513c298a58113f8fd2a473ec7f643254.tar.gz
Merge the following changes from NetBSD:
chared.h 1.17, common.c 1.19, emacs.c 1.21, key.c 1.18, key.h 1.9, map.c 1.23, term.c 1.42, term.h 1.17, vi.c 1.25: # Print the actual eofc, instead of ^D\b\b. # Change internal character decoding to prevent buffer oveflows. key.c 1.19, key.h 1.10: # move declaration to header file. term.c 1.43: # Coverity CID 806: Prevent NULL deref term.c 1.44: # Coverity CID 1668: Plug memory leak. term.c 1.45: # Fix compilation. MFC after: 3 weeks
Diffstat (limited to 'lib/libedit/key.c')
-rw-r--r--lib/libedit/key.c125
1 files changed, 70 insertions, 55 deletions
diff --git a/lib/libedit/key.c b/lib/libedit/key.c
index 16bfde69..0b9d05d 100644
--- a/lib/libedit/key.c
+++ b/lib/libedit/key.c
@@ -29,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $NetBSD: key.c,v 1.17 2005/08/08 14:05:37 christos Exp $
+ * $NetBSD: key.c,v 1.19 2006/03/23 20:22:51 christos Exp $
*/
#if !defined(lint) && !defined(SCCSID)
@@ -88,7 +88,6 @@ private int node__delete(EditLine *, key_node_t **, const char *);
private int node_lookup(EditLine *, const char *, key_node_t *,
int);
private int node_enum(EditLine *, key_node_t *, int);
-private int key__decode_char(char *, int, int);
#define KEY_BUFSIZ EL_BUFSIZ
@@ -494,7 +493,7 @@ node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt)
/* If match put this char into el->el_key.buf. Recurse */
if (ptr->ch == *str) {
/* match found */
- ncnt = key__decode_char(el->el_key.buf, cnt,
+ ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
(unsigned char) ptr->ch);
if (ptr->next != NULL)
/* not yet at leaf */
@@ -548,7 +547,8 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt)
return (-1);
}
/* put this char at end of str */
- ncnt = key__decode_char(el->el_key.buf, cnt, (unsigned char) ptr->ch);
+ ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
+ (unsigned char)ptr->ch);
if (ptr->next == NULL) {
/* print this key and function */
el->el_key.buf[ncnt + 1] = '"';
@@ -579,9 +579,10 @@ key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
switch (ntype) {
case XK_STR:
case XK_EXE:
- (void) fprintf(el->el_outfile, fmt, key,
- key__decode_str(val->str, unparsbuf,
- ntype == XK_STR ? "\"\"" : "[]"));
+ (void) key__decode_str(val->str, unparsbuf,
+ sizeof(unparsbuf),
+ ntype == XK_STR ? "\"\"" : "[]");
+ (void) fprintf(el->el_outfile, fmt, key, unparsbuf);
break;
case XK_CMD:
for (fp = el->el_map.help; fp->name; fp++)
@@ -606,85 +607,99 @@ key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
}
+#define ADDC(c) \
+ if (b < eb) \
+ *b++ = c; \
+ else \
+ b++
/* key__decode_char():
* Put a printable form of char in buf.
*/
-private int
-key__decode_char(char *buf, int cnt, int ch)
+protected int
+key__decode_char(char *buf, int cnt, int off, int ch)
{
- ch = (unsigned char)ch;
+ char *sb = buf + off;
+ char *eb = buf + cnt;
+ char *b = sb;
+ ch = (unsigned char)ch;
if (ch == 0) {
- buf[cnt++] = '^';
- buf[cnt] = '@';
- return (cnt);
+ ADDC('^');
+ ADDC('@');
+ return b - sb;
}
if (iscntrl(ch)) {
- buf[cnt++] = '^';
- if (ch == 0177)
- buf[cnt] = '?';
+ ADDC('^');
+ if (ch == '\177')
+ ADDC('?');
else
- buf[cnt] = toascii(ch) | 0100;
+ ADDC(toascii(ch) | 0100);
} else if (ch == '^') {
- buf[cnt++] = '\\';
- buf[cnt] = '^';
+ ADDC('\\');
+ ADDC('^');
} else if (ch == '\\') {
- buf[cnt++] = '\\';
- buf[cnt] = '\\';
+ ADDC('\\');
+ ADDC('\\');
} else if (ch == ' ' || (isprint(ch) && !isspace(ch))) {
- buf[cnt] = ch;
+ ADDC(ch);
} else {
- buf[cnt++] = '\\';
- buf[cnt++] = (((unsigned int) ch >> 6) & 7) + '0';
- buf[cnt++] = (((unsigned int) ch >> 3) & 7) + '0';
- buf[cnt] = (ch & 7) + '0';
+ ADDC('\\');
+ ADDC((((unsigned int) ch >> 6) & 7) + '0');
+ ADDC((((unsigned int) ch >> 3) & 7) + '0');
+ ADDC((ch & 7) + '0');
}
- return (cnt);
+ return b - sb;
}
/* key__decode_str():
* Make a printable version of the ey
*/
-protected char *
-key__decode_str(const char *str, char *buf, const char *sep)
+protected int
+key__decode_str(const char *str, char *buf, int len, const char *sep)
{
- char *b;
+ char *b = buf, *eb = b + len;
const char *p;
b = buf;
- if (sep[0] != '\0')
- *b++ = sep[0];
- if (*str == 0) {
- *b++ = '^';
- *b++ = '@';
- if (sep[0] != '\0' && sep[1] != '\0')
- *b++ = sep[1];
- *b++ = 0;
- return (buf);
+ if (sep[0] != '\0') {
+ ADDC(sep[0]);
+ }
+ if (*str == '\0') {
+ ADDC('^');
+ ADDC('@');
+ if (sep[0] != '\0' && sep[1] != '\0') {
+ ADDC(sep[1]);
+ }
+ goto done;
}
for (p = str; *p != 0; p++) {
if (iscntrl((unsigned char) *p)) {
- *b++ = '^';
- if (*p == '\177')
- *b++ = '?';
- else
- *b++ = toascii(*p) | 0100;
+ ADDC('^');
+ if (*p == '\177') {
+ ADDC('?');
+ } else {
+ ADDC(toascii(*p) | 0100);
+ }
} else if (*p == '^' || *p == '\\') {
- *b++ = '\\';
- *b++ = *p;
+ ADDC('\\');
+ ADDC(*p);
} else if (*p == ' ' || (isprint((unsigned char) *p) &&
!isspace((unsigned char) *p))) {
- *b++ = *p;
+ ADDC(*p);
} else {
- *b++ = '\\';
- *b++ = (((unsigned int) *p >> 6) & 7) + '0';
- *b++ = (((unsigned int) *p >> 3) & 7) + '0';
- *b++ = (*p & 7) + '0';
+ ADDC('\\');
+ ADDC((((unsigned int) *p >> 6) & 7) + '0');
+ ADDC((((unsigned int) *p >> 3) & 7) + '0');
+ ADDC((*p & 7) + '0');
}
}
- if (sep[0] != '\0' && sep[1] != '\0')
- *b++ = sep[1];
- *b++ = 0;
- return (buf); /* should check for overflow */
+ if (sep[0] != '\0' && sep[1] != '\0') {
+ ADDC(sep[1]);
+ }
+done:
+ ADDC('\0');
+ if (b - buf >= len)
+ buf[len - 1] = '\0';
+ return b - buf;
}
OpenPOWER on IntegriCloud