-/* $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@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
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.
-/* $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@cs.hut.fi>
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 */
-/* $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.
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.
-/* $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@cs.hut.fi>
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 *);
-/* $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@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
{
struct session_state *state = ssh->state;
u_int mode;
+ struct packet *p;
if (!state->initialized)
return;
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;
}
}
+void
+ssh_packet_free(struct ssh *ssh)
+{
+ ssh_packet_close_internal(ssh, 1);
+ freezero(ssh, sizeof(*ssh));
+}
+
void
ssh_packet_close(struct ssh *ssh)
{
-/* $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@cs.hut.fi>
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 *);