From f709c887185031faa324b7329cc0c7f04d6428ff Mon Sep 17 00:00:00 2001 From: lacatoire Date: Fri, 16 Oct 2026 16:48:45 +0200 Subject: [PATCH] Copy the context name in SNMP::setSecurity() --- ext/snmp/snmp.c | 6 ++++- .../snmp-object-setSecurity-contextName.phpt | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 ext/snmp/tests/snmp-object-setSecurity-contextName.phpt diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index 6277c1f3f728..bfc7131e7424 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -160,6 +160,7 @@ static void netsnmp_session_free(php_snmp_session **session) /* {{{ */ PHP_SNMP_SESSION_FREE(community); PHP_SNMP_SESSION_FREE(securityName); PHP_SNMP_SESSION_FREE(contextEngineID); + PHP_SNMP_SESSION_FREE(contextName); efree(*session); *session = NULL; } @@ -1169,7 +1170,10 @@ static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool netsnmp_session_set_security(struct s /* Setting contextName if specified */ if (contextName) { - session->contextName = ZSTR_VAL(contextName); + if (session->contextName) { + efree(session->contextName); + } + session->contextName = estrndup(ZSTR_VAL(contextName), ZSTR_LEN(contextName)); session->contextNameLen = ZSTR_LEN(contextName); } diff --git a/ext/snmp/tests/snmp-object-setSecurity-contextName.phpt b/ext/snmp/tests/snmp-object-setSecurity-contextName.phpt new file mode 100644 index 000000000000..95055e2be8f3 --- /dev/null +++ b/ext/snmp/tests/snmp-object-setSecurity-contextName.phpt @@ -0,0 +1,22 @@ +--TEST-- +SNMP::setSecurity() - the context name is copied +--EXTENSIONS-- +snmp +--SKIPIF-- + +--FILE-- +setSecurity('authPriv', 'MD5', $auth_pass, 'AES', $priv_pass, $context); +unset($context); +// The agent does not know this context, only the lifetime of the name matters. +var_dump(@$session->get('.1.3.6.1.2.1.1.1.0')); +$session->close(); +?> +--EXPECT-- +bool(false)