Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 639e93ee authored by Keith Mok's avatar Keith Mok
Browse files

Improper EINTR handling logic

When EINTR received,
we should just continue the loop
without update the byte counte and pointer
Use TEMP_FAILURE_RETRY for that

Test: CtsPrintTestCases
Bug: 206810144
Change-Id: Ia8b580ed0e3af00e9a2afefe554b81cbe014054b
parent 5f91507b
Loading
Loading
Loading
Loading
+8 −13
Original line number Original line Diff line number Diff line
@@ -30,11 +30,8 @@ static bool writeAllBytes(const int fd, void* buffer, const size_t byteCount) {
    char* writeBuffer = static_cast<char*>(buffer);
    char* writeBuffer = static_cast<char*>(buffer);
    size_t remainingBytes = byteCount;
    size_t remainingBytes = byteCount;
    while (remainingBytes > 0) {
    while (remainingBytes > 0) {
        ssize_t writtenByteCount = write(fd, writeBuffer, remainingBytes);
        ssize_t writtenByteCount = TEMP_FAILURE_RETRY(write(fd, writeBuffer, remainingBytes));
        if (writtenByteCount == -1) {
        if (writtenByteCount == -1) {
            if (errno == EINTR) {
                continue;
            }
            __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
            __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
                    "Error writing to buffer: %d", errno);
                    "Error writing to buffer: %d", errno);
            return false;
            return false;
@@ -49,19 +46,17 @@ static bool readAllBytes(const int fd, void* buffer, const size_t byteCount) {
    char* readBuffer = static_cast<char*>(buffer);
    char* readBuffer = static_cast<char*>(buffer);
    size_t remainingBytes = byteCount;
    size_t remainingBytes = byteCount;
    while (remainingBytes > 0) {
    while (remainingBytes > 0) {
        ssize_t readByteCount = read(fd, readBuffer, remainingBytes);
        ssize_t readByteCount = TEMP_FAILURE_RETRY(read(fd, readBuffer, remainingBytes));

        remainingBytes -= readByteCount;
        readBuffer += readByteCount;

        if (readByteCount == -1) {
        if (readByteCount == -1) {
            if (errno == EINTR) {
                continue;
            }
            __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
            __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
                    "Error reading from buffer: %d", errno);
                    "Error reading from buffer: %d", errno);
            return false;
            return false;
        } else if (readByteCount == 0 && remainingBytes > 0) {
        }

        remainingBytes -= readByteCount;
        readBuffer += readByteCount;

        if (readByteCount == 0 && remainingBytes > 0) {
            __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
            __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,
                    "File closed before all bytes were read. %zu/%zu remaining", remainingBytes,
                    "File closed before all bytes were read. %zu/%zu remaining", remainingBytes,
                    byteCount);
                    byteCount);