Skip to content

Commit 34c3665

Browse files
Return void* and drop nul internal nul termination
1 parent f69d84c commit 34c3665

File tree

6 files changed

+21
-13
lines changed

6 files changed

+21
-13
lines changed

SilKit/IntegrationTests/Hourglass/MockCapi.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ extern "C"
769769
return globalCapi->SilKit_Participant_GetLogger(outLogger, participant);
770770
}
771771

772-
SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParameter(char* outParameterValue,
772+
SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParameter(void* outParameterValue,
773773
size_t* inOutParameterValueSize,
774774
SilKit_Parameter parameter,
775775
SilKit_Participant* participant)

SilKit/IntegrationTests/Hourglass/MockCapi.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ class MockCapi
408408
(SilKit_Logger * *outLogger, SilKit_Participant* participant));
409409

410410
MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetParameter,
411-
(char* outParameterValue, size_t* outParameterValueSize, SilKit_Parameter parameter,
411+
(void* outParameterValue, size_t* outParameterValueSize, SilKit_Parameter parameter,
412412
SilKit_Participant* participant));
413413

414414
// ParticipantConfiguration

SilKit/include/silkit/capi/Participant.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,12 @@ typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetLogger_t)(SilKit_Log
7676
* Returns the current value of the given parameter.
7777
* Useful for parameters that are passed to the participant via the API and the participant configuration.
7878
*/
79-
SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParameter(char* outParameterValue,
79+
SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParameter(void* outParameterValue,
8080
size_t* inOutParameterValueSize,
8181
SilKit_Parameter parameter,
8282
SilKit_Participant* participant);
8383

84-
typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetParameter_t)(char* outParameterValue,
84+
typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetParameter_t)(void* outParameterValue,
8585
size_t* inOutParameterValueSize,
8686
SilKit_Parameter parameter,
8787
SilKit_Participant* participant);

SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,23 @@ auto ParameterProvider::GetParameter(SilKit_Participant* participant, Parameter
4646
std::vector<char> buffer;
4747
size_t size = 0;
4848
SilKit_Parameter cParameter = static_cast<SilKit_Parameter>(parameter);
49+
50+
// Query the size by passing nullptr for the outParameterValue
4951
{
5052
const auto returnCode = SilKit_Participant_GetParameter(nullptr, &size, cParameter, participant);
5153
ThrowOnError(returnCode);
5254
}
55+
56+
// Loop as the size might changed intermediately
5357
while (size > buffer.size())
5458
{
5559
buffer.resize(size);
5660
const auto returnCode = SilKit_Participant_GetParameter(buffer.data(), &size, cParameter, participant);
5761
ThrowOnError(returnCode);
5862
}
59-
buffer.resize(size);
63+
64+
// Value-initialized to nul
65+
buffer.resize(size + 1);
6066

6167
return std::string{buffer.data()};
6268
}

SilKit/source/capi/CapiParticipant.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ try
8686
}
8787
CAPI_CATCH_EXCEPTIONS
8888

89-
SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParameter(char* outParameterValue, size_t* inOutParameterValueSize,
89+
SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParameter(void* outParameterValue, size_t* inOutParameterValueSize,
9090
SilKit_Parameter parameter,
9191
SilKit_Participant* participant)
9292
try
@@ -102,20 +102,19 @@ try
102102
if (outParameterValue != nullptr)
103103
{
104104
size_t sizeToCopy;
105-
if (*inOutParameterValueSize >= parameterValue.size() + 1)
105+
if (*inOutParameterValueSize > parameterValue.size())
106106
{
107107
// Don't copy more than we actually have
108108
sizeToCopy = parameterValue.size();
109109
}
110110
else
111111
{
112112
// Don't copy more than the given size
113-
sizeToCopy = *inOutParameterValueSize - 1;
113+
sizeToCopy = *inOutParameterValueSize;
114114
}
115-
parameterValue.copy(outParameterValue, sizeToCopy);
116-
outParameterValue[sizeToCopy] = '\0';
115+
parameterValue.copy(static_cast<char*>(outParameterValue), sizeToCopy);
117116
}
118-
*inOutParameterValueSize = parameterValue.size() + 1;
117+
*inOutParameterValueSize = parameterValue.size();
119118
return SilKit_ReturnCode_SUCCESS;
120119
}
121120
CAPI_CATCH_EXCEPTIONS

SilKit/source/capi/Test_CapiGetParameter.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-FileCopyrightText: 2024 Vector Informatik GmbH
22
//
33
// SPDX-License-Identifier: MIT
4+
45
#include "gtest/gtest.h"
56
#include "gmock/gmock.h"
67
#include "silkit/capi/SilKit.h"
@@ -31,8 +32,10 @@ TEST_F(Test_CapiGetParameter, getparameter_bad_params)
3132
char* parameterValue{nullptr};
3233
size_t parameterSize;
3334

34-
returnCode =
35-
SilKit_Participant_GetParameter(nullptr, &parameterSize, SilKit_Parameter_ParticipantName, cMockParticipant);
35+
EXPECT_CALL(mockParticipant, GetParameter(SilKit::Parameter::ParticipantName)).Times(testing::Exactly(1));
36+
37+
returnCode = SilKit_Participant_GetParameter(nullptr, &parameterSize, SilKit_Parameter_ParticipantName,
38+
cMockParticipant);
3639
EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS);
3740

3841
returnCode =

0 commit comments

Comments
 (0)