aboutsummaryrefslogtreecommitdiff
path: root/crypto/openssh/monitor_wrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/openssh/monitor_wrap.c')
-rw-r--r--crypto/openssh/monitor_wrap.c93
1 files changed, 52 insertions, 41 deletions
diff --git a/crypto/openssh/monitor_wrap.c b/crypto/openssh/monitor_wrap.c
index bd900b2f06ec..33494b73fa94 100644
--- a/crypto/openssh/monitor_wrap.c
+++ b/crypto/openssh/monitor_wrap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor_wrap.c,v 1.138 2024/10/22 06:13:00 dtucker Exp $ */
+/* $OpenBSD: monitor_wrap.c,v 1.142 2025/09/25 06:31:42 djm Exp $ */
/*
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
* Copyright 2002 Markus Friedl <markus@openbsd.org>
@@ -126,17 +126,17 @@ mm_reap(void)
}
if (WIFEXITED(status)) {
if (WEXITSTATUS(status) != 0) {
- debug_f("preauth child exited with status %d",
+ debug_f("child exited with status %d",
WEXITSTATUS(status));
cleanup_exit(255);
}
} else if (WIFSIGNALED(status)) {
- error_f("preauth child terminated by signal %d",
+ error_f("child terminated by signal %d",
WTERMSIG(status));
cleanup_exit(signal_is_crash(WTERMSIG(status)) ?
EXIT_CHILD_CRASH : 255);
} else {
- error_f("preauth child terminated abnormally (status=0x%x)",
+ error_f("child terminated abnormally (status=0x%x)",
status);
cleanup_exit(EXIT_CHILD_CRASH);
}
@@ -150,7 +150,7 @@ mm_request_send(int sock, enum monitor_reqtype type, struct sshbuf *m)
debug3_f("entering, type %d", type);
- if (mlen >= 0xffffffff)
+ if (mlen >= MONITOR_MAX_MSGLEN)
fatal_f("bad length %zu", mlen);
POKE_U32(buf, mlen + 1);
buf[4] = (u_char) type; /* 1st byte of payload is mesg-type */
@@ -183,7 +183,7 @@ mm_request_receive(int sock, struct sshbuf *m)
fatal_f("read: %s", strerror(errno));
}
msg_len = PEEK_U32(buf);
- if (msg_len > 256 * 1024)
+ if (msg_len > MONITOR_MAX_MSGLEN)
fatal_f("read: bad msg_len %d", msg_len);
sshbuf_reset(m);
if ((r = sshbuf_reserve(m, msg_len, &p)) != 0)
@@ -319,6 +319,17 @@ mm_decode_activate_server_options(struct ssh *ssh, struct sshbuf *m)
log_verbose_reset();
for (i = 0; i < options.num_log_verbose; i++)
log_verbose_add(options.log_verbose[i]);
+
+ /* use the macro hell to clean up too */
+#define M_CP_STROPT(x) free(newopts->x)
+#define M_CP_STRARRAYOPT(x, nx) do { \
+ for (i = 0; i < newopts->nx; i++) \
+ free(newopts->x[i]); \
+ free(newopts->x); \
+ } while (0)
+ COPY_MATCH_STRING_OPTS();
+#undef M_CP_STROPT
+#undef M_CP_STRARRAYOPT
free(newopts);
}
@@ -692,11 +703,11 @@ mm_start_pam(struct ssh *ssh)
{
struct sshbuf *m;
- debug3("%s entering", __func__);
+ debug3_f("entering");
if (!options.use_pam)
- fatal("UsePAM=no, but ended up in %s anyway", __func__);
+ fatal_f("UsePAM=no, but ended up in %s anyway", __func__);
if ((m = sshbuf_new()) == NULL)
- fatal("%s: sshbuf_new failed", __func__);
+ fatal_f("sshbuf_new failed");
mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_START, m);
sshbuf_free(m);
@@ -711,12 +722,12 @@ mm_do_pam_account(void)
size_t msglen;
int r;
- debug3("%s entering", __func__);
+ debug3_f("entering");
if (!options.use_pam)
- fatal("UsePAM=no, but ended up in %s anyway", __func__);
+ fatal_f("UsePAM=no, but ended up in %s anyway", __func__);
if ((m = sshbuf_new()) == NULL)
- fatal("%s: sshbuf_new failed", __func__);
+ fatal_f("sshbuf_new failed");
mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_ACCOUNT, m);
mm_request_receive_expect(pmonitor->m_recvfd,
@@ -724,12 +735,12 @@ mm_do_pam_account(void)
if ((r = sshbuf_get_u32(m, &ret)) != 0 ||
(r = sshbuf_get_cstring(m, &msg, &msglen)) != 0 ||
(r = sshbuf_put(loginmsg, msg, msglen)) != 0)
- fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ fatal_fr(r, "buffer error");
free(msg);
sshbuf_free(m);
- debug3("%s returning %d", __func__, ret);
+ debug3_f("returning %d", ret);
return (ret);
}
@@ -740,17 +751,17 @@ mm_sshpam_init_ctx(Authctxt *authctxt)
struct sshbuf *m;
int r, success;
- debug3("%s", __func__);
+ debug3_f("entering");
if ((m = sshbuf_new()) == NULL)
- fatal("%s: sshbuf_new failed", __func__);
+ fatal_f("sshbuf_new failed");
mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_INIT_CTX, m);
- debug3("%s: waiting for MONITOR_ANS_PAM_INIT_CTX", __func__);
+ debug3_f("waiting for MONITOR_ANS_PAM_INIT_CTX");
mm_request_receive_expect(pmonitor->m_recvfd,
MONITOR_ANS_PAM_INIT_CTX, m);
if ((r = sshbuf_get_u32(m, &success)) != 0)
- fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ fatal_fr(r, "buffer error");
if (success == 0) {
- debug3("%s: pam_init_ctx failed", __func__);
+ debug3_f("pam_init_ctx failed");
sshbuf_free(m);
return (NULL);
}
@@ -766,19 +777,19 @@ mm_sshpam_query(void *ctx, char **name, char **info,
u_int i, n;
int r, ret;
- debug3("%s", __func__);
+ debug3_f("entering");
if ((m = sshbuf_new()) == NULL)
- fatal("%s: sshbuf_new failed", __func__);
+ fatal_f("sshbuf_new failed");
mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_QUERY, m);
- debug3("%s: waiting for MONITOR_ANS_PAM_QUERY", __func__);
+ debug3_f("waiting for MONITOR_ANS_PAM_QUERY");
mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_QUERY, m);
if ((r = sshbuf_get_u32(m, &ret)) != 0 ||
(r = sshbuf_get_cstring(m, name, NULL)) != 0 ||
(r = sshbuf_get_cstring(m, info, NULL)) != 0 ||
(r = sshbuf_get_u32(m, &n)) != 0 ||
(r = sshbuf_get_u32(m, num)) != 0)
- fatal("%s: buffer error: %s", __func__, ssh_err(r));
- debug3("%s: pam_query returned %d", __func__, ret);
+ fatal_fr(r, "buffer error");
+ debug3_f("pam_query returned %d", ret);
sshpam_set_maxtries_reached(n);
if (*num > PAM_MAX_NUM_MSG)
fatal("%s: received %u PAM messages, expected <= %u",
@@ -788,7 +799,7 @@ mm_sshpam_query(void *ctx, char **name, char **info,
for (i = 0; i < *num; ++i) {
if ((r = sshbuf_get_cstring(m, &((*prompts)[i]), NULL)) != 0 ||
(r = sshbuf_get_u32(m, &((*echo_on)[i]))) != 0)
- fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ fatal_fr(r, "buffer error");
}
sshbuf_free(m);
return (ret);
@@ -801,23 +812,23 @@ mm_sshpam_respond(void *ctx, u_int num, char **resp)
u_int n, i;
int r, ret;
- debug3("%s", __func__);
+ debug3_f("entering");
if ((m = sshbuf_new()) == NULL)
- fatal("%s: sshbuf_new failed", __func__);
+ fatal_f("sshbuf_new failed");
if ((r = sshbuf_put_u32(m, num)) != 0)
- fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ fatal_fr(r, "buffer error");
for (i = 0; i < num; ++i) {
if ((r = sshbuf_put_cstring(m, resp[i])) != 0)
- fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ fatal_fr(r, "buffer error");
}
mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_RESPOND, m);
- debug3("%s: waiting for MONITOR_ANS_PAM_RESPOND", __func__);
+ debug3_f("waiting for MONITOR_ANS_PAM_RESPOND");
mm_request_receive_expect(pmonitor->m_recvfd,
MONITOR_ANS_PAM_RESPOND, m);
if ((r = sshbuf_get_u32(m, &n)) != 0)
- fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ fatal_fr(r, "buffer error");
ret = (int)n; /* XXX */
- debug3("%s: pam_respond returned %d", __func__, ret);
+ debug3_f("pam_respond returned %d", ret);
sshbuf_free(m);
return (ret);
}
@@ -827,11 +838,11 @@ mm_sshpam_free_ctx(void *ctxtp)
{
struct sshbuf *m;
- debug3("%s", __func__);
+ debug3_f("entering");
if ((m = sshbuf_new()) == NULL)
- fatal("%s: sshbuf_new failed", __func__);
+ fatal_f("sshbuf_new failed");
mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_FREE_CTX, m);
- debug3("%s: waiting for MONITOR_ANS_PAM_FREE_CTX", __func__);
+ debug3_f("waiting for MONITOR_ANS_PAM_FREE_CTX");
mm_request_receive_expect(pmonitor->m_recvfd,
MONITOR_ANS_PAM_FREE_CTX, m);
sshbuf_free(m);
@@ -1000,12 +1011,12 @@ mm_audit_event(struct ssh *ssh, ssh_audit_event_t event)
struct sshbuf *m;
int r;
- debug3("%s entering", __func__);
+ debug3_f("entering");
if ((m = sshbuf_new()) == NULL)
- fatal("%s: sshbuf_new failed", __func__);
+ fatal_f("sshbuf_new failed");
if ((r = sshbuf_put_u32(m, event)) != 0)
- fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ fatal_fr(r, "buffer error");
mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_EVENT, m);
sshbuf_free(m);
@@ -1017,12 +1028,12 @@ mm_audit_run_command(const char *command)
struct sshbuf *m;
int r;
- debug3("%s entering command %s", __func__, command);
+ debug3_f("entering command %s", command);
if ((m = sshbuf_new()) == NULL)
- fatal("%s: sshbuf_new failed", __func__);
+ fatal_f("sshbuf_new failed");
if ((r = sshbuf_put_cstring(m, command)) != 0)
- fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ fatal_fr(r, "buffer error");
mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_COMMAND, m);
sshbuf_free(m);