diff --git a/CHANGELOG.md b/CHANGELOG.md index 73028676..e1853345 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -112,6 +112,8 @@ * Handling of multi-column composed characters while reflowing. * Escape sequences sent for key combinations with `Return`, that did **not** include `Alt`. +* Clipboard (or primary selection) is now cleared when receiving an + OSC-52 command with an invalid base64 encoded payload. ### Security diff --git a/osc.c b/osc.c index 50d6ab3b..c04c8069 100644 --- a/osc.c +++ b/osc.c @@ -23,17 +23,6 @@ static void osc_to_clipboard(struct terminal *term, const char *target, const char *base64_data) { - char *decoded = base64_decode(base64_data); - if (decoded == NULL) { - if (errno == EINVAL) - LOG_WARN("OSC: invalid clipboard data: %s", base64_data); - else - LOG_ERRNO("base64_decode() failed"); - return; - } - - LOG_DBG("decoded: %s", decoded); - bool to_clipboard = false; bool to_primary = false; @@ -71,6 +60,22 @@ osc_to_clipboard(struct terminal *term, const char *target, return; } + char *decoded = base64_decode(base64_data); + if (decoded == NULL) { + if (errno == EINVAL) + LOG_WARN("OSC: invalid clipboard data: %s", base64_data); + else + LOG_ERRNO("base64_decode() failed"); + + if (to_clipboard) + selection_clipboard_unset(seat); + if (to_primary) + selection_primary_unset(seat); + return; + } + + LOG_DBG("decoded: %s", decoded); + if (to_clipboard) { char *copy = xstrdup(decoded); if (!text_to_clipboard(seat, term, copy, seat->kbd.serial))