Skip to content

Commit

Permalink
lightningd: simplify and optimize plugin escape handling.
Browse files Browse the repository at this point in the history
Signed-off-by: Rusty Russell <[email protected]>
  • Loading branch information
rustyrussell committed Jan 28, 2025
1 parent 0f92bad commit 5a14c6b
Showing 1 changed file with 17 additions and 36 deletions.
53 changes: 17 additions & 36 deletions lightningd/plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -505,49 +505,30 @@ static const char *plugin_log_handle(struct plugin *plugin,

call_notifier = (level == LOG_BROKEN || level == LOG_UNUSUAL)? true : false;

/* Unescape log message. */
tal_t *ctx = tal(NULL, char);
const char *log_escaped = plugin->buffer + msgtok->start;
const size_t log_escaped_len = msgtok->end - msgtok->start;
struct json_escape *esc = json_escape_string_(ctx, log_escaped, log_escaped_len);
const char *log_msg = json_escape_unescape(ctx, esc);

/* Find last line. */
const char *log_msg2 = log_msg;
const char *last_msg;
while (true) {
const char *msg_end = strchr(log_msg2, '\n');
if (!msg_end) {
break;
}
int msg_len = msg_end - log_msg2;
if (msg_len > 0) {
last_msg = log_msg2;
}
log_msg2 = msg_end + 1;
}
/* Only bother unescaping and splitting if it has \ */
if (memchr(plugin->buffer + msgtok->start, '\\', msgtok->end - msgtok->start)) {
const char *log_escaped = plugin->buffer + msgtok->start;
const size_t log_escaped_len = msgtok->end - msgtok->start;
struct json_escape *esc = json_escape_string_(tmpctx, log_escaped, log_escaped_len);
const char *log_msg = json_escape_unescape(tmpctx, esc);
char **lines;

/* Split to lines and log them separately. */
while (true) {
const char *msg_end = strchr(log_msg, '\n');
if (!msg_end) {
break;
}
int msg_len = msg_end - log_msg;
if (msg_len > 0) {
/* Call notifier only for the last message to avoid Python errors. */
lines = tal_strsplit(tmpctx, log_msg, "\n", STR_EMPTY_OK);

for (size_t i = 0; lines[i]; i++) {
bool call_notifier2 = call_notifier;
if (log_msg != last_msg) {
/* Call notifier only for the last message to avoid Python errors. */
if (lines[i+1] != NULL)
call_notifier2 = false;
}
/* FIXME: Let plugin specify node_id? */
log_(plugin->log, level, NULL, call_notifier2, "%.*s", msg_len, log_msg);
log_(plugin->log, level, NULL, call_notifier2, "%s", lines[i]);
}
log_msg = msg_end + 1;
} else {
log_(plugin->log, level, NULL, call_notifier, "%.*s",
msgtok->end - msgtok->start,
plugin->buffer + msgtok->start);
}

tal_free(ctx);

return NULL;
}

Expand Down

0 comments on commit 5a14c6b

Please sign in to comment.