[openssh-commits] [openssh] 07/10: upstream: add some functions to free various structs, including
git+noreply at mindrot.org
git+noreply at mindrot.org
Thu Sep 25 17:02:38 AEST 2025
This is an automated email from the git hooks/post-receive script.
djm pushed a commit to branch master
in repository openssh.
commit 4fddebe7f524b3403c876c3b399d5ce7ce3390a6
Author: djm at openbsd.org <djm at openbsd.org>
AuthorDate: Thu Sep 25 06:33:19 2025 +0000
upstream: add some functions to free various structs, including
channels data and packet state; ok dtucker@ tb@
OpenBSD-Commit-ID: a8b3705309d632cdae370d4147a03e703087b0d1
---
channels.c | 23 ++++++++++++++++++++++-
channels.h | 5 +++--
misc.c | 17 ++++++++++++++++-
misc.h | 3 ++-
packet.c | 15 ++++++++++++++-
packet.h | 3 ++-
6 files changed, 59 insertions(+), 7 deletions(-)
diff --git a/channels.c b/channels.c
index ed852beb0..f1d7bcf34 100644
--- a/channels.c
+++ b/channels.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.450 2025/09/25 06:23:19 jsg Exp $ */
+/* $OpenBSD: channels.c,v 1.451 2025/09/25 06:33:19 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo at cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo at cs.hut.fi>, Espoo, Finland
@@ -855,6 +855,27 @@ channel_free_all(struct ssh *ssh)
sc->x11_fake_data_len = 0;
}
+void
+channel_free_channels(struct ssh *ssh)
+{
+ struct ssh_channels *sc;
+
+ if (ssh == NULL || ssh->chanctxt == NULL)
+ return;
+ channel_free_all(ssh);
+ channel_clear_permission(ssh, FORWARD_USER, FORWARD_LOCAL);
+ channel_clear_permission(ssh, FORWARD_USER, FORWARD_REMOTE);
+ channel_clear_permission(ssh, FORWARD_ADM, FORWARD_LOCAL);
+ channel_clear_permission(ssh, FORWARD_ADM, FORWARD_REMOTE);
+ sc = ssh->chanctxt;
+ free(sc->bulk_classifier_tty);
+ free(sc->bulk_classifier_notty);
+ free(sc->channel_pre);
+ free(sc->channel_post);
+ freezero(sc, sizeof(*sc));
+ ssh->chanctxt = NULL;
+}
+
/*
* Closes the sockets/fds of all channels. This is used to close extra file
* descriptors after a fork.
diff --git a/channels.h b/channels.h
index 145ea2f69..df7c7f364 100644
--- a/channels.h
+++ b/channels.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.h,v 1.160 2025/08/18 03:43:01 djm Exp $ */
+/* $OpenBSD: channels.h,v 1.161 2025/09/25 06:33:19 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo at cs.hut.fi>
@@ -282,8 +282,9 @@ struct Channel {
c->efd != -1 && (!(c->flags & (CHAN_EOF_RCVD|CHAN_CLOSE_RCVD)) || \
sshbuf_len(c->extended) > 0))
-/* Add channel management structures to SSH transport instance */
+/* Add/remove channel management structures to/from SSH transport instance */
void channel_init_channels(struct ssh *ssh);
+void channel_free_channels(struct ssh *ssh);
/* channel management */
diff --git a/misc.c b/misc.c
index 70da3348f..a7a8f5b1b 100644
--- a/misc.c
+++ b/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.207 2025/09/24 00:51:28 jsg Exp $ */
+/* $OpenBSD: misc.c,v 1.208 2025/09/25 06:33:19 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2005-2020 Damien Miller. All rights reserved.
@@ -524,6 +524,21 @@ pwcopy(struct passwd *pw)
return copy;
}
+void
+pwfree(struct passwd *pw)
+{
+ if (pw == NULL)
+ return;
+ free(pw->pw_name);
+ freezero(pw->pw_passwd,
+ pw->pw_passwd == NULL ? 0 : strlen(pw->pw_passwd));
+ free(pw->pw_gecos);
+ free(pw->pw_class);
+ free(pw->pw_dir);
+ free(pw->pw_shell);
+ freezero(pw, sizeof(*pw));
+}
+
/*
* Convert ASCII string to TCP/IP port number.
* Port must be >=0 and <=65535.
diff --git a/misc.h b/misc.h
index a7afa23e8..f3c5a18c6 100644
--- a/misc.h
+++ b/misc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.h,v 1.111 2025/05/05 02:48:06 djm Exp $ */
+/* $OpenBSD: misc.h,v 1.112 2025/09/25 06:33:19 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo at cs.hut.fi>
@@ -113,6 +113,7 @@ char *get_homedir(void);
void sock_set_v6only(int);
struct passwd *pwcopy(struct passwd *);
+void pwfree(struct passwd *); /* NB. only use with pwcopy */
const char *ssh_gai_strerror(int);
typedef void privdrop_fn(struct passwd *);
diff --git a/packet.c b/packet.c
index be16fd429..5dd8269c2 100644
--- a/packet.c
+++ b/packet.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.c,v 1.322 2025/08/18 09:16:36 job Exp $ */
+/* $OpenBSD: packet.c,v 1.323 2025/09/25 06:33:19 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo at cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo at cs.hut.fi>, Espoo, Finland
@@ -682,6 +682,7 @@ ssh_packet_close_internal(struct ssh *ssh, int do_close)
{
struct session_state *state = ssh->state;
u_int mode;
+ struct packet *p;
if (!state->initialized)
return;
@@ -698,6 +699,11 @@ ssh_packet_close_internal(struct ssh *ssh, int do_close)
sshbuf_free(state->output);
sshbuf_free(state->outgoing_packet);
sshbuf_free(state->incoming_packet);
+ while ((p = TAILQ_FIRST(&state->outgoing))) {
+ sshbuf_free(p->payload);
+ TAILQ_REMOVE(&state->outgoing, p, next);
+ free(p);
+ }
for (mode = 0; mode < MODE_MAX; mode++) {
kex_free_newkeys(state->newkeys[mode]); /* current keys */
state->newkeys[mode] = NULL;
@@ -746,6 +752,13 @@ ssh_packet_close_internal(struct ssh *ssh, int do_close)
}
}
+void
+ssh_packet_free(struct ssh *ssh)
+{
+ ssh_packet_close_internal(ssh, 1);
+ freezero(ssh, sizeof(*ssh));
+}
+
void
ssh_packet_close(struct ssh *ssh)
{
diff --git a/packet.h b/packet.h
index c0cbd8a7c..072f27425 100644
--- a/packet.h
+++ b/packet.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.h,v 1.102 2025/09/25 02:12:16 jsg Exp $ */
+/* $OpenBSD: packet.h,v 1.103 2025/09/25 06:33:19 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo at cs.hut.fi>
@@ -101,6 +101,7 @@ int ssh_packet_connection_af(struct ssh *);
void ssh_packet_set_nonblocking(struct ssh *);
int ssh_packet_get_connection_in(struct ssh *);
int ssh_packet_get_connection_out(struct ssh *);
+void ssh_packet_free(struct ssh *);
void ssh_packet_close(struct ssh *);
void ssh_packet_set_input_hook(struct ssh *, ssh_packet_hook_fn *, void *);
void ssh_packet_clear_keys(struct ssh *);
--
To stop receiving notification emails like this one, please contact
djm at mindrot.org.
More information about the openssh-commits
mailing list