Ensure that strings passed to TDLib's log message callback are UTF-8 encoded.
This commit is contained in:
parent
a8e8136f34
commit
cfe5c4a43b
@ -24,6 +24,8 @@
|
||||
#include "td/utils/port/RwMutex.h"
|
||||
#include "td/utils/port/thread.h"
|
||||
#include "td/utils/Slice.h"
|
||||
#include "td/utils/StringBuilder.h"
|
||||
#include "td/utils/utf8.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <atomic>
|
||||
@ -679,7 +681,18 @@ static std::atomic<ClientManager::LogMessageCallbackPtr> log_message_callback;
|
||||
static void log_message_callback_wrapper(int verbosity_level, CSlice message) {
|
||||
auto callback = log_message_callback.load(std::memory_order_relaxed);
|
||||
if (callback != nullptr) {
|
||||
callback(verbosity_level, message.c_str());
|
||||
if (check_utf8(message)) {
|
||||
callback(verbosity_level, message.c_str());
|
||||
} else {
|
||||
size_t pos = 0;
|
||||
while (1 <= message[pos] && message[pos] <= 126) {
|
||||
pos++;
|
||||
}
|
||||
CHECK(pos + 1 < message.size());
|
||||
auto utf8_message = PSTRING() << message.substr(0, pos)
|
||||
<< url_encode(message.substr(pos, message.size() - pos - 1)) << '\n';
|
||||
callback(verbosity_level, utf8_message.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -129,7 +129,7 @@ class ClientManager final {
|
||||
* \param verbosity_level Log verbosity level with which the message was added (-1 - 1024).
|
||||
* If 0, then TDLib will crash as soon as the callback returns.
|
||||
* None of the TDLib methods can be called from the callback.
|
||||
* \param message Null-terminated string with the message added to the log.
|
||||
* \param message Null-terminated UTF-8-encoded string with the message added to the log.
|
||||
*/
|
||||
using LogMessageCallbackPtr = void (*)(int verbosity_level, const char *message);
|
||||
|
||||
|
@ -91,7 +91,7 @@ TDJSON_EXPORT const char *td_execute(const char *request);
|
||||
* \param verbosity_level Log verbosity level with which the message was added (-1 - 1024).
|
||||
* If 0, then TDLib will crash as soon as the callback returns.
|
||||
* None of the TDLib methods can be called from the callback.
|
||||
* \param message Null-terminated string with the logged message. The string isn't guaranteed to be encoded in UTF-8.
|
||||
* \param message Null-terminated UTF-8-encoded string with the message added to the log.
|
||||
*/
|
||||
typedef void (*td_log_message_callback_ptr)(int verbosity_level, const char *message);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user