luad

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 12c7abd3b0299395bb5071cf9313cf45ac896cdb
parent 0d7dfa957070d4c6311472f595846d36873befc3
Author: Daniel Barlow <dan@telent.net>
Date:   Mon,  1 Jun 2026 14:11:45 +0100

if message exceeds buffer size, disconnect instead of running lua

Diffstat:
Mluad.c | 21++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/luad.c b/luad.c @@ -192,6 +192,12 @@ struct peer_entry* find_peer(pid_t pid) { return NULL; } +void hangup_peer(int socket, struct sockaddr_un * peer_addr, + size_t peer_addr_len, + uint32_t retval) { + sendto(socket, (void *) &retval, 4, 0, (struct sockaddr *) peer_addr, peer_addr_len); +} + int main(int argc, char **argv) { int status; @@ -256,7 +262,7 @@ int main(int argc, char **argv) if(pollfds[0].revents) { if(find_peer(0)) { int len = recvmsg(socket, &msg , 0); - if(len<=0) continue; + if(len <= 0) continue; int peer_fds[3]; if(fds_from_msg(&msg, peer_fds)) { @@ -266,9 +272,12 @@ int main(int argc, char **argv) } memmove(argline, buf, len); - pid_t child_pid = fork_lua(L, argline, len, peer_fds); - register_peer(child_pid, &peer_addr, msg.msg_namelen); - + if(msg.msg_flags & (MSG_TRUNC | MSG_CTRUNC)) { + hangup_peer(socket, &peer_addr, msg.msg_namelen, 0xffff); + } else { + pid_t child_pid = fork_lua(L, argline, len, peer_fds); + register_peer(child_pid, &peer_addr, msg.msg_namelen); + } /* close peer fds in parent */ close(peer_fds[0]); close(peer_fds[1]); @@ -293,9 +302,7 @@ int main(int argc, char **argv) } else if(WIFSIGNALED(wstatus)) { ret = htonl(128 + WTERMSIG(wstatus)); } - sendto(socket, (void *) &ret, 4, 0, - (const struct sockaddr *) &(peer->addr), - peer->addrlen); + hangup_peer(socket, &(peer->addr), peer->addrlen, ret); peer->pid = 0; } }