IO fault injection for OTA packages
Bug: 25951086 Change-Id: I31c74c735eb7a975b7f41fe2b2eff042e5699c0c
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
#include "mtdutils/mtdutils.h"
|
||||
#include "edify/expr.h"
|
||||
#include "print_sha1.h"
|
||||
#include "otafault/ota_io.h"
|
||||
|
||||
static int LoadPartitionContents(const char* filename, FileContents* file);
|
||||
static ssize_t FileSink(const unsigned char* data, ssize_t len, void* token);
|
||||
@@ -69,7 +70,7 @@ int LoadFileContents(const char* filename, FileContents* file) {
|
||||
file->size = file->st.st_size;
|
||||
file->data = reinterpret_cast<unsigned char*>(malloc(file->size));
|
||||
|
||||
FILE* f = fopen(filename, "rb");
|
||||
FILE* f = ota_fopen(filename, "rb");
|
||||
if (f == NULL) {
|
||||
printf("failed to open \"%s\": %s\n", filename, strerror(errno));
|
||||
free(file->data);
|
||||
@@ -77,14 +78,14 @@ int LoadFileContents(const char* filename, FileContents* file) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
size_t bytes_read = fread(file->data, 1, file->size, f);
|
||||
size_t bytes_read = ota_fread(file->data, 1, file->size, f);
|
||||
if (bytes_read != static_cast<size_t>(file->size)) {
|
||||
printf("short read of \"%s\" (%zu bytes of %zd)\n", filename, bytes_read, file->size);
|
||||
free(file->data);
|
||||
file->data = NULL;
|
||||
return -1;
|
||||
}
|
||||
fclose(f);
|
||||
ota_fclose(f);
|
||||
|
||||
SHA_hash(file->data, file->size, file->sha1);
|
||||
return 0;
|
||||
@@ -173,7 +174,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
|
||||
}
|
||||
|
||||
case EMMC:
|
||||
dev = fopen(partition, "rb");
|
||||
dev = ota_fopen(partition, "rb");
|
||||
if (dev == NULL) {
|
||||
printf("failed to open emmc partition \"%s\": %s\n", partition, strerror(errno));
|
||||
return -1;
|
||||
@@ -202,7 +203,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
|
||||
break;
|
||||
|
||||
case EMMC:
|
||||
read = fread(p, 1, next, dev);
|
||||
read = ota_fread(p, 1, next, dev);
|
||||
break;
|
||||
}
|
||||
if (next != read) {
|
||||
@@ -247,7 +248,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
|
||||
break;
|
||||
|
||||
case EMMC:
|
||||
fclose(dev);
|
||||
ota_fclose(dev);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -277,7 +278,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
|
||||
// Save the contents of the given FileContents object under the given
|
||||
// filename. Return 0 on success.
|
||||
int SaveFileContents(const char* filename, const FileContents* file) {
|
||||
int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR);
|
||||
int fd = ota_open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR);
|
||||
if (fd < 0) {
|
||||
printf("failed to open \"%s\" for write: %s\n", filename, strerror(errno));
|
||||
return -1;
|
||||
@@ -287,14 +288,14 @@ int SaveFileContents(const char* filename, const FileContents* file) {
|
||||
if (bytes_written != file->size) {
|
||||
printf("short write of \"%s\" (%zd bytes of %zd) (%s)\n",
|
||||
filename, bytes_written, file->size, strerror(errno));
|
||||
close(fd);
|
||||
ota_close(fd);
|
||||
return -1;
|
||||
}
|
||||
if (fsync(fd) != 0) {
|
||||
if (ota_fsync(fd) != 0) {
|
||||
printf("fsync of \"%s\" failed: %s\n", filename, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if (close(fd) != 0) {
|
||||
if (ota_close(fd) != 0) {
|
||||
printf("close of \"%s\" failed: %s\n", filename, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
@@ -377,7 +378,7 @@ int WriteToPartition(unsigned char* data, size_t len, const char* target) {
|
||||
case EMMC: {
|
||||
size_t start = 0;
|
||||
bool success = false;
|
||||
int fd = open(partition, O_RDWR | O_SYNC);
|
||||
int fd = ota_open(partition, O_RDWR | O_SYNC);
|
||||
if (fd < 0) {
|
||||
printf("failed to open %s: %s\n", partition, strerror(errno));
|
||||
return -1;
|
||||
@@ -392,22 +393,22 @@ int WriteToPartition(unsigned char* data, size_t len, const char* target) {
|
||||
size_t to_write = len - start;
|
||||
if (to_write > 1<<20) to_write = 1<<20;
|
||||
|
||||
ssize_t written = TEMP_FAILURE_RETRY(write(fd, data+start, to_write));
|
||||
ssize_t written = TEMP_FAILURE_RETRY(ota_write(fd, data+start, to_write));
|
||||
if (written == -1) {
|
||||
printf("failed write writing to %s: %s\n", partition, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
start += written;
|
||||
}
|
||||
if (fsync(fd) != 0) {
|
||||
if (ota_fsync(fd) != 0) {
|
||||
printf("failed to sync to %s (%s)\n", partition, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if (close(fd) != 0) {
|
||||
if (ota_close(fd) != 0) {
|
||||
printf("failed to close %s (%s)\n", partition, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
fd = open(partition, O_RDONLY);
|
||||
fd = ota_open(partition, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
printf("failed to reopen %s for verify (%s)\n", partition, strerror(errno));
|
||||
return -1;
|
||||
@@ -416,13 +417,13 @@ int WriteToPartition(unsigned char* data, size_t len, const char* target) {
|
||||
// Drop caches so our subsequent verification read
|
||||
// won't just be reading the cache.
|
||||
sync();
|
||||
int dc = open("/proc/sys/vm/drop_caches", O_WRONLY);
|
||||
if (TEMP_FAILURE_RETRY(write(dc, "3\n", 2)) == -1) {
|
||||
int dc = ota_open("/proc/sys/vm/drop_caches", O_WRONLY);
|
||||
if (TEMP_FAILURE_RETRY(ota_write(dc, "3\n", 2)) == -1) {
|
||||
printf("write to /proc/sys/vm/drop_caches failed: %s\n", strerror(errno));
|
||||
} else {
|
||||
printf(" caches dropped\n");
|
||||
}
|
||||
close(dc);
|
||||
ota_close(dc);
|
||||
sleep(1);
|
||||
|
||||
// verify
|
||||
@@ -442,7 +443,7 @@ int WriteToPartition(unsigned char* data, size_t len, const char* target) {
|
||||
size_t so_far = 0;
|
||||
while (so_far < to_read) {
|
||||
ssize_t read_count =
|
||||
TEMP_FAILURE_RETRY(read(fd, buffer+so_far, to_read-so_far));
|
||||
TEMP_FAILURE_RETRY(ota_read(fd, buffer+so_far, to_read-so_far));
|
||||
if (read_count == -1) {
|
||||
printf("verify read error %s at %zu: %s\n",
|
||||
partition, p, strerror(errno));
|
||||
@@ -474,7 +475,7 @@ int WriteToPartition(unsigned char* data, size_t len, const char* target) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (close(fd) != 0) {
|
||||
if (ota_close(fd) != 0) {
|
||||
printf("error closing %s (%s)\n", partition, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
@@ -584,7 +585,7 @@ ssize_t FileSink(const unsigned char* data, ssize_t len, void* token) {
|
||||
ssize_t done = 0;
|
||||
ssize_t wrote;
|
||||
while (done < len) {
|
||||
wrote = TEMP_FAILURE_RETRY(write(fd, data+done, len-done));
|
||||
wrote = TEMP_FAILURE_RETRY(ota_write(fd, data+done, len-done));
|
||||
if (wrote == -1) {
|
||||
printf("error writing %zd bytes: %s\n", (len-done), strerror(errno));
|
||||
return done;
|
||||
@@ -944,7 +945,7 @@ static int GenerateTarget(FileContents* source_file,
|
||||
strcpy(outname, target_filename);
|
||||
strcat(outname, ".patch");
|
||||
|
||||
output = open(outname, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR);
|
||||
output = ota_open(outname, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR);
|
||||
if (output < 0) {
|
||||
printf("failed to open output file %s: %s\n",
|
||||
outname, strerror(errno));
|
||||
@@ -975,11 +976,11 @@ static int GenerateTarget(FileContents* source_file,
|
||||
}
|
||||
|
||||
if (output >= 0) {
|
||||
if (fsync(output) != 0) {
|
||||
if (ota_fsync(output) != 0) {
|
||||
printf("failed to fsync file \"%s\" (%s)\n", outname, strerror(errno));
|
||||
result = 1;
|
||||
}
|
||||
if (close(output) != 0) {
|
||||
if (ota_close(output) != 0) {
|
||||
printf("failed to close file \"%s\" (%s)\n", outname, strerror(errno));
|
||||
result = 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user