[standalone] Fix reuse of va_list in syslog_android.cc.

Also add some missing va_end.

TEST=ci
Bug: https://github.com/dart-lang/sdk/issues/47939
Change-Id: Iadfbf72493d987dfb1d102922db1b353249a4728
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/224240
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
Ryan Macnak 2021-12-15 22:22:36 +00:00 committed by Commit Bot
parent 59979dc973
commit 4b2309c15a
8 changed files with 86 additions and 64 deletions

View file

@ -17,17 +17,17 @@ namespace dart {
namespace embedder {
static char* MallocFormatedString(const char* format, ...) {
va_list args;
va_start(args, format);
intptr_t len = vsnprintf(NULL, 0, format, args);
va_end(args);
va_list measure_args;
va_start(measure_args, format);
intptr_t len = vsnprintf(NULL, 0, format, measure_args);
va_end(measure_args);
char* buffer = reinterpret_cast<char*>(malloc(len + 1));
MSAN_UNPOISON(buffer, (len + 1));
va_list args2;
va_start(args2, format);
vsnprintf(buffer, (len + 1), format, args2);
va_end(args2);
va_list print_args;
va_start(print_args, format);
vsnprintf(buffer, (len + 1), format, print_args);
va_end(print_args);
return buffer;
}

View file

@ -729,17 +729,17 @@ Dart_Handle DartUtils::NewDartIOException(const char* exception_name,
}
Dart_Handle DartUtils::NewError(const char* format, ...) {
va_list args;
va_start(args, format);
intptr_t len = vsnprintf(NULL, 0, format, args);
va_end(args);
va_list measure_args;
va_start(measure_args, format);
intptr_t len = vsnprintf(NULL, 0, format, measure_args);
va_end(measure_args);
char* buffer = reinterpret_cast<char*>(Dart_ScopeAllocate(len + 1));
MSAN_UNPOISON(buffer, (len + 1));
va_list args2;
va_start(args2, format);
vsnprintf(buffer, (len + 1), format, args2);
va_end(args2);
va_list print_args;
va_start(print_args, format);
vsnprintf(buffer, (len + 1), format, print_args);
va_end(print_args);
return Dart_NewApiError(buffer);
}
@ -749,17 +749,17 @@ Dart_Handle DartUtils::NewInternalError(const char* message) {
}
Dart_Handle DartUtils::NewStringFormatted(const char* format, ...) {
va_list args;
va_start(args, format);
intptr_t len = vsnprintf(NULL, 0, format, args);
va_end(args);
va_list measure_args;
va_start(measure_args, format);
intptr_t len = vsnprintf(NULL, 0, format, measure_args);
va_end(measure_args);
char* buffer = reinterpret_cast<char*>(Dart_ScopeAllocate(len + 1));
MSAN_UNPOISON(buffer, (len + 1));
va_list args2;
va_start(args2, format);
vsnprintf(buffer, (len + 1), format, args2);
va_end(args2);
va_list print_args;
va_start(print_args, format);
vsnprintf(buffer, (len + 1), format, print_args);
va_end(print_args);
return NewString(buffer);
}

View file

@ -19,18 +19,32 @@ void Syslog::VPrint(const char* format, va_list args) {
// If we launch the DartVM inside "adb shell" we will only get messages
// (critical ones or not) if we print them to stdout/stderr.
// We also log using android's logging system.
vprintf(format, args);
va_list stdio_args;
va_copy(stdio_args, args);
vprintf(format, stdio_args);
fflush(stdout);
__android_log_vprint(ANDROID_LOG_INFO, "Dart", format, args);
va_end(stdio_args);
va_list log_args;
va_copy(log_args, args);
__android_log_vprint(ANDROID_LOG_INFO, "Dart", format, log_args);
va_end(log_args);
}
void Syslog::VPrintErr(const char* format, va_list args) {
// If we launch the DartVM inside "adb shell" we will only get messages
// (critical ones or not) if we print them to stdout/stderr.
// We also log using android's logging system.
vfprintf(stderr, format, args);
va_list stdio_args;
va_copy(stdio_args, args);
vfprintf(stderr, format, stdio_args);
fflush(stderr);
__android_log_vprint(ANDROID_LOG_ERROR, "Dart", format, args);
va_end(stdio_args);
va_list log_args;
va_copy(log_args, args);
__android_log_vprint(ANDROID_LOG_ERROR, "Dart", format, log_args);
va_end(log_args);
}
} // namespace dart

View file

@ -80,14 +80,16 @@ void DisassembleToJSONStream::ConsumeInstruction(char* hex_buffer,
}
void DisassembleToJSONStream::Print(const char* format, ...) {
va_list args;
va_start(args, format);
intptr_t len = Utils::VSNPrint(NULL, 0, format, args);
va_end(args);
va_list measure_args;
va_start(measure_args, format);
intptr_t len = Utils::VSNPrint(NULL, 0, format, measure_args);
va_end(measure_args);
char* p = reinterpret_cast<char*>(malloc(len + 1));
va_start(args, format);
intptr_t len2 = Utils::VSNPrint(p, len, format, args);
va_end(args);
va_list print_args;
va_start(print_args, format);
intptr_t len2 = Utils::VSNPrint(p, len, format, print_args);
va_end(print_args);
ASSERT(len == len2);
for (intptr_t i = 0; i < len; i++) {
if (p[i] == '\n' || p[i] == '\r') {
@ -134,10 +136,10 @@ void DisassembleToMemory::Print(const char* format, ...) {
if (overflowed_) {
return;
}
va_list args;
va_start(args, format);
intptr_t len = Utils::VSNPrint(NULL, 0, format, args);
va_end(args);
va_list measure_args;
va_start(measure_args, format);
intptr_t len = Utils::VSNPrint(NULL, 0, format, measure_args);
va_end(measure_args);
if (remaining_ < len + 100) {
*buffer_++ = '.';
*buffer_++ = '.';
@ -147,9 +149,10 @@ void DisassembleToMemory::Print(const char* format, ...) {
overflowed_ = true;
return;
}
va_start(args, format);
intptr_t len2 = Utils::VSNPrint(buffer_, len, format, args);
va_end(args);
va_list print_args;
va_start(print_args, format);
intptr_t len2 = Utils::VSNPrint(buffer_, len, format, print_args);
va_end(print_args);
ASSERT(len == len2);
buffer_ += len;
remaining_ -= len;

View file

@ -164,16 +164,16 @@ void JSONStream::PrintError(intptr_t code, const char* details_format, ...) {
JSONObject data(&jsobj, "data");
PrintRequest(&data, this);
if (details_format != NULL) {
va_list args;
va_start(args, details_format);
intptr_t len = Utils::VSNPrint(NULL, 0, details_format, args);
va_end(args);
va_list measure_args;
va_start(measure_args, details_format);
intptr_t len = Utils::VSNPrint(NULL, 0, details_format, measure_args);
va_end(measure_args);
char* buffer = Thread::Current()->zone()->Alloc<char>(len + 1);
va_list args2;
va_start(args2, details_format);
Utils::VSNPrint(buffer, (len + 1), details_format, args2);
va_end(args2);
va_list print_args;
va_start(print_args, details_format);
Utils::VSNPrint(buffer, (len + 1), details_format, print_args);
va_end(print_args);
data.AddProperty("details", buffer);
}
}

View file

@ -105,16 +105,16 @@ static ArrayPtr Eval(Dart_Handle lib, const char* expr) {
}
static ArrayPtr EvalF(Dart_Handle lib, const char* fmt, ...) {
va_list args;
va_start(args, fmt);
intptr_t len = Utils::VSNPrint(NULL, 0, fmt, args);
va_end(args);
va_list messure_args;
va_start(messure_args, fmt);
intptr_t len = Utils::VSNPrint(NULL, 0, fmt, messure_args);
va_end(messure_args);
char* buffer = Thread::Current()->zone()->Alloc<char>(len + 1);
va_list args2;
va_start(args2, fmt);
Utils::VSNPrint(buffer, (len + 1), fmt, args2);
va_end(args2);
va_list print_args;
va_start(print_args, fmt);
Utils::VSNPrint(buffer, (len + 1), fmt, print_args);
va_end(print_args);
return Eval(lib, buffer);
}

View file

@ -349,14 +349,16 @@ void TimelineEventArguments::FormatArgument(intptr_t i,
va_list args) {
ASSERT(i >= 0);
ASSERT(i < length_);
va_list args2;
va_copy(args2, args);
intptr_t len = Utils::VSNPrint(NULL, 0, fmt, args);
va_end(args);
va_list measure_args;
va_copy(measure_args, args);
intptr_t len = Utils::VSNPrint(NULL, 0, fmt, measure_args);
va_end(measure_args);
char* buffer = reinterpret_cast<char*>(malloc(len + 1));
Utils::VSNPrint(buffer, (len + 1), fmt, args2);
va_end(args2);
va_list print_args;
va_copy(print_args, args);
Utils::VSNPrint(buffer, (len + 1), fmt, print_args);
va_end(print_args);
SetArgument(i, name, buffer);
}
@ -546,6 +548,7 @@ void TimelineEvent::FormatArgument(intptr_t i,
va_list args;
va_start(args, fmt);
arguments_.FormatArgument(i, name, fmt, args);
va_end(args);
}
void TimelineEvent::Complete() {
@ -846,6 +849,7 @@ void TimelineEventScope::FormatArgument(intptr_t i,
va_list args;
va_start(args, fmt);
arguments_.FormatArgument(i, name, fmt, args);
va_end(args);
}
void TimelineEventScope::StealArguments(TimelineEvent* event) {

View file

@ -279,6 +279,7 @@ intptr_t V8SnapshotProfileWriter::StringsTable::AddFormatted(const char* fmt,
va_list args;
va_start(args, fmt);
const char* str = OS::VSCreate(zone_, fmt, args);
va_end(args);
if (auto const kv = index_map_.Lookup(str)) {
return kv->value;
}