From 0913090f3a332f569bc4044be9cd8e54eb726a01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 22 Jul 2026 17:19:51 +0200 Subject: [PATCH] pam/gdm/extension: Use upstream macros to cleanup the JSON request This is what we were doing manually, as the APIs were not exposed. Use the new upstream code for this --- pam/internal/gdm/extension.go | 3 +-- pam/internal/gdm/extension.h | 6 ++++++ .../gdm-custom-json-pam-extension.h | 9 ++++++++ .../extensions/gdm-pam-extensions-common.h | 21 +++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/pam/internal/gdm/extension.go b/pam/internal/gdm/extension.go index 0e047378ee..3e7eb254b7 100644 --- a/pam/internal/gdm/extension.go +++ b/pam/internal/gdm/extension.go @@ -122,8 +122,7 @@ func (msg *jsonProtoMessage) release() { return } - C.free(unsafe.Pointer(msg.json)) - C.free(unsafe.Pointer(msg)) + C.gdm_custom_json_request_free((*C.GdmPamExtensionJSONProtocol)(msg)) } func (msg *jsonProtoMessage) protoName() string { diff --git a/pam/internal/gdm/extension.h b/pam/internal/gdm/extension.h index 20e36aaaff..f2def217bf 100644 --- a/pam/internal/gdm/extension.h +++ b/pam/internal/gdm/extension.h @@ -66,3 +66,9 @@ gdm_custom_json_request_is_valid_authd (GdmPamExtensionJSONProtocol *request) return strncmp (request->protocol_name, JSON_PROTO_NAME, sizeof (request->protocol_name)) == 0; } + +static inline void +gdm_custom_json_request_free (GdmPamExtensionJSONProtocol *message) +{ + GDM_PAM_EXTENSION_CUSTOM_JSON_RESPONSE_FREE (message); +} diff --git a/pam/internal/gdm/extensions/gdm-custom-json-pam-extension.h b/pam/internal/gdm/extensions/gdm-custom-json-pam-extension.h index 07052cf299..1d23484dae 100644 --- a/pam/internal/gdm/extensions/gdm-custom-json-pam-extension.h +++ b/pam/internal/gdm/extensions/gdm-custom-json-pam-extension.h @@ -63,3 +63,12 @@ typedef struct { #define GDM_PAM_EXTENSION_REPLY_TO_CUSTOM_JSON_RESPONSE(reply) \ ((GdmPamExtensionJSONProtocol *) (void *) reply->resp) + +#define GDM_PAM_EXTENSION_CUSTOM_JSON_RESPONSE_FREE(response) \ +{ \ + if ((response)->json != NULL) { \ + gdm_pam_extension_zero_buffer ((response)->json, strlen ((response)->json)); \ + free ((response)->json); \ + } \ + free (response); \ +} diff --git a/pam/internal/gdm/extensions/gdm-pam-extensions-common.h b/pam/internal/gdm/extensions/gdm-pam-extensions-common.h index 110226c4e5..4452d33729 100644 --- a/pam/internal/gdm/extensions/gdm-pam-extensions-common.h +++ b/pam/internal/gdm/extensions/gdm-pam-extensions-common.h @@ -27,10 +27,31 @@ #include #include #include +#include +#include #include #include +#if (defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \ + (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 25)) && \ + (defined(_GNU_SOURCE) || defined(_DEFAULT_SOURCE))) || \ + defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) + +#define gdm_pam_extension_zero_buffer(s, n) do { \ + explicit_bzero((s), (n)); \ +} while(0) + +#else + +#define gdm_pam_extension_zero_buffer(s, n) do { \ + memset((s), 0, (n)); \ + /* Memory barrier to prevent the compiler from erasing the memset */ \ + __asm__ __volatile__ ("" : : "r"(s) : "memory"); \ +} while(0) + +#endif + typedef struct { uint32_t length;