]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: add some functions to free various structs, including
authordjm@openbsd.org <djm@openbsd.org>
Thu, 25 Sep 2025 06:33:19 +0000 (06:33 +0000)
committerDamien Miller <djm@mindrot.org>
Thu, 25 Sep 2025 07:01:56 +0000 (17:01 +1000)
channels data and packet state; ok dtucker@ tb@

OpenBSD-Commit-ID: a8b3705309d632cdae370d4147a03e703087b0d1

channels.c
channels.h
misc.c
misc.h
packet.c
packet.h

index ed852beb09cc3a7b0332737eef2d04e5893cd749..f1d7bcf345b1995e3b9e38ea3cd2b7f6e2633686 100644 (file)
@@ -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@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@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.
index 145ea2f694450b7e797e819e377eaa296fcb8c97..df7c7f364d225bbf62ddc68f57ce0ad6403a1112 100644 (file)
@@ -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@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 70da3348f36bd0dd3b15e7b75d4d9f9b25ec6270..a7a8f5b1bb98b4d48659656dfab8ee9f074a6ec5 100644 (file)
--- 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 a7afa23e8e9293f6f6acdb48da6d2939873ac2e6..f3c5a18c62499637a39ba236da50850dfbbbbe86 100644 (file)
--- 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@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 *);
index be16fd42988d1c1e8e268868514bb9a6ee178bdf..5dd8269c218a37e2c6b5c42cdbc38e7055e110f6 100644 (file)
--- 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@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@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)
 {
index c0cbd8a7c520c1be1dd51b3db1145fbb1fdcbf42..072f274259ee1cc4a9c48bbce7737fcefe6a16f5 100644 (file)
--- 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@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 *);