mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-27 10:41:58 +02:00
Make --dump-bytes robust against parser code modifying contents of buffer during parsing
This commit is contained in:
@@ -1348,8 +1348,14 @@ dispatch_pm(PS *self UNUSED, uint8_t *buf, size_t bufsz, bool is_extended UNUSED
|
|||||||
|
|
||||||
// Parse loop {{{
|
// Parse loop {{{
|
||||||
static void
|
static void
|
||||||
consume_input(PS *self) {
|
consume_input(PS *self, PyObject *dump_callback UNUSED, id_type window_id UNUSED) {
|
||||||
#define consume(x) if (accumulate_st_terminated_esc_code(self, dispatch_##x)) { self->read.consumed = self->read.pos; SET_STATE(NORMAL); } break;
|
#define consume(x) if (accumulate_st_terminated_esc_code(self, dispatch_##x)) { self->read.consumed = self->read.pos; SET_STATE(NORMAL); } break;
|
||||||
|
|
||||||
|
#ifdef DUMP_COMMANDS
|
||||||
|
PyObject *dumped_bytes = PyBytes_FromStringAndSize((const char*)self->buf + self->read.pos, self->read.sz - self->read.pos);
|
||||||
|
size_t pre_consume_pos = self->read.pos;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (self->vte_state) {
|
switch (self->vte_state) {
|
||||||
case VTE_NORMAL:
|
case VTE_NORMAL:
|
||||||
consume_normal(self); self->read.consumed = self->read.pos; break;
|
consume_normal(self); self->read.consumed = self->read.pos; break;
|
||||||
@@ -1368,6 +1374,17 @@ consume_input(PS *self) {
|
|||||||
case VTE_DCS:
|
case VTE_DCS:
|
||||||
consume(dcs);
|
consume(dcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DUMP_COMMANDS
|
||||||
|
if (dumped_bytes && dump_callback && self->read.pos > pre_consume_pos) {
|
||||||
|
if (_PyBytes_Resize(&dumped_bytes, self->read.pos - pre_consume_pos) == 0) {
|
||||||
|
PyObject *ret = PyObject_CallFunction(dump_callback, "KsO", window_id, "bytes", dumped_bytes);
|
||||||
|
Py_DECREF(dumped_bytes);
|
||||||
|
if (ret) { Py_DECREF(ret); } else { PyErr_Clear(); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef consume
|
#undef consume
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1394,19 +1411,12 @@ run_worker(void *p, ParseData *pd, bool flush) {
|
|||||||
self->read.consumed = 0;
|
self->read.consumed = 0;
|
||||||
do {
|
do {
|
||||||
end_with_lock; {
|
end_with_lock; {
|
||||||
consume_input(self);
|
consume_input(self, pd->dump_callback, screen->window_id);
|
||||||
} with_lock;
|
} with_lock;
|
||||||
self->read.sz += self->write.pending; self->write.pending = 0;
|
self->read.sz += self->write.pending; self->write.pending = 0;
|
||||||
} while (self->read.pos < self->read.sz);
|
} while (self->read.pos < self->read.sz);
|
||||||
self->new_input_at = 0;
|
self->new_input_at = 0;
|
||||||
if (self->read.consumed) {
|
if (self->read.consumed) {
|
||||||
#ifdef DUMP_COMMANDS
|
|
||||||
if (pd->dump_callback) {
|
|
||||||
RAII_PyObject(mv, PyMemoryView_FromMemory((char*)self->buf + self->read.pos - self->read.consumed, self->read.consumed, PyBUF_READ));
|
|
||||||
PyObject *ret = PyObject_CallFunction(pd->dump_callback, "KsO", screen->window_id, "bytes", mv);
|
|
||||||
if (ret) { Py_DECREF(ret); } else { PyErr_Clear(); }
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
pd->write_space_created = self->read.sz >= BUF_SZ;
|
pd->write_space_created = self->read.sz >= BUF_SZ;
|
||||||
self->read.pos -= MIN(self->read.pos, self->read.consumed);
|
self->read.pos -= MIN(self->read.pos, self->read.consumed);
|
||||||
self->read.sz -= MIN(self->read.sz, self->read.consumed);
|
self->read.sz -= MIN(self->read.sz, self->read.consumed);
|
||||||
|
|||||||
Reference in New Issue
Block a user