Skip to content

Commit 6c521f3

Browse files
author
Francesco Lavra
committed
utime/utimes/utimensat: fail on read-only filesystem
These syscalls change the access time and/or modification time in file metadata, and as such should not be allowed on read-only filesystems.
1 parent fe05a56 commit 6c521f3

3 files changed

Lines changed: 20 additions & 15 deletions

File tree

src/fs/fs.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,32 +106,36 @@ timestamp filesystem_get_mtime(filesystem fs, tuple t)
106106
return filesystem_get_time(fs, t, sym(mtime));
107107
}
108108

109-
static inline void filesystem_set_time(filesystem fs, tuple t, symbol s,
109+
static inline int filesystem_set_time(filesystem fs, tuple t, symbol s,
110110
timestamp tim)
111111
{
112+
if (fs->ro)
113+
return -EROFS;
112114
timestamp cur_time = 0;
113115
value time_val = get(t, s);
114116
if (time_val) {
115117
u64_from_value(time_val, &cur_time);
116118
}
117119
if (tim != cur_time) {
120+
value new_time_val = value_from_u64(tim);
121+
if (new_time_val == INVALID_ADDRESS)
122+
return -ENOMEM;
123+
set(t, s, new_time_val);
118124
if (time_val) {
119125
deallocate_value(time_val);
120126
}
121-
time_val = value_from_u64(tim);
122-
assert(time_val);
123-
set(t, s, time_val);
124127
}
128+
return 0;
125129
}
126130

127-
void filesystem_set_atime(filesystem fs, tuple t, timestamp tim)
131+
int filesystem_set_atime(filesystem fs, tuple t, timestamp tim)
128132
{
129-
filesystem_set_time(fs, t, sym(atime), tim);
133+
return filesystem_set_time(fs, t, sym(atime), tim);
130134
}
131135

132-
void filesystem_set_mtime(filesystem fs, tuple t, timestamp tim)
136+
int filesystem_set_mtime(filesystem fs, tuple t, timestamp tim)
133137
{
134-
filesystem_set_time(fs, t, sym(mtime), tim);
138+
return filesystem_set_time(fs, t, sym(mtime), tim);
135139
}
136140

137141
u64 filesystem_get_rdev(filesystem fs, tuple t)

src/fs/fs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ void filesystem_release(filesystem fs);
3030

3131
timestamp filesystem_get_atime(filesystem fs, tuple t);
3232
timestamp filesystem_get_mtime(filesystem fs, tuple t);
33-
void filesystem_set_atime(filesystem fs, tuple t, timestamp tim);
34-
void filesystem_set_mtime(filesystem fs, tuple t, timestamp tim);
33+
int filesystem_set_atime(filesystem fs, tuple t, timestamp tim);
34+
int filesystem_set_mtime(filesystem fs, tuple t, timestamp tim);
3535

3636
#define filesystem_update_atime(fs, t) \
3737
filesystem_set_atime(fs, t, now(CLOCK_ID_REALTIME))

src/unix/filesystem.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,8 +326,9 @@ static sysreturn utime_internal(const char *filename, timestamp actime,
326326
filesystem cwd_fs = fs;
327327
sysreturn rv = filesystem_get_node(&fs, cwd, filename_ss, FS_NODE_FOLLOW, &t, 0, 0);
328328
if (rv == 0) {
329-
filesystem_set_atime(fs, t, actime);
330-
filesystem_set_mtime(fs, t, modtime);
329+
rv = filesystem_set_atime(fs, t, actime);
330+
if (rv == 0)
331+
rv = filesystem_set_mtime(fs, t, modtime);
331332
filesystem_put_node(fs, t);
332333
}
333334
filesystem_release(cwd_fs);
@@ -428,9 +429,9 @@ sysreturn utimensat(int dirfd, const char *filename, const struct timespec times
428429
}
429430
if (rv == 0) {
430431
if (atime != infinity)
431-
filesystem_set_atime(fs, t, atime);
432-
if (mtime != infinity)
433-
filesystem_set_mtime(fs, t, mtime);
432+
rv = filesystem_set_atime(fs, t, atime);
433+
if ((rv == 0) && (mtime != infinity))
434+
rv = filesystem_set_mtime(fs, t, mtime);
434435
if (filename) {
435436
filesystem_put_node(fs, t);
436437
filesystem_release(cwd_fs);

0 commit comments

Comments
 (0)