Skip to content

Commit 4b3653d

Browse files
committed
Stop converting strings to lossy ASCII for logging
https://bugs.webkit.org/show_bug.cgi?id=325477 Reviewed by Darin Adler. Many logging call sites pass String::ascii().data() because ASCIICString::data() is already a const char*. ascii() replaces every non-ASCII character with '?', so URLs, origins, file paths and database names containing one were logged garbled. The LOG, RELEASE_LOG and signpost macro families convert their arguments with logPrintfType(), and SAFE_PRINTF(), SAFE_FPRINTF() and SAFE_DATALOGF() with safePrintfType(), so these call sites can pass String::utf8() directly. PrintStream prints a String natively, so dataLog() and PrintStream::print() callers pass the String itself. NetworkCache.cpp logged String::latin1().data() with %s. Calling data() bypasses the deleted safePrintfType(const Latin1CString&), and the compiler does not flag an unsigned char* passed to %s. The pointer cannot be rejected by type either: Latin1Character is unsigned char, the same type as the uint8_t* pointers logged with %p. Log the URL as UTF-8 instead. FrameIOS.mm kept a pointer into a temporary ASCIICString beyond the end of the statement that created it. That code only builds with RECT_LOGGING, but it now passes the string to SAFE_PRINTF() directly. * Source/JavaScriptCore/API/JSScriptRef.cpp: * Source/JavaScriptCore/disassembler/ARM64Disassembler.cpp: (JSC::tryToDisassemble): * Source/JavaScriptCore/disassembler/CapstoneDisassembler.cpp: (JSC::tryToDisassemble): * Source/JavaScriptCore/disassembler/X86Disassembler.cpp: (JSC::tryToDisassemble): * Source/JavaScriptCore/jsc.cpp: (fillBufferWithContentsOfFile): * Source/JavaScriptCore/wasm/WasmBBQPlan.cpp: (JSC::Wasm::BBQPlan::dumpDisassembly): * Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.cpp: (JSC::IPInt::WASM_IPINT_EXTERN_CPP_DECL): * Source/JavaScriptCore/wasm/WasmOMGPlan.cpp: (JSC::Wasm::OMGPlan::dumpDisassembly): * Source/JavaScriptCore/wasm/WasmOSREntryPlan.cpp: (JSC::Wasm::OSREntryPlan::dumpDisassembly): * Source/WebCore/Modules/webdatabase/Database.cpp: (WebCore::Database::performOpenAndVerify): (WebCore::Database::getVersionFromDatabase): (WebCore::Database::setVersionInDatabase): (WebCore::Database::markAsDeletedAndClose): (WebCore::Database::performGetTableNames): * Source/WebCore/Modules/webdatabase/SQLStatement.cpp: (WebCore::SQLStatement::execute): * Source/WebCore/history/BackForwardCache.cpp: (WebCore::BackForwardCache::get): * Source/WebCore/loader/ApplicationManifestLoader.cpp: (WebCore::ApplicationManifestLoader::startLoading): * Source/WebCore/loader/ContentFilter.cpp: (WebCore::ContentFilter::continueAfterWillSendRequest): (WebCore::ContentFilter::startFilteringMainResource): (WebCore::ContentFilter::continueAfterResponseReceived): (WebCore::ContentFilter::continueAfterDataReceived): (WebCore::ContentFilter::continueAfterNotifyFinished): (WebCore::ContentFilter::didDecide): * Source/WebCore/loader/HistoryController.cpp: (WebCore::HistoryController::updateForStandardLoad): (WebCore::HistoryController::pushState): (WebCore::HistoryController::updateBackForwardListForReplaceState): * Source/WebCore/loader/icon/IconLoader.cpp: (WebCore::IconLoader::startLoading): (WebCore::IconLoader::notifyFinished): * Source/WebCore/page/LocalFrame.cpp: (WebCore::LocalFrame::injectUserScriptImmediately): * Source/WebCore/page/WebKitNamespace.cpp: (WebCore::WebKitNamespace::evaluateScript): * Source/WebCore/page/ios/FrameIOS.mm: (WebCore::LocalFrame::renderRectForPoint const): * Source/WebCore/platform/audio/mac/AudioSessionMac.mm: (WebCore::AudioSessionMac::setCategory): * Source/WebCore/platform/cocoa/ContentFilterUnblockHandlerCocoa.mm: (WebCore::ContentFilterUnblockHandler::canHandleRequest const): * Source/WebCore/platform/encryptedmedia/CDMProxy.cpp: (WebCore::CDMProxy::tryWaitForKeyHandle const): (WebCore::CDMProxy::getOrWaitForKeyHandle const): * Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp: (WebCore::WebCoreAVCFResourceLoader::startLoading): * Source/WebCore/platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm: (WebCore::AVAudioSessionCaptureDeviceManager::setPreferredAudioSessionDeviceIDs): * Source/WebCore/platform/network/MIMEHeader.cpp: (WebCore::retrieveKeyValuePairs): * Source/WebCore/platform/network/ParsedContentType.cpp: (WebCore::ParsedContentType::parseContentType): * Source/WebCore/platform/network/curl/CookieJarDB.cpp: (WebCore::CookieJarDB::checkDatabaseValidity): * Source/WebCore/platform/sql/SQLiteDatabase.cpp: (WebCore::SQLiteDatabase::clearAllTables): * Source/WebCore/platform/win/SearchPopupMenuDB.cpp: (WebCore::SearchPopupMenuDB::checkDatabaseValidity): * Source/WebKit/NetworkProcess/cache/NetworkCache.cpp: (WebKit::NetworkCache::Cache::retrieve): (WebKit::NetworkCache::Cache::completeRetrieve): (WebKit::NetworkCache::Cache::retrieveCompressionDictionaryBestMatch): * Source/WebKit/NetworkProcess/glib/NetworkMDNSRegisterGLib.cpp: (WebKit::NetworkMDNSRegister::registerMDNSName): * Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp: (WebKit::NetworkStorageManager::performEvictionForOrigin): (WebKit::NetworkStorageManager::donePrepareForTimeBasedEviction): * Source/WebKit/UIProcess/Cocoa/WebPageProxyCocoa.mm: (WebKit::WebPageProxy::didGeneratePageLoadTiming): * Source/WebKit/UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::runJavaScriptInFrameInScriptWorld): (WebKit::logFrameTreeHelper): (WebKit::WebPageProxy::logFrameTree): * Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/ThreadedCompositor.cpp: (WebKit::ThreadedCompositor::renderLayerTree): (WebKit::ThreadedCompositor::scheduleUpdateLocked): (WebKit::ThreadedCompositor::frameComplete): * Source/WebKit/WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::clearContentWorld): * Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm: (WebKit::WebProcess::accessibilityFocusedUIElement): * Source/WebKit/webpushd/PushService.mm: (WebPushD::PushService::subscribe): (WebPushD::PushService::removeRecordsForBundleIdentifierAndDataStore): * Source/WebKit/webpushd/WebPushDaemon.mm: (WebPushD::WebPushDaemon::connectionEventHandler): (WebPushD::WebPushDaemon::updateSubscriptionSetState): (WebPushD::WebPushDaemon::setPushAndNotificationsEnabledForOrigin): (WebPushD::WebPushDaemon::subscribeToPushService): (WebPushD::WebPushDaemon::unsubscribeFromPushService): (WebPushD::WebPushDaemon::getPushSubscription): (WebPushD::WebPushDaemon::incrementSilentPushCount): (WebPushD::WebPushDaemon::removePushSubscriptionsForOrigin): (WebPushD::WebPushDaemon::showNotification): (WebPushD::WebPushDaemon::getNotifications): (WebPushD::WebPushDaemon::cancelNotification): (WebPushD::WebPushDaemon::getPushPermissionState): (WebPushD::WebPushDaemon::requestPushPermission): (WebPushD::WebPushDaemon::setAppBadge): * Source/WebKitLegacy/Storage/StorageTracker.cpp: (WebKit::StorageTracker::openTrackerDatabase): (WebKit::StorageTracker::syncSetOriginDetails): (WebKit::StorageTracker::syncDeleteOrigin): (WebKit::StorageTracker::databasePathForOrigin): Canonical link: https://commits.webkit.org/322114@main
1 parent 8510dfc commit 4b3653d

