linux-sgx: Use non-destructive modes for opening files using SGX IPFS (#1645)

Refer to https://github.com/bytecodealliance/wasm-micro-runtime/pull/1645
This commit is contained in:
Jämes Ménétrey 2022-10-27 06:21:30 +02:00 committed by GitHub
parent 15d645476a
commit 264fdfafed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 12 deletions

View File

@ -260,22 +260,27 @@ ipfs_fopen(int fd, const char *filename, int flags)
bool write_only = (flags & O_ACCMODE) == O_WRONLY;
bool read_write = (flags & O_ACCMODE) == O_RDWR;
// The mapping of the mode are described in the table in the official
// The mapping of the mode is similar to the table in the official
// specifications:
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html
// Note that POSIX has obtained a file descriptor beforehand.
// If opened with a destructive mode ("w" or "w+"), the truncate operation
// already occurred and must not be repeated because this will invalidate
// the file descriptor obtained by POSIX. Therefore, we do NOT map to the
// modes that truncate the file ("w" and "w+"). Instead, we map to a
// non-destructive mode ("r+").
if (read_only)
mode = "r";
else if (write_only && must_create && must_truncate)
mode = "w";
// Rather than "w", we map to a non-destructive mode
mode = "r+";
else if (write_only && must_create && must_append)
mode = "a";
else if (read_write && must_create && must_truncate)
mode = "w+";
else if (read_write && must_create && must_append)
mode = "a+";
else if (read_write && must_create)
mode = "w+";
else if (read_write)
// Rather than "w+", we map to a non-destructive mode
mode = "r+";
else
mode = NULL;

View File

@ -26,6 +26,7 @@ main(int argc, char **argv)
const char *text = FILE_TEXT;
char buffer[1000];
int ret;
long long stat_size;
// Test: File opening (fopen)
printf("Opening a file..\n");
@ -114,18 +115,26 @@ main(int argc, char **argv)
assert(ftell(file) == strlen(text) + 2 * ADDITIONAL_SPACE);
printf("[Test] Extension of the file size passed.\n");
// Display some debug information
printf("Getting the size of the file on disk..\n");
struct stat st;
stat(PATH_TEST_FILE, &st);
stat_size = st.st_size;
assert(stat_size != 0);
// Compare with the size from fstat
fstat(fileno(file), &st);
printf("The file size is: %lld (stat), %lld (fstat).\n", stat_size,
st.st_size);
assert(stat_size != 0);
assert(stat_size == st.st_size);
// Test: closing the file (fclose)
printf("Closing from the file..\n");
ret = fclose(file);
assert(ret == 0);
printf("[Test] Closing file passed.\n");
// Display some debug information
printf("Getting the size of the file on disk..\n");
struct stat st;
stat(PATH_TEST_FILE, &st);
printf("The file size is %lld.\n", st.st_size);
printf("All the tests passed!\n");
return 0;