- Use an initializer macro to initialize fields in 'fake' FILE objects used
by *sprintf(), etc. - Explicitly initialize _fl_mutex to PTHREAD_MUTEX_INITIALIZER for all FILE objects. This is currently a nop on FreeBSD, but is import for other platforms (or in the future) where PTHREAD_MUTEX_INITIALIZER is not simply zero. PR: threads/141198 Reported by: Jeremy Huddleston @ Apple MFC after: 2 weeks
This commit is contained in:
parent
03101f1cf6
commit
2684d78c89
@ -61,6 +61,7 @@ int __sdidinit;
|
|||||||
._read = __sread, \
|
._read = __sread, \
|
||||||
._seek = __sseek, \
|
._seek = __sseek, \
|
||||||
._write = __swrite, \
|
._write = __swrite, \
|
||||||
|
._fl_mutex = PTHREAD_MUTEX_INITIALIZER, \
|
||||||
}
|
}
|
||||||
/* the usual - (stdin + stdout + stderr) */
|
/* the usual - (stdin + stdout + stderr) */
|
||||||
static FILE usual[FOPEN_MAX - 3];
|
static FILE usual[FOPEN_MAX - 3];
|
||||||
@ -96,7 +97,7 @@ moreglue(n)
|
|||||||
int n;
|
int n;
|
||||||
{
|
{
|
||||||
struct glue *g;
|
struct glue *g;
|
||||||
static FILE empty;
|
static FILE empty = { ._fl_mutex = PTHREAD_MUTEX_INITIALIZER };
|
||||||
FILE *p;
|
FILE *p;
|
||||||
|
|
||||||
g = (struct glue *)malloc(sizeof(*g) + ALIGNBYTES + n * sizeof(FILE));
|
g = (struct glue *)malloc(sizeof(*g) + ALIGNBYTES + n * sizeof(FILE));
|
||||||
@ -154,7 +155,7 @@ found:
|
|||||||
fp->_ub._size = 0;
|
fp->_ub._size = 0;
|
||||||
fp->_lb._base = NULL; /* no line buffer */
|
fp->_lb._base = NULL; /* no line buffer */
|
||||||
fp->_lb._size = 0;
|
fp->_lb._size = 0;
|
||||||
/* fp->_lock = NULL; */ /* once set always set (reused) */
|
/* fp->_fl_mutex = NULL; */ /* once set always set (reused) */
|
||||||
fp->_orientation = 0;
|
fp->_orientation = 0;
|
||||||
memset(&fp->_mbstate, 0, sizeof(mbstate_t));
|
memset(&fp->_mbstate, 0, sizeof(mbstate_t));
|
||||||
return (fp);
|
return (fp);
|
||||||
|
@ -109,6 +109,14 @@ extern int __sdidinit;
|
|||||||
(fp)->_lb._base = NULL; \
|
(fp)->_lb._base = NULL; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure initializations for 'fake' FILE objects.
|
||||||
|
*/
|
||||||
|
#define FAKE_FILE { \
|
||||||
|
._file = -1, \
|
||||||
|
._fl_mutex = PTHREAD_MUTEX_INITIALIZER, \
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the orientation for a stream. If o > 0, the stream has wide-
|
* Set the orientation for a stream. If o > 0, the stream has wide-
|
||||||
* orientation. If o < 0, the stream has byte-orientation.
|
* orientation. If o < 0, the stream has byte-orientation.
|
||||||
|
@ -48,7 +48,7 @@ snprintf(char * __restrict str, size_t n, char const * __restrict fmt, ...)
|
|||||||
size_t on;
|
size_t on;
|
||||||
int ret;
|
int ret;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
FILE f;
|
FILE f = FAKE_FILE;
|
||||||
|
|
||||||
on = n;
|
on = n;
|
||||||
if (n != 0)
|
if (n != 0)
|
||||||
@ -56,12 +56,9 @@ snprintf(char * __restrict str, size_t n, char const * __restrict fmt, ...)
|
|||||||
if (n > INT_MAX)
|
if (n > INT_MAX)
|
||||||
n = INT_MAX;
|
n = INT_MAX;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
f._file = -1;
|
|
||||||
f._flags = __SWR | __SSTR;
|
f._flags = __SWR | __SSTR;
|
||||||
f._bf._base = f._p = (unsigned char *)str;
|
f._bf._base = f._p = (unsigned char *)str;
|
||||||
f._bf._size = f._w = n;
|
f._bf._size = f._w = n;
|
||||||
f._orientation = 0;
|
|
||||||
memset(&f._mbstate, 0, sizeof(mbstate_t));
|
|
||||||
ret = __vfprintf(&f, fmt, ap);
|
ret = __vfprintf(&f, fmt, ap);
|
||||||
if (on > 0)
|
if (on > 0)
|
||||||
*f._p = '\0';
|
*f._p = '\0';
|
||||||
|
@ -42,9 +42,8 @@ vasprintf(str, fmt, ap)
|
|||||||
__va_list ap;
|
__va_list ap;
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
FILE f;
|
FILE f = FAKE_FILE;
|
||||||
|
|
||||||
f._file = -1;
|
|
||||||
f._flags = __SWR | __SSTR | __SALC;
|
f._flags = __SWR | __SSTR | __SALC;
|
||||||
f._bf._base = f._p = (unsigned char *)malloc(128);
|
f._bf._base = f._p = (unsigned char *)malloc(128);
|
||||||
if (f._bf._base == NULL) {
|
if (f._bf._base == NULL) {
|
||||||
@ -53,8 +52,6 @@ vasprintf(str, fmt, ap)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
f._bf._size = f._w = 127; /* Leave room for the NUL */
|
f._bf._size = f._w = 127; /* Leave room for the NUL */
|
||||||
f._orientation = 0;
|
|
||||||
memset(&f._mbstate, 0, sizeof(mbstate_t));
|
|
||||||
ret = __vfprintf(&f, fmt, ap);
|
ret = __vfprintf(&f, fmt, ap);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
free(f._bf._base);
|
free(f._bf._base);
|
||||||
|
@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
int
|
int
|
||||||
vdprintf(int fd, const char * __restrict fmt, va_list ap)
|
vdprintf(int fd, const char * __restrict fmt, va_list ap)
|
||||||
{
|
{
|
||||||
FILE f;
|
FILE f = FAKE_FILE;
|
||||||
unsigned char buf[BUFSIZ];
|
unsigned char buf[BUFSIZ];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -56,8 +56,6 @@ vdprintf(int fd, const char * __restrict fmt, va_list ap)
|
|||||||
f._write = __swrite;
|
f._write = __swrite;
|
||||||
f._bf._base = buf;
|
f._bf._base = buf;
|
||||||
f._bf._size = sizeof(buf);
|
f._bf._size = sizeof(buf);
|
||||||
f._orientation = 0;
|
|
||||||
bzero(&f._mbstate, sizeof(f._mbstate));
|
|
||||||
|
|
||||||
if ((ret = __vfprintf(&f, fmt, ap)) < 0)
|
if ((ret = __vfprintf(&f, fmt, ap)) < 0)
|
||||||
return (ret);
|
return (ret);
|
||||||
|
@ -169,7 +169,7 @@ static int
|
|||||||
__sbprintf(FILE *fp, const char *fmt, va_list ap)
|
__sbprintf(FILE *fp, const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
FILE fake;
|
FILE fake = FAKE_FILE;
|
||||||
unsigned char buf[BUFSIZ];
|
unsigned char buf[BUFSIZ];
|
||||||
|
|
||||||
/* XXX This is probably not needed. */
|
/* XXX This is probably not needed. */
|
||||||
|
@ -47,7 +47,7 @@ vsnprintf(char * __restrict str, size_t n, const char * __restrict fmt,
|
|||||||
size_t on;
|
size_t on;
|
||||||
int ret;
|
int ret;
|
||||||
char dummy[2];
|
char dummy[2];
|
||||||
FILE f;
|
FILE f = FAKE_FILE;
|
||||||
|
|
||||||
on = n;
|
on = n;
|
||||||
if (n != 0)
|
if (n != 0)
|
||||||
@ -61,12 +61,9 @@ vsnprintf(char * __restrict str, size_t n, const char * __restrict fmt,
|
|||||||
str = dummy;
|
str = dummy;
|
||||||
n = 1;
|
n = 1;
|
||||||
}
|
}
|
||||||
f._file = -1;
|
|
||||||
f._flags = __SWR | __SSTR;
|
f._flags = __SWR | __SSTR;
|
||||||
f._bf._base = f._p = (unsigned char *)str;
|
f._bf._base = f._p = (unsigned char *)str;
|
||||||
f._bf._size = f._w = n;
|
f._bf._size = f._w = n;
|
||||||
f._orientation = 0;
|
|
||||||
memset(&f._mbstate, 0, sizeof(mbstate_t));
|
|
||||||
ret = __vfprintf(&f, fmt, ap);
|
ret = __vfprintf(&f, fmt, ap);
|
||||||
if (on > 0)
|
if (on > 0)
|
||||||
*f._p = '\0';
|
*f._p = '\0';
|
||||||
|
@ -44,14 +44,11 @@ int
|
|||||||
vsprintf(char * __restrict str, const char * __restrict fmt, __va_list ap)
|
vsprintf(char * __restrict str, const char * __restrict fmt, __va_list ap)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
FILE f;
|
FILE f = FAKE_FILE;
|
||||||
|
|
||||||
f._file = -1;
|
|
||||||
f._flags = __SWR | __SSTR;
|
f._flags = __SWR | __SSTR;
|
||||||
f._bf._base = f._p = (unsigned char *)str;
|
f._bf._base = f._p = (unsigned char *)str;
|
||||||
f._bf._size = f._w = INT_MAX;
|
f._bf._size = f._w = INT_MAX;
|
||||||
f._orientation = 0;
|
|
||||||
memset(&f._mbstate, 0, sizeof(mbstate_t));
|
|
||||||
ret = __vfprintf(&f, fmt, ap);
|
ret = __vfprintf(&f, fmt, ap);
|
||||||
*f._p = 0;
|
*f._p = 0;
|
||||||
return (ret);
|
return (ret);
|
||||||
|
@ -55,16 +55,11 @@ int
|
|||||||
vsscanf(const char * __restrict str, const char * __restrict fmt,
|
vsscanf(const char * __restrict str, const char * __restrict fmt,
|
||||||
__va_list ap)
|
__va_list ap)
|
||||||
{
|
{
|
||||||
FILE f;
|
FILE f = FAKE_FILE;
|
||||||
|
|
||||||
f._file = -1;
|
|
||||||
f._flags = __SRD;
|
f._flags = __SRD;
|
||||||
f._bf._base = f._p = (unsigned char *)str;
|
f._bf._base = f._p = (unsigned char *)str;
|
||||||
f._bf._size = f._r = strlen(str);
|
f._bf._size = f._r = strlen(str);
|
||||||
f._read = eofread;
|
f._read = eofread;
|
||||||
f._ub._base = NULL;
|
|
||||||
f._lb._base = NULL;
|
|
||||||
f._orientation = 0;
|
|
||||||
memset(&f._mbstate, 0, sizeof(mbstate_t));
|
|
||||||
return (__svfscanf(&f, fmt, ap));
|
return (__svfscanf(&f, fmt, ap));
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt,
|
|||||||
{
|
{
|
||||||
static const mbstate_t initial;
|
static const mbstate_t initial;
|
||||||
mbstate_t mbs;
|
mbstate_t mbs;
|
||||||
FILE f;
|
FILE f = FAKE_FILE;
|
||||||
char *mbp;
|
char *mbp;
|
||||||
int ret, sverrno;
|
int ret, sverrno;
|
||||||
size_t nwc;
|
size_t nwc;
|
||||||
@ -55,7 +55,6 @@ vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt,
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
f._file = -1;
|
|
||||||
f._flags = __SWR | __SSTR | __SALC;
|
f._flags = __SWR | __SSTR | __SALC;
|
||||||
f._bf._base = f._p = (unsigned char *)malloc(128);
|
f._bf._base = f._p = (unsigned char *)malloc(128);
|
||||||
if (f._bf._base == NULL) {
|
if (f._bf._base == NULL) {
|
||||||
@ -63,8 +62,6 @@ vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt,
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
f._bf._size = f._w = 127; /* Leave room for the NUL */
|
f._bf._size = f._w = 127; /* Leave room for the NUL */
|
||||||
f._orientation = 0;
|
|
||||||
memset(&f._mbstate, 0, sizeof(mbstate_t));
|
|
||||||
ret = __vfwprintf(&f, fmt, ap);
|
ret = __vfwprintf(&f, fmt, ap);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
sverrno = errno;
|
sverrno = errno;
|
||||||
|
@ -62,7 +62,7 @@ vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt,
|
|||||||
{
|
{
|
||||||
static const mbstate_t initial;
|
static const mbstate_t initial;
|
||||||
mbstate_t mbs;
|
mbstate_t mbs;
|
||||||
FILE f;
|
FILE f = FAKE_FILE;
|
||||||
char *mbstr;
|
char *mbstr;
|
||||||
size_t mlen;
|
size_t mlen;
|
||||||
int r;
|
int r;
|
||||||
@ -80,15 +80,10 @@ vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt,
|
|||||||
free(mbstr);
|
free(mbstr);
|
||||||
return (EOF);
|
return (EOF);
|
||||||
}
|
}
|
||||||
f._file = -1;
|
|
||||||
f._flags = __SRD;
|
f._flags = __SRD;
|
||||||
f._bf._base = f._p = (unsigned char *)mbstr;
|
f._bf._base = f._p = (unsigned char *)mbstr;
|
||||||
f._bf._size = f._r = mlen;
|
f._bf._size = f._r = mlen;
|
||||||
f._read = eofread;
|
f._read = eofread;
|
||||||
f._ub._base = NULL;
|
|
||||||
f._lb._base = NULL;
|
|
||||||
f._orientation = 0;
|
|
||||||
memset(&f._mbstate, 0, sizeof(mbstate_t));
|
|
||||||
r = __vfwscanf(&f, fmt, ap);
|
r = __vfwscanf(&f, fmt, ap);
|
||||||
free(mbstr);
|
free(mbstr);
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include "un-namespace.h"
|
#include "un-namespace.h"
|
||||||
|
|
||||||
|
#include "local.h"
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
#include "fvwrite.h"
|
#include "fvwrite.h"
|
||||||
|
|
||||||
@ -575,7 +576,7 @@ static int
|
|||||||
__v3printf(FILE *fp, const char *fmt, int pct, va_list ap)
|
__v3printf(FILE *fp, const char *fmt, int pct, va_list ap)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
FILE fake;
|
FILE fake = FAKE_FILE;
|
||||||
unsigned char buf[BUFSIZ];
|
unsigned char buf[BUFSIZ];
|
||||||
|
|
||||||
/* copy the important variables */
|
/* copy the important variables */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user