Change _stdio_handles_locking into _caller_handles_locking.
It is reported by tsan that funlockfile() can unlock an unlocked mutex. It happens when printf() is called before fopen() or other stdio stuff. As FLOCKFILE(fp) is called before __sinit(), _stdio_handles_locking is false, and _FLOCK(fp) will not be locked. But then cantwrite(fp) in __vfprintf() calls__sinit(), which makes _stdio_handles_locking become true, and FUNLOCKFILE(fp) unlocks _FLOCK(fp). Change _stdio_handles_locking into _caller_handles_locking, so __sinit() won't change its value. Add test due to my previous fault. Bug: 25392375 Change-Id: I483e3c3cdb28da65e62f1fd9615bf58c5403b4dd
This commit is contained in:
@@ -30,12 +30,8 @@
|
||||
#include <unwind.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <regex>
|
||||
#include <vector>
|
||||
|
||||
#include <base/file.h>
|
||||
#include <base/stringprintf.h>
|
||||
|
||||
#include "private/bionic_macros.h"
|
||||
#include "private/ScopeGuard.h"
|
||||
#include "BionicDeathTest.h"
|
||||
@@ -43,8 +39,6 @@
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
extern "C" pid_t gettid();
|
||||
|
||||
TEST(pthread, pthread_key_create) {
|
||||
pthread_key_t key;
|
||||
ASSERT_EQ(0, pthread_key_create(&key, NULL));
|
||||
@@ -721,23 +715,6 @@ TEST(pthread, pthread_rwlock_smoke) {
|
||||
ASSERT_EQ(0, pthread_rwlock_destroy(&l));
|
||||
}
|
||||
|
||||
static void WaitUntilThreadSleep(std::atomic<pid_t>& tid) {
|
||||
while (tid == 0) {
|
||||
usleep(1000);
|
||||
}
|
||||
std::string filename = android::base::StringPrintf("/proc/%d/stat", tid.load());
|
||||
std::regex regex {R"(\s+S\s+)"};
|
||||
|
||||
while (true) {
|
||||
std::string content;
|
||||
ASSERT_TRUE(android::base::ReadFileToString(filename, &content));
|
||||
if (std::regex_search(content, regex)) {
|
||||
break;
|
||||
}
|
||||
usleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
struct RwlockWakeupHelperArg {
|
||||
pthread_rwlock_t lock;
|
||||
enum Progress {
|
||||
|
||||
Reference in New Issue
Block a user