[Devel] [PATCH rh8] ve/time: Limit values to write in ve::clock_[monotonic|bootbased]

Konstantin Khorenko khorenko at virtuozzo.com
Thu Oct 15 14:10:22 MSK 2020


What do we mean when write a valie XXX into, say, ve::ve.clock_bootbased?
We mean that "up to now the CT worked for XXX secs/usecs already".
And we store the delta between Node "now" and XXX into ve->start_time_real.

If the CT worked less than the current Node, ve->start_time_real will
contain positive value and we'll substitute it from Node's "now" each
time when we need to get the time since the CT start.

If the CT worked longer than the current CT (say, CT has been migrated
from another HN), the stored delta will be negative and thus we'll "add"
more time for Node's "now".

So then what do we want to limit?
1. Negative values written to ve::clock_[monotonic|bootbased].
   Indeed we can hardly imagine that the CT has been started, but the
   time since it's start is negative.

2. A big positive value, so some time later when we read from
   ve::clock_[monotonic|bootbased] we get an overflowed value.

Both these checks are performed by timespec_valid_strict().

Fixes: 25cab3041305 ("ve: Add interface for
ve::clock_[monotonic|bootbased] adjustment")

Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
---
 kernel/ve/ve.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index cc26d3b2fa9b..43e37b27e887 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -965,6 +965,8 @@ static ssize_t ve_ts_write(struct kernfs_open_file *of, char *buf,
 
 	if (sscanf(buf, "%ld %ld", &delta.tv_sec, &delta.tv_nsec) != 2)
 		return -EINVAL;
+	if (!timespec_valid_strict(&delta))
+		return -EINVAL;
 	delta_ns = timespec_to_ns(&delta);
 
 	switch (of_cft(of)->private) {
-- 
2.28.0



More information about the Devel mailing list