git: a43916645fd8 - stable/13 - IPsec: Use protocol-specific malloc types instead of M_XDATA.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 11 May 2022 00:03:35 UTC
The branch stable/13 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=a43916645fd8044824822cf39188df93d1642ea0 commit a43916645fd8044824822cf39188df93d1642ea0 Author: John Baldwin <jhb@FreeBSD.org> AuthorDate: 2022-01-24 23:27:39 +0000 Commit: John Baldwin <jhb@FreeBSD.org> CommitDate: 2022-05-10 23:33:00 +0000 IPsec: Use protocol-specific malloc types instead of M_XDATA. Reviewed by: markj Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D33992 (cherry picked from commit 35d9e00dba8cf0c25fbfdbd41ad4d6d1906eed4b) --- sys/netipsec/xform_ah.c | 25 ++++++++++++++----------- sys/netipsec/xform_esp.c | 31 +++++++++++++++++-------------- sys/netipsec/xform_ipcomp.c | 15 +++++++++------ 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/sys/netipsec/xform_ah.c b/sys/netipsec/xform_ah.c index 5163bda86931..55dfe872092c 100644 --- a/sys/netipsec/xform_ah.c +++ b/sys/netipsec/xform_ah.c @@ -42,6 +42,7 @@ #include <sys/param.h> #include <sys/systm.h> +#include <sys/malloc.h> #include <sys/mbuf.h> #include <sys/socket.h> #include <sys/syslog.h> @@ -108,6 +109,8 @@ SYSCTL_VNET_PCPUSTAT(_net_inet_ah, IPSECCTL_STATS, stats, struct ahstat, ahstat, "AH statistics (struct ahstat, netipsec/ah_var.h)"); #endif +static MALLOC_DEFINE(M_AH, "ah", "IPsec AH"); + static unsigned char ipseczeroes[256]; /* larger than an ip6 extension hdr */ static int ah_input_cb(struct cryptop*); @@ -426,7 +429,7 @@ ah_massage_headers(struct mbuf **m0, int proto, int skip, int alg, int out) if (m->m_len <= skip) { ptr = (unsigned char *) malloc( skip - sizeof(struct ip6_hdr), - M_XDATA, M_NOWAIT); + M_AH, M_NOWAIT); if (ptr == NULL) { DPRINTF(("%s: failed to allocate memory" "for IPv6 headers\n",__func__)); @@ -505,7 +508,7 @@ ah_massage_headers(struct mbuf **m0, int proto, int skip, int alg, int out) __func__, off)); error6: if (alloc) - free(ptr, M_XDATA); + free(ptr, M_AH); m_freem(m); return EINVAL; } @@ -514,7 +517,7 @@ error6: if (alloc) { m_copyback(m, sizeof(struct ip6_hdr), skip - sizeof(struct ip6_hdr), ptr); - free(ptr, M_XDATA); + free(ptr, M_AH); } break; @@ -615,7 +618,7 @@ ah_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff) crp->crp_digest_start = skip + rplen; /* Allocate IPsec-specific opaque crypto info. */ - xd = malloc(sizeof(*xd) + skip + rplen + authsize, M_XDATA, + xd = malloc(sizeof(*xd) + skip + rplen + authsize, M_AH, M_NOWAIT | M_ZERO); if (xd == NULL) { DPRINTF(("%s: failed to allocate xform_data\n", __func__)); @@ -643,7 +646,7 @@ ah_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff) if (error != 0) { /* NB: mbuf is free'd by ah_massage_headers */ AHSTAT_INC(ahs_hdrops); - free(xd, M_XDATA); + free(xd, M_AH); crypto_freereq(crp); key_freesav(&sav); return (error); @@ -760,7 +763,7 @@ ah_input_cb(struct cryptop *crp) /* Copyback the saved (uncooked) network headers. */ m_copyback(m, 0, skip, ptr); - free(xd, M_XDATA), xd = NULL; /* No longer needed */ + free(xd, M_AH), xd = NULL; /* No longer needed */ /* * Header is now authenticated. @@ -821,7 +824,7 @@ bad: if (m != NULL) m_freem(m); if (xd != NULL) - free(xd, M_XDATA); + free(xd, M_AH); if (crp != NULL) crypto_freereq(crp); return error; @@ -974,7 +977,7 @@ ah_output(struct mbuf *m, struct secpolicy *sp, struct secasvar *sav, crp->crp_digest_start = skip + rplen; /* Allocate IPsec-specific opaque crypto info. */ - xd = malloc(sizeof(struct xform_data) + skip, M_XDATA, + xd = malloc(sizeof(struct xform_data) + skip, M_AH, M_NOWAIT | M_ZERO); if (xd == NULL) { crypto_freereq(crp); @@ -1028,7 +1031,7 @@ ah_output(struct mbuf *m, struct secpolicy *sp, struct secasvar *sav, skip, ahx->type, 1); if (error != 0) { m = NULL; /* mbuf was free'd by ah_massage_headers. */ - free(xd, M_XDATA); + free(xd, M_AH); crypto_freereq(crp); goto bad; } @@ -1119,7 +1122,7 @@ ah_output_cb(struct cryptop *crp) */ m_copyback(m, 0, skip, ptr); - free(xd, M_XDATA); + free(xd, M_AH); crypto_freereq(crp); AHSTAT_INC(ahs_hist[sav->alg_auth]); #ifdef REGRESSION @@ -1142,7 +1145,7 @@ ah_output_cb(struct cryptop *crp) return (error); bad: CURVNET_RESTORE(); - free(xd, M_XDATA); + free(xd, M_AH); crypto_freereq(crp); key_freesav(&sav); key_freesp(&sp); diff --git a/sys/netipsec/xform_esp.c b/sys/netipsec/xform_esp.c index dc64dc732992..01072cb4e2d6 100644 --- a/sys/netipsec/xform_esp.c +++ b/sys/netipsec/xform_esp.c @@ -41,6 +41,7 @@ #include <sys/param.h> #include <sys/systm.h> +#include <sys/malloc.h> #include <sys/mbuf.h> #include <sys/socket.h> #include <sys/syslog.h> @@ -102,6 +103,8 @@ SYSCTL_VNET_PCPUSTAT(_net_inet_esp, IPSECCTL_STATS, stats, struct espstat, espstat, "ESP statistics (struct espstat, netipsec/esp_var.h"); +static MALLOC_DEFINE(M_ESP, "esp", "IPsec ESP"); + static int esp_input_cb(struct cryptop *op); static int esp_output_cb(struct cryptop *crp); @@ -355,7 +358,7 @@ esp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff) } /* Get IPsec-specific opaque pointer */ - xd = malloc(sizeof(*xd), M_XDATA, M_NOWAIT | M_ZERO); + xd = malloc(sizeof(*xd), M_ESP, M_NOWAIT | M_ZERO); if (xd == NULL) { DPRINTF(("%s: failed to allocate xform_data\n", __func__)); goto xd_fail; @@ -374,7 +377,7 @@ esp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff) int aad_skip; crp->crp_aad_length += sizeof(seqh); - crp->crp_aad = malloc(crp->crp_aad_length, M_XDATA, M_NOWAIT); + crp->crp_aad = malloc(crp->crp_aad_length, M_ESP, M_NOWAIT); if (crp->crp_aad == NULL) { DPRINTF(("%s: failed to allocate xform_data\n", __func__)); @@ -463,7 +466,7 @@ esp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff) return (crypto_dispatch(crp)); crp_aad_fail: - free(xd, M_XDATA); + free(xd, M_ESP); xd_fail: crypto_freereq(crp); ESPSTAT_INC(esps_crypto); @@ -549,8 +552,8 @@ esp_input_cb(struct cryptop *crp) } /* Release the crypto descriptors */ - free(xd, M_XDATA), xd = NULL; - free(crp->crp_aad, M_XDATA), crp->crp_aad = NULL; + free(xd, M_ESP), xd = NULL; + free(crp->crp_aad, M_ESP), crp->crp_aad = NULL; crypto_freereq(crp), crp = NULL; /* @@ -659,9 +662,9 @@ bad: if (m != NULL) m_freem(m); if (xd != NULL) - free(xd, M_XDATA); + free(xd, M_ESP); if (crp != NULL) { - free(crp->crp_aad, M_XDATA); + free(crp->crp_aad, M_ESP); crypto_freereq(crp); } return error; @@ -853,7 +856,7 @@ esp_output(struct mbuf *m, struct secpolicy *sp, struct secasvar *sav, } /* IPsec-specific opaque crypto info. */ - xd = malloc(sizeof(struct xform_data), M_XDATA, M_NOWAIT | M_ZERO); + xd = malloc(sizeof(struct xform_data), M_ESP, M_NOWAIT | M_ZERO); if (xd == NULL) { DPRINTF(("%s: failed to allocate xform_data\n", __func__)); goto xd_fail; @@ -915,7 +918,7 @@ esp_output(struct mbuf *m, struct secpolicy *sp, struct secasvar *sav, int aad_skip; crp->crp_aad_length += sizeof(seqh); - crp->crp_aad = malloc(crp->crp_aad_length, M_XDATA, M_NOWAIT); + crp->crp_aad = malloc(crp->crp_aad_length, M_ESP, M_NOWAIT); if (crp->crp_aad == NULL) { DPRINTF(("%s: failed to allocate xform_data\n", __func__)); @@ -947,7 +950,7 @@ esp_output(struct mbuf *m, struct secpolicy *sp, struct secasvar *sav, return crypto_dispatch(crp); crp_aad_fail: - free(xd, M_XDATA); + free(xd, M_ESP); xd_fail: crypto_freereq(crp); ESPSTAT_INC(esps_crypto); @@ -1005,8 +1008,8 @@ esp_output_cb(struct cryptop *crp) error = EINVAL; goto bad; } - free(xd, M_XDATA); - free(crp->crp_aad, M_XDATA); + free(xd, M_ESP); + free(crp->crp_aad, M_ESP); crypto_freereq(crp); ESPSTAT_INC(esps_hist[sav->alg_enc]); if (sav->tdb_authalgxform != NULL) @@ -1039,8 +1042,8 @@ esp_output_cb(struct cryptop *crp) return (error); bad: CURVNET_RESTORE(); - free(xd, M_XDATA); - free(crp->crp_aad, M_XDATA); + free(xd, M_ESP); + free(crp->crp_aad, M_ESP); crypto_freereq(crp); key_freesav(&sav); key_freesp(&sp); diff --git a/sys/netipsec/xform_ipcomp.c b/sys/netipsec/xform_ipcomp.c index b9dfe0e3532f..760fd8dd2aa8 100644 --- a/sys/netipsec/xform_ipcomp.c +++ b/sys/netipsec/xform_ipcomp.c @@ -37,6 +37,7 @@ #include <sys/param.h> #include <sys/systm.h> +#include <sys/malloc.h> #include <sys/mbuf.h> #include <sys/lock.h> #include <sys/mutex.h> @@ -90,6 +91,8 @@ SYSCTL_VNET_PCPUSTAT(_net_inet_ipcomp, IPSECCTL_STATS, stats, struct ipcompstat, ipcompstat, "IPCOMP statistics (struct ipcompstat, netipsec/ipcomp_var.h"); +static MALLOC_DEFINE(M_IPCOMP, "ipcomp", "IPCOMP"); + static int ipcomp_input_cb(struct cryptop *crp); static int ipcomp_output_cb(struct cryptop *crp); @@ -235,7 +238,7 @@ ipcomp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff) goto bad; } /* Get IPsec-specific opaque pointer */ - xd = malloc(sizeof(*xd), M_XDATA, M_NOWAIT | M_ZERO); + xd = malloc(sizeof(*xd), M_IPCOMP, M_NOWAIT | M_ZERO); if (xd == NULL) { DPRINTF(("%s: cannot allocate xform_data\n", __func__)); IPCOMPSTAT_INC(ipcomps_crypto); @@ -328,7 +331,7 @@ ipcomp_input_cb(struct cryptop *crp) clen = crp->crp_olen; /* Length of data after processing */ /* Release the crypto descriptors */ - free(xd, M_XDATA), xd = NULL; + free(xd, M_IPCOMP), xd = NULL; crypto_freereq(crp), crp = NULL; /* In case it's not done already, adjust the size of the mbuf chain */ @@ -382,7 +385,7 @@ bad: if (m != NULL) m_freem(m); if (xd != NULL) - free(xd, M_XDATA); + free(xd, M_IPCOMP); if (crp != NULL) crypto_freereq(crp); return error; @@ -486,7 +489,7 @@ ipcomp_output(struct mbuf *m, struct secpolicy *sp, struct secasvar *sav, crp->crp_payload_length = ralen; /* IPsec-specific opaque crypto info */ - xd = malloc(sizeof(struct xform_data), M_XDATA, M_NOWAIT | M_ZERO); + xd = malloc(sizeof(struct xform_data), M_IPCOMP, M_NOWAIT | M_ZERO); if (xd == NULL) { IPCOMPSTAT_INC(ipcomps_crypto); DPRINTF(("%s: failed to allocate xform_data\n", __func__)); @@ -641,7 +644,7 @@ ipcomp_output_cb(struct cryptop *crp) } /* Release the crypto descriptor */ - free(xd, M_XDATA); + free(xd, M_IPCOMP); crypto_freereq(crp); /* NB: m is reclaimed by ipsec_process_done. */ @@ -652,7 +655,7 @@ bad: if (m) m_freem(m); CURVNET_RESTORE(); - free(xd, M_XDATA); + free(xd, M_IPCOMP); crypto_freereq(crp); key_freesav(&sav); key_freesp(&sp);