@@ -1255,6 +1255,20 @@ static int SetListString(char** dst, const char* value, int valueSz,
12551255 return ret ;
12561256}
12571257
1258+ /* CA trust sources are loaded once at startup from the global config; a
1259+ * Match-scoped setting would be silently ignored at authentication time.
1260+ * Reject such options at parse time instead of failing open. Returns
1261+ * WS_SUCCESS when conf is the global config. */
1262+ static int CheckNotInMatch (const WOLFSSHD_CONFIG * conf , const char * option )
1263+ {
1264+ if (conf -> usrAppliesTo != NULL || conf -> groupAppliesTo != NULL ) {
1265+ wolfSSH_Log (WS_LOG_ERROR ,
1266+ "[SSHD] Option %s is not supported inside a Match block" , option );
1267+ return WS_BAD_ARGUMENT ;
1268+ }
1269+ return WS_SUCCESS ;
1270+ }
1271+
12581272/* returns WS_SUCCESS on success */
12591273/* NOLINTNEXTLINE(misc-no-recursion): bounded by WOLFSSHD_MAX_INCLUDE_DEPTH */
12601274static int HandleConfigOption (WOLFSSHD_CONFIG * * conf , int opt ,
@@ -1346,7 +1360,9 @@ static int HandleConfigOption(WOLFSSHD_CONFIG** conf, int opt,
13461360 ret = wolfSSHD_ConfigSetUserCAKeysFile (* conf , value );
13471361 break ;
13481362 case OPT_TRUSTED_SYSTEM_CA_KEYS :
1349- ret = wolfSSHD_ConfigSetSystemCA (* conf , value );
1363+ ret = CheckNotInMatch (* conf , "wolfSSH_TrustedSystemCAKeys" );
1364+ if (ret == WS_SUCCESS )
1365+ ret = wolfSSHD_ConfigSetSystemCA (* conf , value );
13501366 break ;
13511367 case OPT_PIDFILE :
13521368 ret = SetFileString (& (* conf )-> pidFile , value , (* conf )-> heap );
@@ -1358,17 +1374,25 @@ static int HandleConfigOption(WOLFSSHD_CONFIG** conf, int opt,
13581374 ret = HandleStrictModes (* conf , value );
13591375 break ;
13601376 case OPT_TRUSTED_USER_CA_STORE :
1361- ret = wolfSSHD_ConfigSetUserCAStore (* conf , value );
1377+ ret = CheckNotInMatch (* conf , "wolfSSH_TrustedUserCAStore" );
1378+ if (ret == WS_SUCCESS )
1379+ ret = wolfSSHD_ConfigSetUserCAStore (* conf , value );
13621380 break ;
13631381 #ifdef USE_WINDOWS_API
13641382 case OPT_WIN_USER_STORES :
1365- ret = wolfSSHD_ConfigSetWinUserStores (* conf , value );
1383+ ret = CheckNotInMatch (* conf , "wolfSSH_WinUserStores" );
1384+ if (ret == WS_SUCCESS )
1385+ ret = wolfSSHD_ConfigSetWinUserStores (* conf , value );
13661386 break ;
13671387 case OPT_WIN_USER_DW_FLAGS :
1368- ret = wolfSSHD_ConfigSetWinUserDwFlags (* conf , value );
1388+ ret = CheckNotInMatch (* conf , "wolfSSH_WinUserDwFlags" );
1389+ if (ret == WS_SUCCESS )
1390+ ret = wolfSSHD_ConfigSetWinUserDwFlags (* conf , value );
13691391 break ;
13701392 case OPT_WIN_USER_PV_PARA :
1371- ret = wolfSSHD_ConfigSetWinUserPvPara (* conf , value );
1393+ ret = CheckNotInMatch (* conf , "wolfSSH_WinUserPvPara" );
1394+ if (ret == WS_SUCCESS )
1395+ ret = wolfSSHD_ConfigSetWinUserPvPara (* conf , value );
13721396 break ;
13731397 #endif /* USE_WINDOWS_API */
13741398 case OPT_AUTHORIZED_UPN_DOMAINS :
@@ -1384,7 +1408,9 @@ static int HandleConfigOption(WOLFSSHD_CONFIG** conf, int opt,
13841408 case OPT_HOST_KEY_STORE_SUBJECT :
13851409 wolfSSH_Log (WS_LOG_INFO ,
13861410 "[SSHD] Parsed HostKeyStoreSubject = '%s'" , value );
1387- ret = SetFileString (& (* conf )-> hostKeyStoreSubject , value ,
1411+ /* use the full line remainder so a CN containing spaces is
1412+ * kept instead of being cut at the first token */
1413+ ret = SetListString (& (* conf )-> hostKeyStoreSubject , full , fullSz ,
13881414 (* conf )-> heap );
13891415 break ;
13901416 case OPT_HOST_KEY_STORE_FLAGS :
0 commit comments