The branch main has been updated by bdrewery:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=a573243370d3f4ffad81c740591004851f2beb45

commit a573243370d3f4ffad81c740591004851f2beb45
Author:     Bryan Drewery <bdrew...@freebsd.org>
AuthorDate: 2021-07-26 23:27:07 +0000
Commit:     Bryan Drewery <bdrew...@freebsd.org>
CommitDate: 2021-07-27 16:06:23 +0000

    netdump: Fix leaking debugnet state on errors.
    
    Reviewed by:    cem, markj
    Sponsored by:   Dell EMC
    Differential Revision: https://reviews.freebsd.org/D31319
---
 sys/netinet/netdump/netdump_client.c | 32 ++++++++++++++++++++++++++------
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/sys/netinet/netdump/netdump_client.c 
b/sys/netinet/netdump/netdump_client.c
index 06a833c20c07..2669ec879d75 100644
--- a/sys/netinet/netdump/netdump_client.c
+++ b/sys/netinet/netdump/netdump_client.c
@@ -85,6 +85,7 @@ __FBSDID("$FreeBSD$");
                printf(("%s: " f), __func__, ## __VA_ARGS__);           \
 } while (0)
 
+static void     netdump_cleanup(void);
 static int      netdump_configure(struct diocskerneldump_arg *,
                    struct thread *);
 static int      netdump_dumper(void *priv __unused, void *virtual,
@@ -254,12 +255,13 @@ netdump_dumper(void *priv __unused, void *virtual,
                        printf("failed to close the transaction\n");
                else
                        printf("\nnetdump finished.\n");
-               debugnet_free(nd_conf.nd_pcb);
-               nd_conf.nd_pcb = NULL;
+               netdump_cleanup();
                return (0);
        }
-       if (length > sizeof(nd_buf))
+       if (length > sizeof(nd_buf)) {
+               netdump_cleanup();
                return (ENOSPC);
+       }
 
        if (nd_conf.nd_buf_len + length > sizeof(nd_buf) ||
            (nd_conf.nd_buf_len != 0 && nd_conf.nd_tx_off +
@@ -267,6 +269,7 @@ netdump_dumper(void *priv __unused, void *virtual,
                error = netdump_flush_buf();
                if (error != 0) {
                        dump_failed = 1;
+                       netdump_cleanup();
                        return (error);
                }
                nd_conf.nd_tx_off = offset;
@@ -344,20 +347,37 @@ netdump_write_headers(struct dumperinfo *di, struct 
kerneldumpheader *kdh,
 
        error = netdump_flush_buf();
        if (error != 0)
-               return (error);
+               goto out;
        memcpy(nd_buf, kdh, sizeof(*kdh));
        error = debugnet_send(nd_conf.nd_pcb, NETDUMP_KDH, nd_buf,
            sizeof(*kdh), NULL);
        if (error == 0 && keysize > 0) {
-               if (keysize > sizeof(nd_buf))
-                       return (EINVAL);
+               if (keysize > sizeof(nd_buf)) {
+                       error = EINVAL;
+                       goto out;
+               }
                memcpy(nd_buf, key, keysize);
                error = debugnet_send(nd_conf.nd_pcb, NETDUMP_EKCD_KEY, nd_buf,
                    keysize, NULL);
        }
+out:
+       if (error != 0)
+               netdump_cleanup();
        return (error);
 }
 
+/*
+ * Cleanup routine for a possibly failed netdump.
+ */
+static void
+netdump_cleanup(void)
+{
+       if (nd_conf.nd_pcb != NULL) {
+               debugnet_free(nd_conf.nd_pcb);
+               nd_conf.nd_pcb = NULL;
+       }
+}
+
 /*-
  * KLD specific code.
  */
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to