diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp index 4ac9022711..7ac6152b1c 100644 --- a/src/system/kernel/fs/vfs.cpp +++ b/src/system/kernel/fs/vfs.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -6606,8 +6607,10 @@ common_write_stat(struct file_descriptor* descriptor, const struct stat* stat, FUNCTION(("common_write_stat(vnode = %p, stat = %p, statMask = %d)\n", vnode, stat, statMask)); - if ((descriptor->open_mode & O_RWMASK) == O_RDONLY) + if ((descriptor->open_mode & O_RWMASK) == O_RDONLY + && (statMask & B_STAT_SIZE) != 0) { return B_BAD_VALUE; + } if (!HAS_FS_CALL(vnode, write_stat)) return B_READ_ONLY_DEVICE; diff --git a/src/tests/system/libroot/posix/Jamfile b/src/tests/system/libroot/posix/Jamfile index 187dcb050f..054b4f694f 100644 --- a/src/tests/system/libroot/posix/Jamfile +++ b/src/tests/system/libroot/posix/Jamfile @@ -11,6 +11,7 @@ SimpleTest abort_test : abort_test.cpp ; SimpleTest SyslogTest : SyslogTest.cpp ; SimpleTest brk_test : brk_test.c ; SimpleTest calloc_test : calloc_test.c ; +SimpleTest chmod : chmod.cpp ; SimpleTest clearenv : clearenv.cpp ; SimpleTest dirent_test : dirent_test.cpp ; SimpleTest flock_test : flock_test.cpp ; diff --git a/src/tests/system/libroot/posix/chmod.cpp b/src/tests/system/libroot/posix/chmod.cpp new file mode 100644 index 0000000000..bdd4317551 --- /dev/null +++ b/src/tests/system/libroot/posix/chmod.cpp @@ -0,0 +1,50 @@ +/* + * Copyright 2008, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + + +extern const char *__progname; + + +int +main(int argc, char **argv) +{ + if (argc < 3) { + fprintf(stderr, "usage: %s \n", __progname); + return 1; + } + + struct stat st; + if (stat(argv[1], &st) != 0) { + fprintf(stderr, "%s: cannot stat file \"%s\": %s\n", __progname, + argv[1], strerror(errno)); + return 1; + } + + int fd = open(argv[1], O_RDONLY); + if (fd < 0) { + fprintf(stderr, "%s: could open the file read-only \"%s\": %s\n", + __progname, argv[1], strerror(errno)); + return 1; + } + if (fchmod(fd, 0666) == -1) { + fprintf(stderr, "%s: couldn't chmod a file opened read-only \"%s\": %s\n", + __progname, argv[1], strerror(errno)); + close(fd); + return 1; + } + close(fd); + + return 0; +}