| @@ -210,8 +210,12 @@ namespace | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| OSCBundle readBundle() | |||||
| OSCBundle readBundle (size_t maxBytesToRead = std::numeric_limits<size_t>::max()) | |||||
| { | { | ||||
| // maxBytesToRead is only passed in here in case this bundle is a nested | |||||
| // bundle, so we know when to consider the next element *not* part of this | |||||
| // bundle anymore (but part of the outer bundle) and return. | |||||
| if (input.getNumBytesRemaining() < 16) | if (input.getNumBytesRemaining() < 16) | ||||
| throw OSCFormatError ("OSC input stream exhausted while reading bundle"); | throw OSCFormatError ("OSC input stream exhausted while reading bundle"); | ||||
| @@ -220,9 +224,18 @@ namespace | |||||
| OSCBundle bundle (readTimeTag()); | OSCBundle bundle (readTimeTag()); | ||||
| while (! isExhausted()) | |||||
| size_t bytesRead = 16; // already read "#bundle" and timeTag | |||||
| size_t pos = getPosition(); | |||||
| while (! isExhausted() && bytesRead < maxBytesToRead) | |||||
| { | |||||
| bundle.addElement (readElement()); | bundle.addElement (readElement()); | ||||
| const size_t newPos = getPosition(); | |||||
| bytesRead += newPos - pos; | |||||
| pos = newPos; | |||||
| } | |||||
| return bundle; | return bundle; | ||||
| } | } | ||||
| @@ -274,7 +287,9 @@ namespace | |||||
| OSCBundle readBundleWithCheckedSize (size_t size) | OSCBundle readBundleWithCheckedSize (size_t size) | ||||
| { | { | ||||
| const size_t begin = (size_t) getPosition(); | const size_t begin = (size_t) getPosition(); | ||||
| OSCBundle bundle (readBundle()); | |||||
| const size_t maxBytesToRead = size - 4; // we've already read 4 bytes (the bundle size) | |||||
| OSCBundle bundle (readBundle (maxBytesToRead)); | |||||
| if (getPosition() - begin != size) | if (getPosition() - begin != size) | ||||
| throw OSCFormatError ("OSC input stream format error: wrong element content size encountered while reading"); | throw OSCFormatError ("OSC input stream format error: wrong element content size encountered while reading"); | ||||