mirror of
https://github.com/rsyslog/rsyslog.git
synced 2025-12-17 04:40:43 +01:00
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:
parent
01c5c33896
commit
35710d4716
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user