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

Commit 71e182bc authored by Tianjie Xu's avatar Tianjie Xu
Browse files

Check an edge case when read(2) returns 0

We might end up in an infinite loop if read(2) reached EOF unexpectedly.
The problematic code in uncrypt mentioned in the bug has been fixed
by switching to libbase ReadFully(). So I grepped through the recovery
code and fixed some other occurences of the issue.

Bug: 31073201
Change-Id: Ib867029158ba23363b8f85d61c25058a635c5a6b
parent 81839486
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -336,6 +336,9 @@ int WriteToPartition(const unsigned char* data, size_t len, const char* target)
                    printf("verify read error %s at %zu: %s\n",
                           partition, p, strerror(errno));
                    return -1;
                } else if (read_count == 0) {
                    printf("verify read reached unexpected EOF, %s at %zu\n", partition, p);
                    return -1;
                }
                if (static_cast<size_t>(read_count) < to_read) {
                    printf("short verify read %s at %zu: %zd %zu %s\n",
+5 −8
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
#include <unistd.h>
#include <fcntl.h>

#include <android-base/file.h>

#include "fuse_sideload.h"

struct file_data {
@@ -41,15 +43,10 @@ static int read_block_file(void* cookie, uint32_t block, uint8_t* buffer, uint32
        return -EIO;
    }

    while (fetch_size > 0) {
        ssize_t r = TEMP_FAILURE_RETRY(read(fd->fd, buffer, fetch_size));
        if (r == -1) {
    if (!android::base::ReadFully(fd->fd, buffer, fetch_size)) {
        fprintf(stderr, "read on sdcard failed: %s\n", strerror(errno));
        return -EIO;
    }
        fetch_size -= r;
        buffer += r;
    }

    return 0;
}
+4 −0
Original line number Diff line number Diff line
@@ -151,6 +151,10 @@ static int read_all(int fd, uint8_t* data, size_t size) {
            failure_type = kFreadFailure;
            fprintf(stderr, "read failed: %s\n", strerror(errno));
            return -1;
        } else if (r == 0) {
            failure_type = kFreadFailure;
            fprintf(stderr, "read reached unexpected EOF.\n");
            return -1;
        }
        so_far += r;
    }