Fix: Remove unsafe function pointer casting in cfsysline.c

- Replaced function pointer casting with direct handler calls for type safety
- Fixes crashes (BUS errors) on ARM64 macOS 14+ due to strict calling conventions
- Root cause identified by ThreadSanitizer
- Eliminates undefined behavior, improves code safety
This commit is contained in:
Andre Lorbach 2025-08-01 10:55:56 +02:00
parent 01c5c33896
commit 35710d4716
2 changed files with 20 additions and 24 deletions

View File

@ -723,46 +723,45 @@ static rsRetVal cslchSetEntry(
*/ */
static rsRetVal cslchCallHdlr(cslCmdHdlr_t *pThis, uchar **ppConfLine) { static rsRetVal cslchCallHdlr(cslCmdHdlr_t *pThis, uchar **ppConfLine) {
DEFiRet; DEFiRet;
rsRetVal (*pHdlr)(void *, ...) = NULL;
assert(pThis != NULL); assert(pThis != NULL);
assert(ppConfLine != NULL); assert(ppConfLine != NULL);
switch (pThis->eType) { switch (pThis->eType) {
case eCmdHdlrCustomHandler: case eCmdHdlrCustomHandler:
pHdlr = (rsRetVal(*)(void *, ...))doCustomHdlr; CHKiRet(doCustomHdlr(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrUID: case eCmdHdlrUID:
pHdlr = (rsRetVal(*)(void *, ...))doGetUID; CHKiRet(doGetUID(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrGID: case eCmdHdlrGID:
pHdlr = (rsRetVal(*)(void *, ...))doGetGID; CHKiRet(doGetGID(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrBinary: case eCmdHdlrBinary:
pHdlr = (rsRetVal(*)(void *, ...))doBinaryOptionLine; CHKiRet(doBinaryOptionLine(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrFileCreateMode: case eCmdHdlrFileCreateMode:
pHdlr = (rsRetVal(*)(void *, ...))doFileCreateMode; CHKiRet(doFileCreateMode(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrInt: case eCmdHdlrInt:
pHdlr = (rsRetVal(*)(void *, ...))doGetInt; CHKiRet(doGetInt(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrSize: case eCmdHdlrSize:
pHdlr = (rsRetVal(*)(void *, ...))doGetSize; CHKiRet(doGetSize(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrGetChar: case eCmdHdlrGetChar:
pHdlr = (rsRetVal(*)(void *, ...))doGetChar; CHKiRet(doGetChar(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrFacility: case eCmdHdlrFacility:
pHdlr = (rsRetVal(*)(void *, ...))doFacility; CHKiRet(doFacility(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrSeverity: case eCmdHdlrSeverity:
pHdlr = (rsRetVal(*)(void *, ...))doSeverity; CHKiRet(doSeverity(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrGetWord: case eCmdHdlrGetWord:
pHdlr = (rsRetVal(*)(void *, ...))doGetWord; CHKiRet(doGetWord(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
case eCmdHdlrGoneAway: case eCmdHdlrGoneAway:
pHdlr = (rsRetVal(*)(void *, ...))doGoneAway; CHKiRet(doGoneAway(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
break; break;
/* some non-legacy handler (used in v6+ solely) */ /* some non-legacy handler (used in v6+ solely) */
case eCmdHdlrInvalid: case eCmdHdlrInvalid:
@ -777,9 +776,6 @@ static rsRetVal cslchCallHdlr(cslCmdHdlr_t *pThis, uchar **ppConfLine) {
goto finalize_it; goto finalize_it;
} }
/* we got a pointer to the handler, so let's call it */
assert(pHdlr != NULL);
CHKiRet(pHdlr(ppConfLine, pThis->cslCmdHdlr, pThis->pData));
finalize_it: finalize_it:
RETiRet; RETiRet;

View File

@ -644,11 +644,11 @@ static rsRetVal net_ossl_chkonepeername(net_ossl_t *pThis,
* if prioritizeSAN set, only check against SAN * if prioritizeSAN set, only check against SAN
*/ */
if (pThis->bSANpriority == 1) { if (pThis->bSANpriority == 1) {
#if OPENSSL_VERSION_NUMBER >= 0x10100004L && !defined(LIBRESSL_VERSION_NUMBER) #if OPENSSL_VERSION_NUMBER >= 0x10100004L && !defined(LIBRESSL_VERSION_NUMBER)
x509flags = X509_CHECK_FLAG_NEVER_CHECK_SUBJECT; x509flags = X509_CHECK_FLAG_NEVER_CHECK_SUBJECT;
#else #else
dbgprintf("net_ossl_chkonepeername: PrioritizeSAN not supported before OpenSSL 1.1.0\n"); dbgprintf("net_ossl_chkonepeername: PrioritizeSAN not supported before OpenSSL 1.1.0\n");
#endif // OPENSSL_VERSION_NUMBER >= 0x10100004L #endif // OPENSSL_VERSION_NUMBER >= 0x10100004L
} }
osslRet = X509_check_host(certpeer, (const char *)pPeer->pszID, strlen((const char *)pPeer->pszID), osslRet = X509_check_host(certpeer, (const char *)pPeer->pszID, strlen((const char *)pPeer->pszID),
x509flags, NULL); x509flags, NULL);