diff --git a/core/shared/platform/linux-sgx/sgx_ipfs.c b/core/shared/platform/linux-sgx/sgx_ipfs.c index 76750946..5abb3687 100644 --- a/core/shared/platform/linux-sgx/sgx_ipfs.c +++ b/core/shared/platform/linux-sgx/sgx_ipfs.c @@ -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; diff --git a/samples/file/wasm-app/main.c b/samples/file/wasm-app/main.c index 7726b814..9931f366 100644 --- a/samples/file/wasm-app/main.c +++ b/samples/file/wasm-app/main.c @@ -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;