Fix flockfile(3) and friends for stdin/stdout/stderr too.

stdin/stdout/stderr are special; their mutexes are initialized by
__sinit. There's no unit test for this, because __sinit has already
been called by the time the first unit test runs, but you could
reproduce this failure with a trivial main() that calls flockfile
or ftrylockfile on one of the standard streams before otherwise
using stdio.

Bug: 18208568

(cherry picked from commit c48c3e4bb3d1665f3e9fa2785daafa72dfe59399)

Change-Id: Ia0c43ed4ac69daea8152aee9516415a6e3f8a042
This commit is contained in:
Elliott Hughes 2014-11-19 15:16:51 -08:00
parent 047d943ee9
commit 432f645887
5 changed files with 32 additions and 0 deletions

View File

@ -36,12 +36,20 @@
// struct __sfileext (see fileext.h).
void flockfile(FILE* fp) {
if (!__sdidinit) {
__sinit();
}
if (fp != NULL) {
pthread_mutex_lock(&_FLOCK(fp));
}
}
int ftrylockfile(FILE* fp) {
if (!__sdidinit) {
__sinit();
}
// The specification for ftrylockfile() says it returns 0 on success,
// or non-zero on error. So return an errno code directly on error.
if (fp == NULL) {
@ -52,6 +60,10 @@ int ftrylockfile(FILE* fp) {
}
void funlockfile(FILE* fp) {
if (!__sdidinit) {
__sinit();
}
if (fp != NULL) {
pthread_mutex_unlock(&_FLOCK(fp));
}

View File

@ -34,6 +34,8 @@
#include <pthread.h>
__BEGIN_DECLS
/*
* file extension
*/
@ -63,4 +65,6 @@ do { \
_FILEEXT_INIT(f); \
} while (0)
__END_DECLS
#endif /* _FILEEXT_H_ */

View File

@ -32,6 +32,10 @@
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__BEGIN_DECLS
/*
* The first few FILEs are statically allocated; others are dynamically
* allocated and linked in via this glue structure.
@ -44,3 +48,5 @@ struct glue {
/* This was referenced by a couple of different pieces of middleware and the Crystax NDK. */
__LIBC64_HIDDEN__ extern struct glue __sglue;
__END_DECLS

View File

@ -41,6 +41,8 @@
#include "wcio.h"
#include "fileext.h"
__BEGIN_DECLS
/*
* Android <= KitKat had getc/putc macros in <stdio.h> that referred
* to __srget/__swbuf, so those symbols need to be public for LP32
@ -137,3 +139,5 @@ extern int __sfvwrite(FILE *, struct __suio *);
wint_t __fputwc_unlock(wchar_t wc, FILE *fp);
#pragma GCC visibility pop
__END_DECLS

View File

@ -32,6 +32,10 @@
#ifndef _WCIO_H_
#define _WCIO_H_
#include <sys/cdefs.h>
__BEGIN_DECLS
/* minimal requirement of SUSv2 */
#define WCIO_UNGETWC_BUFSIZE 1
@ -78,4 +82,6 @@ do {\
#define WCIO_INIT(fp) \
memset(&(_EXT(fp)->_wcio), 0, sizeof(struct wchar_io_data))
__END_DECLS
#endif /*_WCIO_H_*/