diff --git a/CHANGELOG.md b/CHANGELOG.md index edaa31e..cafee73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,13 +106,15 @@ * Crash when a particle is “too wide”, and tries to render outside the bar ([#198][198]). * string: crash when failing to convert string to UTF-32. - +* script: only first transaction processed when receiving multiple + transactions in a single batch ([#221][221]). [169]: https://codeberg.org/dnkl/yambar/issues/169 [172]: https://codeberg.org/dnkl/yambar/issues/172 [178]: https://codeberg.org/dnkl/yambar/issues/178 [177]: https://codeberg.org/dnkl/yambar/issues/177 [198]: https://codeberg.org/dnkl/yambar/issues/198 +[221]: https://codeberg.org/dnkl/yambar/issues/221 ### Security diff --git a/modules/script.c b/modules/script.c index 829932f..fd149d2 100644 --- a/modules/script.c +++ b/modules/script.c @@ -313,21 +313,23 @@ data_received(struct module *mod, const char *data, size_t len) memcpy(&m->recv_buf.data[m->recv_buf.idx], data, len); m->recv_buf.idx += len; - const char *eot = memmem(m->recv_buf.data, m->recv_buf.idx, "\n\n", 2); - if (eot == NULL) { - /* End of transaction not yet available */ - return true; + while (true) { + const char *eot = memmem(m->recv_buf.data, m->recv_buf.idx, "\n\n", 2); + if (eot == NULL) { + /* End of transaction not yet available */ + return true; + } + + const size_t transaction_size = eot - m->recv_buf.data + 1; + process_transaction(mod, transaction_size); + + assert(m->recv_buf.idx >= transaction_size + 1); + memmove(m->recv_buf.data, + &m->recv_buf.data[transaction_size + 1], + m->recv_buf.idx - (transaction_size + 1)); + m->recv_buf.idx -= transaction_size + 1; } - const size_t transaction_size = eot - m->recv_buf.data + 1; - process_transaction(mod, transaction_size); - - assert(m->recv_buf.idx >= transaction_size + 1); - memmove(m->recv_buf.data, - &m->recv_buf.data[transaction_size + 1], - m->recv_buf.idx - (transaction_size + 1)); - m->recv_buf.idx -= transaction_size + 1; - return true; }