diff options
author | Frank Busse <bb0xfb@gmail.com> | 2022-03-18 09:46:14 +0000 |
---|---|---|
committer | Cristian Cadar <c.cadar@imperial.ac.uk> | 2022-07-07 18:30:34 +0100 |
commit | d2f5906da4ae37a41ae257e5308d50e19689877b (patch) | |
tree | 40bb75bc1153dbf37f0df31674cf67e4af3c4da3 | |
parent | 99c522b14dbbf6b26be35b6e7bb8da7b29070287 (diff) | |
download | klee-d2f5906da4ae37a41ae257e5308d50e19689877b.tar.gz |
POSIX runtime: fstatat: check for nonnull path APIs
-rw-r--r-- | cmake/fstatat.c | 9 | ||||
-rw-r--r-- | runtime/POSIX/CMakeLists.txt | 5 | ||||
-rw-r--r-- | runtime/POSIX/fd.c | 15 |
3 files changed, 24 insertions, 5 deletions
diff --git a/cmake/fstatat.c b/cmake/fstatat.c new file mode 100644 index 00000000..58aa9301 --- /dev/null +++ b/cmake/fstatat.c @@ -0,0 +1,9 @@ +#include <fcntl.h> +#include <stddef.h> +#include <sys/stat.h> + +int main(void) { + struct stat buf; + #pragma GCC diagnostic error "-Wnonnull" + fstatat(0, NULL, &buf, 0); +} diff --git a/runtime/POSIX/CMakeLists.txt b/runtime/POSIX/CMakeLists.txt index 02d06736..d8208d9b 100644 --- a/runtime/POSIX/CMakeLists.txt +++ b/runtime/POSIX/CMakeLists.txt @@ -20,6 +20,11 @@ set(SRC_FILES stubs.c ) +try_compile (FSTATAT_PATH_ACCEPTS_NULL + ${CMAKE_BINARY_DIR} + ${PROJECT_SOURCE_DIR}/cmake/fstatat.c + ) + # Build it include("${CMAKE_SOURCE_DIR}/cmake/compile_bitcode_library.cmake") prefix_with_path("${SRC_FILES}" "${CMAKE_CURRENT_SOURCE_DIR}/" prefixed_files) diff --git a/runtime/POSIX/fd.c b/runtime/POSIX/fd.c index 35d0d315..0aba0ade 100644 --- a/runtime/POSIX/fd.c +++ b/runtime/POSIX/fd.c @@ -568,16 +568,21 @@ int fstatat(int fd, const char *path, struct stat *buf, int flags) { return 0; } +#ifdef FSTATAT_PATH_ACCEPTS_NULL + #define PATHPARAM (path ? __concretize_string(path) : NULL) +#else + assert(path); + #define PATHPARAM (__concretize_string(path)) +#endif + #if (defined __NR_newfstatat) && (__NR_newfstatat != 0) - return syscall(__NR_newfstatat, (long)fd, - (path ? __concretize_string(path) : NULL), buf, (long)flags); + return syscall(__NR_newfstatat, (long)fd, PATHPARAM, buf, (long)flags); #else - return syscall(__NR_fstatat64, (long)fd, - (path ? __concretize_string(path) : NULL), buf, (long)flags); + return syscall(__NR_fstatat64, (long)fd, PATHPARAM, buf, (long)flags); #endif +#undef PATHPARAM } - int __fd_lstat(const char *path, struct stat64 *buf) { exe_disk_file_t *dfile = __get_sym_file(path); if (dfile) { |