Fix signal reading in prewarm wrapper

This commit is contained in:
Kovid Goyal 2022-07-10 15:58:40 +05:30
parent 751a52153d
commit fd6231a778
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -52,9 +52,6 @@
if ((i) < (count)) { \
memmove((array) + (i), (array) + (i) + 1, sizeof((array)[0]) * ((count) - (i))); \
}}
#define left_shift_buffer(buf, n, sz) { \
if ((sz) > (n)) { sz -= n; memmove((buf), (buf) + (n), (sz)); } else sz = 0; }
typedef struct transfer_buf {
char *buf;
@ -64,6 +61,14 @@ static transfer_buf from_child_tty = {0};
static transfer_buf to_child_tty = {0};
static char child_tty_name[256];
static void
left_shift_buffer(transfer_buf *t, size_t n) {
if (t->sz > n) {
t->sz -= n;
memmove(t->buf, t->buf + n, t->sz);
} else t->sz = 0;
}
#define err_prefix "prewarm wrapper process error: "
static inline void
print_error(const char *s, int errnum) {
@ -436,7 +441,7 @@ write_to_tty(transfer_buf *src, int *dest_fd) {
return false;
}
if (n > 0) {
left_shift_buffer(src->buf, n, src->sz);
left_shift_buffer(src, n);
} else *dest_fd = -1;
}
return true;
@ -463,12 +468,12 @@ static bool window_size_dirty = false;
static bool
read_signals(void) {
static char buf[sizeof(siginfo_t) * 8];
static size_t buf_pos = 0;
ssize_t len = safe_read(signal_read_fd, buf + buf_pos, sizeof(buf) - buf_pos);
static transfer_buf b = {.buf=buf};
ssize_t len = safe_read(signal_read_fd, buf + b.sz, sizeof(buf) - b.sz);
if (len < 0) return false;
if (len == 0) return true;
buf_pos = len;
while (buf_pos >= sizeof(siginfo_t)) {
b.sz += len;
while (b.sz >= sizeof(siginfo_t)) {
siginfo_t *sig = (siginfo_t*)buf;
switch(sig->si_signo) {
case SIGWINCH:
@ -485,7 +490,7 @@ read_signals(void) {
}
break;
}
left_shift_buffer(buf, sizeof(siginfo_t), buf_pos);
left_shift_buffer(&b, sizeof(siginfo_t));
}
return true;
}
@ -542,7 +547,7 @@ send_over_socket(void) {
if (n) {
if (n >= send_on_socket.sz) send_on_socket.sz = 0;
else {
left_shift_buffer(send_on_socket.buf, n, send_on_socket.sz);
left_shift_buffer(&send_on_socket, n);
}
}
return true;