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:
| M | luad.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;
}
}