-fix theoretical use-after-free in test on error path

This commit is contained in:
Christian Grothoff
2023-09-25 21:52:48 +02:00
parent 64d90a1a85
commit 4a031e5482
+27 -26
View File
@@ -56,11 +56,11 @@
#endif /* ! MHD_STATICSTR_LEN_ */ #endif /* ! MHD_STATICSTR_LEN_ */
#ifndef CURL_VERSION_BITS #ifndef CURL_VERSION_BITS
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z)) #define CURL_VERSION_BITS(x,y,z) ((x) << 16 | (y) << 8 | (z))
#endif /* ! CURL_VERSION_BITS */ #endif /* ! CURL_VERSION_BITS */
#ifndef CURL_AT_LEAST_VERSION #ifndef CURL_AT_LEAST_VERSION
#define CURL_AT_LEAST_VERSION(x,y,z) \ #define CURL_AT_LEAST_VERSION(x,y,z) \
(LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS (x, y, z))
#endif /* ! CURL_AT_LEAST_VERSION */ #endif /* ! CURL_AT_LEAST_VERSION */
#ifndef _MHD_INSTRMACRO #ifndef _MHD_INSTRMACRO
@@ -74,47 +74,48 @@
#if defined(HAVE___FUNC__) #if defined(HAVE___FUNC__)
#define externalErrorExit(ignore) \ #define externalErrorExit(ignore) \
_externalErrorExit_func(NULL, __func__, __LINE__) _externalErrorExit_func (NULL, __func__, __LINE__)
#define externalErrorExitDesc(errDesc) \ #define externalErrorExitDesc(errDesc) \
_externalErrorExit_func(errDesc, __func__, __LINE__) _externalErrorExit_func (errDesc, __func__, __LINE__)
#define libcurlErrorExit(ignore) \ #define libcurlErrorExit(ignore) \
_libcurlErrorExit_func(NULL, __func__, __LINE__) _libcurlErrorExit_func (NULL, __func__, __LINE__)
#define libcurlErrorExitDesc(errDesc) \ #define libcurlErrorExitDesc(errDesc) \
_libcurlErrorExit_func(errDesc, __func__, __LINE__) _libcurlErrorExit_func (errDesc, __func__, __LINE__)
#define mhdErrorExit(ignore) \ #define mhdErrorExit(ignore) \
_mhdErrorExit_func(NULL, __func__, __LINE__) _mhdErrorExit_func (NULL, __func__, __LINE__)
#define mhdErrorExitDesc(errDesc) \ #define mhdErrorExitDesc(errDesc) \
_mhdErrorExit_func(errDesc, __func__, __LINE__) _mhdErrorExit_func (errDesc, __func__, __LINE__)
#define checkCURLE_OK(libcurlcall) \ #define checkCURLE_OK(libcurlcall) \
_checkCURLE_OK_func((libcurlcall), _MHD_STRMACRO(libcurlcall), \ _checkCURLE_OK_func ((libcurlcall), _MHD_STRMACRO (libcurlcall), \
__func__, __LINE__) __func__, __LINE__)
#elif defined(HAVE___FUNCTION__) #elif defined(HAVE___FUNCTION__)
#define externalErrorExit(ignore) \ #define externalErrorExit(ignore) \
_externalErrorExit_func(NULL, __FUNCTION__, __LINE__) _externalErrorExit_func (NULL, __FUNCTION__, __LINE__)
#define externalErrorExitDesc(errDesc) \ #define externalErrorExitDesc(errDesc) \
_externalErrorExit_func(errDesc, __FUNCTION__, __LINE__) _externalErrorExit_func (errDesc, __FUNCTION__, __LINE__)
#define libcurlErrorExit(ignore) \ #define libcurlErrorExit(ignore) \
_libcurlErrorExit_func(NULL, __FUNCTION__, __LINE__) _libcurlErrorExit_func (NULL, __FUNCTION__, __LINE__)
#define libcurlErrorExitDesc(errDesc) \ #define libcurlErrorExitDesc(errDesc) \
_libcurlErrorExit_func(errDesc, __FUNCTION__, __LINE__) _libcurlErrorExit_func (errDesc, __FUNCTION__, __LINE__)
#define mhdErrorExit(ignore) \ #define mhdErrorExit(ignore) \
_mhdErrorExit_func(NULL, __FUNCTION__, __LINE__) _mhdErrorExit_func (NULL, __FUNCTION__, __LINE__)
#define mhdErrorExitDesc(errDesc) \ #define mhdErrorExitDesc(errDesc) \
_mhdErrorExit_func(errDesc, __FUNCTION__, __LINE__) _mhdErrorExit_func (errDesc, __FUNCTION__, __LINE__)
#define checkCURLE_OK(libcurlcall) \ #define checkCURLE_OK(libcurlcall) \
_checkCURLE_OK_func((libcurlcall), _MHD_STRMACRO(libcurlcall), \ _checkCURLE_OK_func ((libcurlcall), _MHD_STRMACRO (libcurlcall), \
__FUNCTION__, __LINE__) __FUNCTION__, __LINE__)
#else #else
#define externalErrorExit(ignore) _externalErrorExit_func(NULL, NULL, __LINE__) #define externalErrorExit(ignore) _externalErrorExit_func (NULL, NULL, __LINE__)
#define externalErrorExitDesc(errDesc) \ #define externalErrorExitDesc(errDesc) \
_externalErrorExit_func(errDesc, NULL, __LINE__) _externalErrorExit_func (errDesc, NULL, __LINE__)
#define libcurlErrorExit(ignore) _libcurlErrorExit_func(NULL, NULL, __LINE__) #define libcurlErrorExit(ignore) _libcurlErrorExit_func (NULL, NULL, __LINE__)
#define libcurlErrorExitDesc(errDesc) \ #define libcurlErrorExitDesc(errDesc) \
_libcurlErrorExit_func(errDesc, NULL, __LINE__) _libcurlErrorExit_func (errDesc, NULL, __LINE__)
#define mhdErrorExit(ignore) _mhdErrorExit_func(NULL, NULL, __LINE__) #define mhdErrorExit(ignore) _mhdErrorExit_func (NULL, NULL, __LINE__)
#define mhdErrorExitDesc(errDesc) _mhdErrorExit_func(errDesc, NULL, __LINE__) #define mhdErrorExitDesc(errDesc) _mhdErrorExit_func (errDesc, NULL, __LINE__)
#define checkCURLE_OK(libcurlcall) \ #define checkCURLE_OK(libcurlcall) \
_checkCURLE_OK_func((libcurlcall), _MHD_STRMACRO(libcurlcall), NULL, __LINE__) _checkCURLE_OK_func ((libcurlcall), _MHD_STRMACRO (libcurlcall), NULL, \
__LINE__)
#endif #endif
@@ -388,7 +389,6 @@ ahc_echo (void *cls,
mhdErrorExitDesc ("'userhash_hex' is NOT zero"); mhdErrorExitDesc ("'userhash_hex' is NOT zero");
else if (NULL != creds->userhash_bin) else if (NULL != creds->userhash_bin)
mhdErrorExitDesc ("'userhash_bin' is NOT NULL"); mhdErrorExitDesc ("'userhash_bin' is NOT NULL");
MHD_free (creds);
dinfo = MHD_digest_auth_get_request_info3 (connection); dinfo = MHD_digest_auth_get_request_info3 (connection);
if (NULL == dinfo) if (NULL == dinfo)
@@ -488,6 +488,7 @@ ahc_echo (void *cls,
dinfo->realm); dinfo->realm);
mhdErrorExitDesc ("Wrong 'realm'"); mhdErrorExitDesc ("Wrong 'realm'");
} }
MHD_free (creds);
MHD_free (dinfo); MHD_free (dinfo);
check_res = MHD_digest_auth_check3 (connection, REALM, USERNAME, check_res = MHD_digest_auth_check3 (connection, REALM, USERNAME,