orangeC23 added the bug label to Issue #7329.
orangeC23 opened issue #7329:
Steps to Reproduce
(1) The cfile is :
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <sys/uio.h> int main() { const char* file_name = "Data/mydir"; int open_style= O_APPEND; int fd = get_fd(file_name, open_style); fd_prestat_dir_nameDyommnP0MC(fd); return 0; } int fd_prestat_dir_nameDyommnP0MC (int fd) { return fd_prestat_dir_name(fd); } int get_fd(const char* file_name, int open_style){ // Open a file for reading int fd = open(file_name, open_style); if (fd == -1) { perror("Failed to open the file"); return 1; } return fd; } int fd_prestat_dir_name(int fd) { printf("Enter fd_prestat_dir_name\n"); int flags = fcntl(fd, F_GETFL); if (flags == -1) { perror("Error getting file descriptor flags"); return 1; } printf("flags: %d\n", flags); if (flags & O_RDONLY){ printf("Access Mode: O_RDONLY\n"); } if (flags & O_WRONLY){ printf("Access Mode: O_WRONLY\n"); } if (flags & O_RDWR){ printf("Access Mode: O_RDWR\n"); } if (flags & O_APPEND){ printf("Access Mode: O_APPEND\n"); } if (flags & O_NONBLOCK){ printf("Access Mode: O_NONBLOCK\n"); } if (flags & O_SYNC){ printf("Access Mode: O_SYNC\n"); } if (flags & O_DSYNC){ printf("Access Mode: O_DSYNC\n"); } if (flags & O_RSYNC){ printf("Access Mode: O_RSYNC\n"); } printf("Leave fd_prestat_dir_name\n"); return fd; }
(2)compile the c file into wasm:
./wasi-sdk-16.0/bin/clang --target=wasm32-unkown-wasi --sysroot=./wasi-sdk-16.0/share/wasi-sysroot test1.c -o test1.wasm
(3)exeute open.wasm
wasmtime run --dir=./Data test1.wasm
The permission of Data/mydir is 0700, user1 create the Data/mydir directory before and user1 execute the Wasm file.Expected Results
Using
gcc test1.c -o test1
and./test1
to execute get the following result:Enter fd_prestat_dir_name flags: 33792 Access Mode: O_APPEND Leave fd_prestat_dir_name
Actual Results
wasmtime prints:
Failed to open the file: Invalid argument Enter fd_prestat_dir_name flags: 268435457 Access Mode: O_WRONLY Access Mode: O_RDWR Access Mode: O_APPEND Leave fd_prestat_dir_name
I'm not sure whether wasmtime and native ubuntu get different could be a bug or only difference ? Could you please provide some suggestion about the difference? Thanks a lot!
Versions and Environment
wasmtime 13.0.0
Operating system: Ubuntu 20.04Architecture: x86_64
alexcrichton commented on issue #7329:
Yes this is expected. WASI is not POSIX-as-is since it's portable to other environments such as the web and Windows. Differences are to be expected. If you have a specific question feel free to follow up with that though!
Also FWIW it seems like your reproduction case is going through some form of transform between what you have locally and this issue because the source above does not compile for me locally at least:
../foo.c:10:14: error: call to undeclared function 'get_fd'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] int fd = get_fd(file_name, open_style); ^ ../foo.c:11:5: error: call to undeclared function 'fd_prestat_dir_nameDyommnP0MC'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] fd_prestat_dir_nameDyommnP0MC(fd); ^ ../foo.c:16:12: error: call to undeclared function 'fd_prestat_dir_name'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] return fd_prestat_dir_name(fd); ^ 3 errors generated.
alexcrichton closed issue #7329:
Steps to Reproduce
(1) The cfile is :
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <sys/uio.h> int main() { const char* file_name = "Data/mydir"; int open_style= O_APPEND; int fd = get_fd(file_name, open_style); fd_prestat_dir_nameDyommnP0MC(fd); return 0; } int fd_prestat_dir_nameDyommnP0MC (int fd) { return fd_prestat_dir_name(fd); } int get_fd(const char* file_name, int open_style){ // Open a file for reading int fd = open(file_name, open_style); if (fd == -1) { perror("Failed to open the file"); return 1; } return fd; } int fd_prestat_dir_name(int fd) { printf("Enter fd_prestat_dir_name\n"); int flags = fcntl(fd, F_GETFL); if (flags == -1) { perror("Error getting file descriptor flags"); return 1; } printf("flags: %d\n", flags); if (flags & O_RDONLY){ printf("Access Mode: O_RDONLY\n"); } if (flags & O_WRONLY){ printf("Access Mode: O_WRONLY\n"); } if (flags & O_RDWR){ printf("Access Mode: O_RDWR\n"); } if (flags & O_APPEND){ printf("Access Mode: O_APPEND\n"); } if (flags & O_NONBLOCK){ printf("Access Mode: O_NONBLOCK\n"); } if (flags & O_SYNC){ printf("Access Mode: O_SYNC\n"); } if (flags & O_DSYNC){ printf("Access Mode: O_DSYNC\n"); } if (flags & O_RSYNC){ printf("Access Mode: O_RSYNC\n"); } printf("Leave fd_prestat_dir_name\n"); return fd; }
(2)compile the c file into wasm:
./wasi-sdk-16.0/bin/clang --target=wasm32-unkown-wasi --sysroot=./wasi-sdk-16.0/share/wasi-sysroot test1.c -o test1.wasm
(3)exeute open.wasm
wasmtime run --dir=./Data test1.wasm
The permission of Data/mydir is 0700, user1 create the Data/mydir directory before and user1 execute the Wasm file.Expected Results
Using
gcc test1.c -o test1
and./test1
to execute get the following result:Enter fd_prestat_dir_name flags: 33792 Access Mode: O_APPEND Leave fd_prestat_dir_name
Actual Results
wasmtime prints:
Failed to open the file: Invalid argument Enter fd_prestat_dir_name flags: 268435457 Access Mode: O_WRONLY Access Mode: O_RDWR Access Mode: O_APPEND Leave fd_prestat_dir_name
I'm not sure whether wasmtime and native ubuntu get different could be a bug or only difference ? Could you please provide some suggestion about the difference? Thanks a lot!
Versions and Environment
wasmtime 13.0.0
Operating system: Ubuntu 20.04Architecture: x86_64
Last updated: Nov 22 2024 at 16:03 UTC