summaryrefslogtreecommitdiff
path: root/serverloop.c
diff options
context:
space:
mode:
Diffstat (limited to 'serverloop.c')
-rw-r--r--serverloop.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/serverloop.c b/serverloop.c
index 40ddfb042b49..5d3b194d128f 100644
--- a/serverloop.c
+++ b/serverloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: serverloop.c,v 1.241 2024/11/26 22:01:37 djm Exp $ */
+/* $OpenBSD: serverloop.c,v 1.244 2025/09/25 06:23:19 jsg Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -40,9 +40,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
-#ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
+#include <sys/time.h>
#include <netinet/in.h>
@@ -50,9 +48,7 @@
#include <fcntl.h>
#include <pwd.h>
#include <limits.h>
-#ifdef HAVE_POLL_H
#include <poll.h>
-#endif
#include <signal.h>
#include <string.h>
#include <termios.h>
@@ -89,7 +85,8 @@ extern struct sshauthopt *auth_opts;
static int no_more_sessions = 0; /* Disallow further sessions. */
-static volatile sig_atomic_t child_terminated = 0; /* The child has terminated. */
+static volatile sig_atomic_t child_terminated = 0; /* set on SIGCHLD */
+static volatile sig_atomic_t siginfo_received = 0;
/* prototypes */
static void server_init_dispatch(struct ssh *);
@@ -103,6 +100,14 @@ sigchld_handler(int sig)
child_terminated = 1;
}
+#ifdef SIGINFO
+static void
+siginfo_handler(int sig)
+{
+ siginfo_received = 1;
+}
+#endif
+
static void
client_alive_check(struct ssh *ssh)
{
@@ -285,8 +290,15 @@ static void
process_output(struct ssh *ssh, int connection_out)
{
int r;
+ static int interactive = -1;
/* Send any buffered packet data to the client. */
+ if (interactive != !channel_has_bulk(ssh)) {
+ interactive = !channel_has_bulk(ssh);
+ debug2_f("session QoS is now %s", interactive ?
+ "interactive" : "non-interactive");
+ ssh_packet_set_interactive(ssh, interactive);
+ }
if ((r = ssh_packet_write_poll(ssh)) != 0) {
sshpkt_fatal(ssh, r, "%s: ssh_packet_write_poll",
__func__);
@@ -326,9 +338,15 @@ server_loop2(struct ssh *ssh, Authctxt *authctxt)
debug("Entering interactive session for SSH2.");
- if (sigemptyset(&bsigset) == -1 || sigaddset(&bsigset, SIGCHLD) == -1)
+ if (sigemptyset(&bsigset) == -1 ||
+ sigaddset(&bsigset, SIGCHLD) == -1)
error_f("bsigset setup: %s", strerror(errno));
ssh_signal(SIGCHLD, sigchld_handler);
+#ifdef SIGINFO
+ if (sigaddset(&bsigset, SIGINFO) == -1)
+ error_f("bsigset setup: %s", strerror(errno));
+ ssh_signal(SIGINFO, siginfo_handler);
+#endif
child_terminated = 0;
connection_in = ssh_packet_get_connection_in(ssh);
connection_out = ssh_packet_get_connection_out(ssh);
@@ -350,6 +368,10 @@ server_loop2(struct ssh *ssh, Authctxt *authctxt)
if (sigprocmask(SIG_BLOCK, &bsigset, &osigset) == -1)
error_f("bsigset sigprocmask: %s", strerror(errno));
collect_children(ssh);
+ if (siginfo_received) {
+ siginfo_received = 0;
+ channel_report_open(ssh, SYSLOG_LEVEL_INFO);
+ }
wait_until_can_do_something(ssh, connection_in, connection_out,
&pfd, &npfd_alloc, &npfd_active, &osigset,
&conn_in_ready, &conn_out_ready);
@@ -650,7 +672,7 @@ server_input_hostkeys_prove(struct ssh *ssh, struct sshbuf **respp)
int r, ndx, success = 0;
const u_char *blob;
const char *sigalg, *kex_rsa_sigalg = NULL;
- u_char *sig = 0;
+ u_char *sig = NULL;
size_t blen, slen;
if ((resp = sshbuf_new()) == NULL || (sigbuf = sshbuf_new()) == NULL)