1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-29 16:44:03 +00:00

Don't check for __SERR which may stick from one of any previous stdio

functions.
__SERR is for user and the rest of stdio code do not check it
for error sensing internally, only set it.
In vf(w)printf.c here it is more easy to save __SERR, clear and restore it.
This commit is contained in:
Andrey A. Chernov 2016-08-25 17:13:04 +00:00
parent 8905590ba9
commit 1bf6c5f18b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=304810
3 changed files with 14 additions and 2 deletions

View File

@ -125,7 +125,7 @@ getdelim(char ** __restrict linep, size_t * __restrict linecapp, int delim,
if (fp->_r <= 0 && __srefill(fp)) {
/* If fp is at EOF already, we just need space for the NUL. */
if (__sferror(fp) || expandtofit(linep, 1, linecapp))
if (!__sfeof(fp) || expandtofit(linep, 1, linecapp))
goto error;
FUNLOCKFILE(fp);
(*linep)[0] = '\0';
@ -137,7 +137,7 @@ getdelim(char ** __restrict linep, size_t * __restrict linecapp, int delim,
if (sappend(linep, &linelen, linecapp, fp->_p, fp->_r))
goto error;
if (__srefill(fp)) {
if (__sferror(fp))
if (!__sfeof(fp))
goto error;
goto done; /* hit EOF */
}

View File

@ -364,6 +364,7 @@ __vfprintf(FILE *fp, locale_t locale, const char *fmt0, va_list ap)
int nextarg; /* 1-based argument index */
va_list orgap; /* original argument pointer */
char *convbuf; /* wide to multibyte conversion result */
int savserr;
static const char xdigs_lower[16] = "0123456789abcdef";
static const char xdigs_upper[16] = "0123456789ABCDEF";
@ -460,6 +461,9 @@ __vfprintf(FILE *fp, locale_t locale, const char *fmt0, va_list ap)
return (EOF);
}
savserr = fp->_flags & __SERR;
fp->_flags &= ~__SERR;
convbuf = NULL;
fmt = (char *)fmt0;
argtable = NULL;
@ -1031,6 +1035,8 @@ number: if ((dprec = prec) >= 0)
free(convbuf);
if (__sferror(fp))
ret = EOF;
else
fp->_flags |= savserr;
if ((argtable != NULL) && (argtable != statargtable))
free (argtable);
return (ret);

View File

@ -444,6 +444,7 @@ __vfwprintf(FILE *fp, locale_t locale, const wchar_t *fmt0, va_list ap)
int nextarg; /* 1-based argument index */
va_list orgap; /* original argument pointer */
wchar_t *convbuf; /* multibyte to wide conversion result */
int savserr;
static const char xdigs_lower[16] = "0123456789abcdef";
static const char xdigs_upper[16] = "0123456789ABCDEF";
@ -536,6 +537,9 @@ __vfwprintf(FILE *fp, locale_t locale, const wchar_t *fmt0, va_list ap)
return (EOF);
}
savserr = fp->_flags & __SERR;
fp->_flags &= ~__SERR;
convbuf = NULL;
fmt = (wchar_t *)fmt0;
argtable = NULL;
@ -1096,6 +1100,8 @@ number: if ((dprec = prec) >= 0)
free(convbuf);
if (__sferror(fp))
ret = EOF;
else
fp->_flags |= savserr;
if ((argtable != NULL) && (argtable != statargtable))
free (argtable);
return (ret);