Module Name: src
Committed By: christos
Date: Mon Sep 10 20:53:18 UTC 2012
Modified Files:
src/lib/libedit: read.c
Log Message:
PR/46935: Steffen Nurpmeso: editline(3) (libedit): faulty errno handling,
faulty reuse of val in wrong context
To generate a diff of this commit:
cvs rdiff -u -r1.67 -r1.68 src/lib/libedit/read.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libedit/read.c
diff -u src/lib/libedit/read.c:1.67 src/lib/libedit/read.c:1.68
--- src/lib/libedit/read.c:1.67 Tue Aug 16 12:25:15 2011
+++ src/lib/libedit/read.c Mon Sep 10 16:53:18 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: read.c,v 1.67 2011/08/16 16:25:15 christos Exp $ */
+/* $NetBSD: read.c,v 1.68 2012/09/10 20:53:18 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: read.c,v 1.67 2011/08/16 16:25:15 christos Exp $");
+__RCSID("$NetBSD: read.c,v 1.68 2012/09/10 20:53:18 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -321,6 +321,7 @@ read_char(EditLine *el, Char *cp)
again:
el->el_signal->sig_no = 0;
while ((num_read = read(el->el_infd, cbuf + cbp, (size_t)1)) == -1) {
+ int e = errno;
switch (el->el_signal->sig_no) {
case SIGCONT:
FUN(el,set)(el, EL_REFRESH);
@@ -331,9 +332,10 @@ read_char(EditLine *el, Char *cp)
default:
break;
}
- if (!tried && read__fixio(el->el_infd, errno) == 0)
+ if (!tried && read__fixio(el->el_infd, e) == 0)
tried = 1;
else {
+ errno = e;
*cp = '\0';
return -1;
}
@@ -347,6 +349,7 @@ read_char(EditLine *el, Char *cp)
if ((bytes = ct_mbtowc(cp, cbuf, cbp)) == -1) {
ct_mbtowc_reset;
if (cbp >= MB_LEN_MAX) { /* "shouldn't happen" */
+ errno = EILSEQ;
*cp = '\0';
return -1;
}
@@ -427,6 +430,8 @@ FUN(el,getc)(EditLine *el, Char *cp)
(void) fprintf(el->el_errfile, "Reading a character\n");
#endif /* DEBUG_READ */
num_read = (*el->el_read.read_char)(el, cp);
+ if (num_read < 0)
+ el->el_errno = errno;
#ifdef WIDECHAR
if (el->el_flags & NARROW_READ)
*cp = *(char *)(void *)cp;
@@ -572,6 +577,7 @@ FUN(el,gets)(EditLine *el, int *nread)
#endif /* DEBUG_EDIT */
/* if EOF or error */
if ((num = read_getcmd(el, &cmdnum, &ch)) != OKCMD) {
+ num = -1;
#ifdef DEBUG_READ
(void) fprintf(el->el_errfile,
"Returning from el_gets %d\n", num);