@@ -668,6 +668,63 @@ static int _clientServerSequentialTestConnectCb(void* context,
668668 connected );
669669}
670670
671+ static int _testOutOfBoundsNvmReads (whClientContext * client , whServerContext * server , whNvmId id )
672+ {
673+ uint8_t buffer [WOLFHSM_CFG_COMM_DATA_LEN ];
674+ whNvmMetadata meta ;
675+ whNvmSize off , len ;
676+ int32_t server_rc ;
677+
678+ /* Get object metadata */
679+ WH_TEST_RETURN_ON_FAIL (wh_Client_NvmGetMetadataRequest (client , id ));
680+ WH_TEST_RETURN_ON_FAIL (wh_Server_HandleRequestMessage (server ));
681+ WH_TEST_RETURN_ON_FAIL (wh_Client_NvmGetMetadataResponse (
682+ client , & server_rc , & meta .id , & meta .access , & meta .flags ,
683+ & meta .len , sizeof (meta .label ), meta .label ));
684+ WH_TEST_ASSERT_RETURN (server_rc == WH_ERROR_OK );
685+
686+ /* Try to read len + 1 bytes, should clamp to len */
687+ off = 0 ;
688+ len = meta .len + 1 ;
689+ WH_TEST_RETURN_ON_FAIL (wh_Client_NvmReadRequest (client , id , off , len ));
690+ WH_TEST_RETURN_ON_FAIL (wh_Server_HandleRequestMessage (server ));
691+ WH_TEST_RETURN_ON_FAIL (
692+ wh_Client_NvmReadResponse (client , & server_rc , & len , buffer ));
693+ WH_TEST_ASSERT_RETURN (server_rc == WH_ERROR_OK );
694+ WH_TEST_ASSERT_RETURN (len == meta .len );
695+
696+ /* Try to read len bytes starting at 1 should clamp to len - 1 */
697+ off = 1 ;
698+ len = meta .len ;
699+ WH_TEST_RETURN_ON_FAIL (wh_Client_NvmReadRequest (client , id , off , len ));
700+ WH_TEST_RETURN_ON_FAIL (wh_Server_HandleRequestMessage (server ));
701+ WH_TEST_RETURN_ON_FAIL (
702+ wh_Client_NvmReadResponse (client , & server_rc , & len , buffer ));
703+ WH_TEST_ASSERT_RETURN (server_rc == WH_ERROR_OK );
704+ WH_TEST_ASSERT_RETURN (len == meta .len - 1 );
705+
706+ /* Try to read starting at len - 1 len bytes, should clamp to 1 */
707+ off = meta .len - 1 ;
708+ len = meta .len ;
709+ WH_TEST_RETURN_ON_FAIL (wh_Client_NvmReadRequest (client , id , off , len ));
710+ WH_TEST_RETURN_ON_FAIL (wh_Server_HandleRequestMessage (server ));
711+ WH_TEST_RETURN_ON_FAIL (
712+ wh_Client_NvmReadResponse (client , & server_rc , & len , buffer ));
713+ WH_TEST_ASSERT_RETURN (server_rc == WH_ERROR_OK );
714+ WH_TEST_ASSERT_RETURN (len == 1 );
715+
716+ /* Try to read starting at len, should fail */
717+ off = meta .len ;
718+ len = 0 ;
719+ WH_TEST_RETURN_ON_FAIL (wh_Client_NvmReadRequest (client , id , off , len ));
720+ WH_TEST_RETURN_ON_FAIL (wh_Server_HandleRequestMessage (server ));
721+ WH_TEST_RETURN_ON_FAIL (
722+ wh_Client_NvmReadResponse (client , & server_rc , & len , buffer ));
723+ WH_TEST_ASSERT_RETURN (server_rc == WH_ERROR_BADARGS );
724+
725+ return WH_ERROR_OK ;
726+ }
727+
671728int whTest_ClientServerSequential (void )
672729{
673730 int ret = 0 ;
@@ -1015,6 +1072,9 @@ int whTest_ClientServerSequential(void)
10151072 WH_TEST_ASSERT_RETURN (0 == memcmp (send_buffer , recv_buffer , len ));
10161073 }
10171074
1075+ /* Perform out-of-bounds read tests on first object written */
1076+ WH_TEST_RETURN_ON_FAIL (_testOutOfBoundsNvmReads (client , server , 20 ));
1077+
10181078 whNvmAccess list_access = WH_NVM_ACCESS_ANY ;
10191079 whNvmFlags list_flags = WH_NVM_FLAGS_NONE ;
10201080 whNvmId list_id = 0 ;
0 commit comments