Description
Description
- Type: Bug
- Priority: Major
Bug
Target
All
Toolchain:
Any (tested on GCC_ARM)
Toolchain version:
Any (tested on 6-2017-q1-update/ARM/embedded-6-branch revision 245512)
mbed-cli version:
1.1.1
mbed-os sha:
1af8aef
Expected behavior
Stream::write(const void* buffer, size_t length)
should return value as specified on mbed::Stream Class Reference
""
Returns
The number of characters written (possibly 0) on success, -1 on error.
""
Actual behavior
Stream::write
will return 0 only if length is 0. Otherwise, independent of success or failure of _putc
call, const char* ptr
is always incremented and return value (return ptr - (const char*)buffer;
) will be at least 1 (even if __putc
fails - returns EOF
- for first character).
Steps to reproduce
Check return status of Stream::putc(int c)
on uninitialized stream (for example disconnected USB or uninitialized UART).
Current code:
ssize_t Stream::write(const void* buffer, size_t length) {
const char* ptr = (const char*)buffer;
const char* end = ptr + length;
lock();
while (ptr != end) {
if (_putc(*ptr++) == EOF) {
break;
}
}
unlock();
return ptr - (const char*)buffer;
}
Proposed fix:
ssize_t Stream::write(const void* buffer, size_t length) {
const char* ptr = (const char*)buffer;
const char* end = ptr + length;
lock();
while (ptr != end) {
if (_putc(*ptr) == EOF) {
break;
}
ptr++; // ptr is incremented only on __putc success
}
unlock();
return ptr - (const char*)buffer;
}