40 files changed

Lines changed: 102 additions & 104 deletions

‎Source/JavaScriptCore/API/JSScriptRef.cpp‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ JSScriptRef JSScriptCreateReferencingImmortalASCIIText(JSContextGroupRef context
113113
auto sourceURL = urlString ? URL({ }, urlString->string()) : URL();
114114
auto result = OpaqueJSScript::create(vm, SourceOrigin { sourceURL }, sourceURL.string(), startingLineNumber, String(StringImpl::createWithoutCopying({ source, length })));
115115

116-
WTFBeginSignpost(source, JSScriptRef, "createImmortal: %" PRIVATE_LOG_STRING " (%u bytes)", result->debugDescription().ascii().data(), result->source().length());
116+
WTFBeginSignpost(source, JSScriptRef, "createImmortal: %" PRIVATE_LOG_STRING " (%u bytes)", result->debugDescription().utf8(), result->source().length());
117117
auto endSignpost = makeScopeExit([&] {
118118
WTFEndSignpost(source, JSScriptRef);
119119
});
@@ -140,7 +140,7 @@ JSScriptRef JSScriptCreateFromString(JSContextGroupRef contextGroup, JSStringRef
140140
auto sourceURL = urlString ? URL({ }, urlString->string()) : URL();
141141
auto result = OpaqueJSScript::create(vm, SourceOrigin { sourceURL }, sourceURL.string(), startingLineNumber, source->string());
142142

143-
WTFBeginSignpost(source, JSScriptRef, "createFromString: %" PRIVATE_LOG_STRING " (%u bytes)", result->debugDescription().ascii().data(), result->source().length());
143+
WTFBeginSignpost(source, JSScriptRef, "createFromString: %" PRIVATE_LOG_STRING " (%u bytes)", result->debugDescription().utf8(), result->source().length());
144144
auto endSignpost = makeScopeExit([&] {
145145
WTFEndSignpost(source, JSScriptRef);
146146
});
@@ -179,7 +179,7 @@ JSValueRef JSScriptEvaluate(JSContextRef context, JSScriptRef script, JSValueRef
179179
return nullptr;
180180
}
181181

182-
WTFBeginSignpost(script, JSScriptRef, "evaluate: %" PRIVATE_LOG_STRING " (%u bytes)", script->debugDescription().ascii().data(), script->source().length());
182+
WTFBeginSignpost(script, JSScriptRef, "evaluate: %" PRIVATE_LOG_STRING " (%u bytes)", script->debugDescription().utf8(), script->source().length());
183183
auto endSignpost = makeScopeExit([&] {
184184
WTFEndSignpost(script, JSScriptRef);
185185
});

‎Source/JavaScriptCore/disassembler/ARM64Disassembler.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ bool tryToDisassemble(const CodePtr<DisassemblyPtrTag>& codePtr, size_t size, vo
5454
snprintf(pcInfo, sizeof(pcInfo) - 1, "%#llx", static_cast<unsigned long long>(std::bit_cast<uintptr_t>(currentPC)));
5555
out.printf("%s%24s: %s", prefix, pcInfo, arm64Opcode.disassemble(currentPC));
5656
if (auto str = AssemblyCommentRegistry::singleton().comment(currentPC))
57-
out.printf("; %s\n", str->ascii().data());
57+
out.print("; ", *str, "\n");
5858
else
5959
out.printf("\n");
6060
pcOffset += sizeof(uint32_t);

‎Source/JavaScriptCore/disassembler/CapstoneDisassembler.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ bool tryToDisassemble(const CodePtr<DisassemblyPtrTag>& codePtr, size_t size, vo
5454
auto& instruction = instructions[i];
5555
out.printf("%s%#16llx: %s %s", prefix, static_cast<unsigned long long>(instruction.address), instruction.mnemonic, instruction.op_str);
5656
if (auto str = AssemblyCommentRegistry::singleton().comment(reinterpret_cast<void *>(static_cast<uintptr_t>(instruction.address))))
57-
out.printf("; %s\n", str->ascii().data());
57+
out.print("; ", *str, "\n");
5858
else
5959
out.printf("\n");
6060
}

‎Source/JavaScriptCore/disassembler/X86Disassembler.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ bool tryToDisassemble(const CodePtr<DisassemblyPtrTag>& codePtr, size_t size, vo
6262
else
6363
out.printf("%s%#16llx: failed-to-format", prefix, static_cast<unsigned long long>(std::bit_cast<uintptr_t>(data + offset)));
6464
if (auto str = AssemblyCommentRegistry::singleton().comment(reinterpret_cast<void*>(std::bit_cast<uintptr_t>(data + offset))))
65-
out.printf("; %s\n", str->ascii().data());
65+
out.print("; ", *str, "\n");
6666
else
6767
out.printf("\n");
6868
offset += instruction.length;

‎Source/JavaScriptCore/jsc.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1366,7 +1366,7 @@ static bool fillBufferWithContentsOfFile(const String& fileName, Vector<char>& b
13661366
struct stat statBuf;
13671367
auto fileNameUTF = fileName.tryGetUTF8();
13681368
if (!fileNameUTF.has_value()) {
1369-
fprintf(stderr, "Error when parsing file name: %s\n", fileName.ascii().data());
1369+
SAFE_FPRINTF(stderr, "Error when parsing file name: %s\n", fileName.utf8());
13701370
return false;
13711371
}
13721372
if (FileSystem::statFile(fileNameUTF->spanIncludingNullTerminator(), statBuf) == -1) {

‎Source/JavaScriptCore/wasm/WasmBBQPlan.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ FunctionAllowlist& BBQPlan::ensureGlobalBBQAllowlist()
7878
bool BBQPlan::dumpDisassembly(CompilationContext& context, LinkBuffer& linkBuffer, const RTT& signature, FunctionSpaceIndex functionIndexSpace)
7979
{
8080
if (shouldDumpDisassemblyFor(CompilationMode::BBQMode)) [[unlikely]] {
81-
dataLogLn("Generated BBQ functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", m_profiledCallee->nameWithHash(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")");
81+
dataLogLn("Generated BBQ functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString(), "),name:(", m_profiledCallee->nameWithHash(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")");
8282
if (context.bbqDisassembler)
8383
context.bbqDisassembler->dump(linkBuffer);
8484
linkBuffer.didAlreadyDisassemble();

‎Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.cpp‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,13 +1024,13 @@ WASM_IPINT_EXTERN_CPP_DECL(trace, CallFrame* callFrame, uint8_t* pc, uint8_t* mc
10241024
IPINT_END();
10251025

10261026
Wasm::IPIntCallee* callee = IPINT_CALLEE(callFrame);
1027-
dataLogF("<%p> %p%s / %p: executing +0x%x, %s, pc = %p, mc = %p\n",
1027+
SAFE_DATALOGF("<%p> %p%s / %p: executing +0x%x, %s, pc = %p, mc = %p\n",
10281028
&Thread::currentSingleton(),
10291029
instance,
1030-
makeString(callee->indexOrName()).ascii().data(),
1030+
makeString(callee->indexOrName()).utf8(),
10311031
callFrame,
10321032
static_cast<uint32_t>(pc - callee->bytecode()),
1033-
opcodeName(pc).characters(),
1033+
opcodeName(pc),
10341034
pc, mc);
10351035
IPINT_END();
10361036
}

‎Source/JavaScriptCore/wasm/WasmOMGPlan.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ FunctionAllowlist& OMGPlan::ensureGlobalOMGAllowlist()
7777

7878
void OMGPlan::dumpDisassembly(const Callee& callee, CompilationContext& context, LinkBuffer& linkBuffer, const RTT& signature, FunctionSpaceIndex functionIndexSpace)
7979
{
80-
dataLogLnIf(context.procedure->shouldDumpIR() || shouldDumpDisassemblyFor(CompilationMode::OMGMode), "Generated OMG functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", callee.nameWithHash(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")");
80+
dataLogLnIf(context.procedure->shouldDumpIR() || shouldDumpDisassemblyFor(CompilationMode::OMGMode), "Generated OMG functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString(), "),name:(", callee.nameWithHash(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")");
8181
if (shouldDumpDisassemblyFor(CompilationMode::OMGMode)) [[unlikely]] {
8282
ScopedPrintStream out;
8383
UncheckedKeyHashSet<B3::Value*> printedValues;

‎Source/JavaScriptCore/wasm/WasmOSREntryPlan.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ OSREntryPlan::OSREntryPlan(VM& vm, Ref<Module>&& module, Ref<BBQCallee>&& callee
6767
void OSREntryPlan::dumpDisassembly(CompilationContext& context, LinkBuffer& linkBuffer, const RTT& signature, FunctionSpaceIndex functionIndexSpace)
6868
{
6969
CompilationMode targetCompilationMode = CompilationMode::OMGForOSREntryMode;
70-
dataLogLnIf(context.procedure->shouldDumpIR() || shouldDumpDisassemblyFor(targetCompilationMode), "Generated OMGforOSREntry functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", m_callee->nameWithHash(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")");
70+
dataLogLnIf(context.procedure->shouldDumpIR() || shouldDumpDisassemblyFor(targetCompilationMode), "Generated OMGforOSREntry functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString(), "),name:(", m_callee->nameWithHash(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")");
7171
if (shouldDumpDisassemblyFor(targetCompilationMode)) [[unlikely]] {
7272
auto* disassembler = context.procedure->code().disassembler();
7373

‎Source/WebCore/Modules/webdatabase/Database.cpp‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ ExceptionOr<void> Database::performOpenAndVerify(bool shouldSetVersionInNewDatab
348348
if (entry != guidToVersionMap().end()) {
349349
// Map null string to empty string (see updateGUIDVersionMap()).
350350
currentVersion = entry->value.version.isNull() ? emptyString() : entry->value.version.isolatedCopy();
351-
LOG(StorageAPI, "Current cached version for guid %i is %s", m_guid, currentVersion.ascii().data());
351+
LOG(StorageAPI, "Current cached version for guid %i is %s", m_guid, currentVersion.utf8());
352352
} else {
353353
LOG(StorageAPI, "No cached version for guid %i", m_guid);
354354

@@ -377,9 +377,9 @@ ExceptionOr<void> Database::performOpenAndVerify(bool shouldSetVersionInNewDatab
377377
}
378378

379379
if (currentVersion.length()) {
380-
LOG(StorageAPI, "Retrieved current version %s from database %s", currentVersion.ascii().data(), databaseDebugName().ascii().data());
380+
LOG(StorageAPI, "Retrieved current version %s from database %s", currentVersion.utf8(), databaseDebugName().utf8());
381381
} else if (!m_new || shouldSetVersionInNewDatabase) {
382-
LOG(StorageAPI, "Setting version %s in database %s that was just created", m_expectedVersion.ascii().data(), databaseDebugName().ascii().data());
382+
LOG(StorageAPI, "Setting version %s in database %s that was just created", m_expectedVersion.utf8(), databaseDebugName().utf8());
383383
if (!setVersionInDatabase(m_expectedVersion, false)) {
384384
String message = formatErrorMessage("unable to open database, failed to write current version"_s, m_sqliteDatabase->lastError(), m_sqliteDatabase->lastErrorMsg());
385385
transaction.rollback();
@@ -394,7 +394,7 @@ ExceptionOr<void> Database::performOpenAndVerify(bool shouldSetVersionInNewDatab
394394
}
395395

396396
if (currentVersion.isNull()) {
397-
LOG(StorageAPI, "Database %s does not have its version set", databaseDebugName().ascii().data());
397+
LOG(StorageAPI, "Database %s does not have its version set", databaseDebugName().utf8());
398398
currentVersion = emptyString();
399399
}
400400

@@ -451,7 +451,7 @@ bool Database::getVersionFromDatabase(String& version, bool shouldCacheVersion)
451451
if (shouldCacheVersion)
452452
setCachedVersion(version);
453453
} else
454-
LOG_ERROR("Failed to retrieve version from database %s", databaseDebugName().ascii().data());
454+
LOG_ERROR("Failed to retrieve version from database %s", databaseDebugName().utf8());
455455

456456
m_databaseAuthorizer->enable();
457457

@@ -471,7 +471,7 @@ bool Database::setVersionInDatabase(const String& version, bool shouldCacheVersi
471471
if (shouldCacheVersion)
472472
setCachedVersion(version);
473473
} else
474-
LOG_ERROR("Failed to set version %s in database (%s)", version.ascii().data(), query.ascii().data());
474+
LOG_ERROR("Failed to set version %s in database (%s)", version.utf8(), query.utf8());
475475

476476
m_databaseAuthorizer->enable();
477477

@@ -566,7 +566,7 @@ void Database::markAsDeletedAndClose()
566566
if (m_deleted)
567567
return;
568568

569-
LOG(StorageAPI, "Marking %s (%p) as deleted", stringIdentifierIsolatedCopy().ascii().data(), this);
569+
LOG(StorageAPI, "Marking %s (%p) as deleted", stringIdentifierIsolatedCopy().utf8(), this);
570570
m_deleted = true;
571571

572572
close();
@@ -703,7 +703,7 @@ Vector<String> Database::performGetTableNames()
703703

704704
auto statement = sqliteDatabase().prepareStatement("SELECT name FROM sqlite_master WHERE type='table';"_s);
705705
if (!statement) {
706-
LOG_ERROR("Unable to retrieve list of tables for database %s", databaseDebugName().ascii().data());
706+
LOG_ERROR("Unable to retrieve list of tables for database %s", databaseDebugName().utf8());
707707
enableAuthorizer();
708708
return Vector<String>();
709709
}
@@ -719,7 +719,7 @@ Vector<String> Database::performGetTableNames()
719719
enableAuthorizer();
720720

721721
if (result != SQLITE_DONE) {
722-
LOG_ERROR("Error getting tables for database %s", databaseDebugName().ascii().data());
722+
LOG_ERROR("Error getting tables for database %s", databaseDebugName().utf8());
723723
return Vector<String>();
724724
}
725725

0 commit comments

Comments
 (0)