Skip to content

Stream::write always returns at least 1 #4716

Closed
@marogi

Description

@marogi

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;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions