Skip to content

Commit 1340ee6

Browse files
committed
Null terminate and add outbuf size
1 parent 3fabbcc commit 1340ee6

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

src/controller/python/ChipDeviceController-Discovery.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ bool pychip_DeviceController_GetIPForDiscoveredDevice(Controller::DeviceCommissi
191191
return false;
192192
}
193193

194-
PyChipError pychip_CreateManualCode(uint16_t longDiscriminator, uint32_t passcode, char * manualCodeBuffer, size_t bufsize)
194+
PyChipError pychip_CreateManualCode(uint16_t longDiscriminator, uint32_t passcode, char * manualCodeBuffer, size_t inBufSize, size_t* outBufSize)
195195
{
196196
SetupPayload payload;
197197
SetupDiscriminator discriminator;
@@ -200,11 +200,16 @@ PyChipError pychip_CreateManualCode(uint16_t longDiscriminator, uint32_t passcod
200200
payload.setUpPINCode = passcode;
201201
std::string setupManualCode;
202202

203+
*outBufSize = 0;
203204
CHIP_ERROR err = ManualSetupPayloadGenerator(payload).payloadDecimalStringRepresentation(setupManualCode);
204-
if (err == CHIP_NO_ERROR)
205-
{
206-
MutableCharSpan span(manualCodeBuffer, bufsize);
207-
CopyCharSpanToMutableCharSpan(CharSpan(setupManualCode.c_str(), setupManualCode.length()), span);
205+
if (err == CHIP_NO_ERROR) {
206+
MutableCharSpan span(manualCodeBuffer, inBufSize);
207+
// Plus 1 so we copy the null terminator
208+
CopyCharSpanToMutableCharSpan(CharSpan(setupManualCode.c_str(), setupManualCode.length()+1), span);
209+
*outBufSize = span.size();
210+
if (*outBufSize == 0) {
211+
err == CHIP_ERROR_NO_MEMORY;
212+
}
208213
}
209214

210215
return ToPyChipError(err);

src/controller/python/chip/ChipDeviceCtrl.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -1714,11 +1714,14 @@ def InitGroupTestingData(self):
17141714
def CreateManualCode(self, discriminator: int, passcode: int) -> str:
17151715
""" Creates a standard flow manual code from the given discriminator and passcode."""
17161716
# 64 bytes is WAY more than required, but let's be safe
1717-
size = 64
1718-
buf = create_string_buffer(size)
1717+
in_size = 64
1718+
out_size = c_size_t(0)
1719+
buf = create_string_buffer(in_size)
17191720
self._ChipStack.Call(
1720-
lambda: self._dmLib.pychip_CreateManualCode(discriminator, passcode, buf, size)
1721+
lambda: self._dmLib.pychip_CreateManualCode(discriminator, passcode, buf, in_size, pointer(out_size))
17211722
).raise_on_error()
1723+
if out_size.value == 0 or out_size.value > in_size:
1724+
raise MemoryError("Invalid output size for manual code")
17221725
return buf.value.decode()
17231726

17241727
# ----- Private Members -----
@@ -1949,7 +1952,7 @@ def _InitLib(self):
19491952
self._dmLib.pychip_DeviceProxy_GetRemoteSessionParameters.argtypes = [c_void_p, c_char_p]
19501953

19511954
self._dmLib.pychip_CreateManualCode.restype = PyChipError
1952-
self._dmLib.pychip_CreateManualCode.argtypes = [c_uint16, c_uint32, c_char_p, c_size_t]
1955+
self._dmLib.pychip_CreateManualCode.argtypes = [c_uint16, c_uint32, c_char_p, c_size_t, POINTER(c_size_t)]
19531956

19541957

19551958
class ChipDeviceController(ChipDeviceControllerBase):

0 commit comments

Comments
 (0)