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);

Reply via email to