sysmaster/backport-fix-integer-overflow.patch
huyubiao 8936fa02c5 sync patches from upstream,change the path of the unit,modify permissions for some directories and files
(cherry picked from commit ce9ff469b57f60130621bc293783bd3ac1fc92f2)
2023-08-05 18:15:53 +08:00

262 lines
8.4 KiB
Diff

From 9414249d740f90dfe5b65a922835306a78a1ad9f Mon Sep 17 00:00:00 2001
From: huyubiao <h13958451065@163.com>
Date: Tue, 18 Jul 2023 02:22:51 +0800
Subject: [PATCH] fix: integer overflow
---
coms/service/Cargo.toml | 1 +
coms/service/src/config.rs | 15 +++++++++++++++
coms/service/src/mng.rs | 10 +++++-----
coms/service/src/rentry.rs | 4 ++--
coms/service/src/spawn.rs | 2 +-
coms/service/src/unit.rs | 6 ------
core/sysmaster/mount/setup.rs | 1 -
libs/basic/src/time_util.rs | 3 ---
libs/constants/src/lib.rs | 9 +++++++++
libs/event/Cargo.toml | 1 +
libs/event/src/timer.rs | 20 +++++---------------
11 files changed, 39 insertions(+), 33 deletions(-)
diff --git a/coms/service/Cargo.toml b/coms/service/Cargo.toml
index 0f37cf8..27cedda 100644
--- a/coms/service/Cargo.toml
+++ b/coms/service/Cargo.toml
@@ -10,6 +10,7 @@ crate-type = ["dylib"]
name = "service"
[dependencies]
+constants = { path = "../../libs/constants" }
basic = { path = "../../libs/basic" }
macros = { path = "../../libs/macros" }
cgroup = { path = "../../libs/cgroup" }
diff --git a/coms/service/src/config.rs b/coms/service/src/config.rs
index aa62b00..e61340b 100644
--- a/coms/service/src/config.rs
+++ b/coms/service/src/config.rs
@@ -14,6 +14,7 @@
use super::comm::ServiceUnitComm;
use super::rentry::{NotifyAccess, SectionService, ServiceCommand, ServiceType};
use confique::{Config, FileFormat, Partial};
+use constants::{USEC_INFINITY, USEC_PER_SEC};
use std::cell::RefCell;
use std::collections::{HashMap, VecDeque};
use std::path::PathBuf;
@@ -86,6 +87,7 @@ impl ServiceConfig {
}
Ok(v) => v,
};
+ self.data.borrow_mut().verify();
if update {
self.db_update();
@@ -178,6 +180,19 @@ impl ServiceConfigData {
pub(self) fn set_timeout_stop(&mut self, time_out: u64) {
self.Service.set_timeout_stop(time_out);
}
+
+ pub(self) fn verify(&mut self) {
+ if self.Service.WatchdogSec >= USEC_INFINITY / USEC_PER_SEC {
+ self.Service.WatchdogSec = 0;
+ } else {
+ self.Service.WatchdogSec *= USEC_PER_SEC;
+ }
+ if self.Service.RestartSec >= USEC_INFINITY / USEC_PER_SEC {
+ self.Service.RestartSec = USEC_PER_SEC;
+ } else {
+ self.Service.RestartSec *= USEC_PER_SEC;
+ }
+ }
}
#[cfg(test)]
diff --git a/coms/service/src/mng.rs b/coms/service/src/mng.rs
index b44a0dd..e5fbeb8 100644
--- a/coms/service/src/mng.rs
+++ b/coms/service/src/mng.rs
@@ -1228,9 +1228,9 @@ impl ServiceMng {
}
fn restart_watchdog(&self) {
- self.monitor.borrow_mut().set_original_watchdog(
- self.config.config_data().borrow().Service.WatchdogSec * 1000000,
- );
+ self.monitor
+ .borrow_mut()
+ .set_original_watchdog(self.config.config_data().borrow().Service.WatchdogSec);
let watchdog_usec = self.monitor.borrow().watchdog_usec();
if watchdog_usec == 0 || watchdog_usec == u64::MAX {
self.stop_watchdog();
@@ -2570,7 +2570,7 @@ mod tests {
assert!(rt.armd_watchdog());
assert_eq!(
rt.watchdog().time(),
- config.config_data().borrow().Service.WatchdogSec * 1000000
+ config.config_data().borrow().Service.WatchdogSec
);
}
@@ -2589,7 +2589,7 @@ mod tests {
assert!(rt.armd_watchdog());
assert_eq!(
rt.watchdog().time(),
- config.config_data().borrow().Service.WatchdogSec * 1000000
+ config.config_data().borrow().Service.WatchdogSec
);
messages.remove("WATCHDOG");
diff --git a/coms/service/src/rentry.rs b/coms/service/src/rentry.rs
index 7099e01..87c92b2 100644
--- a/coms/service/src/rentry.rs
+++ b/coms/service/src/rentry.rs
@@ -32,7 +32,7 @@ use sysmaster::serialize::DeserializeWith;
use sysmaster::unit::KillMode;
use basic::special::EXEC_RUNTIME_PREFIX;
-use basic::time_util::USEC_PER_SEC;
+use constants::USEC_PER_SEC;
struct ServiceReDb<K, V>(ReDb<K, V>);
@@ -290,7 +290,7 @@ pub(super) struct SectionService {
#[config(deserialize_with = ExitStatusSet::deserialize_with)]
#[config(default = "")]
pub RestartPreventExitStatus: ExitStatusSet,
- #[config(default = 100000)]
+ #[config(default = 1)]
pub RestartSec: u64,
#[config(deserialize_with = Vec::<String>::deserialize_with)]
#[config(default = "")]
diff --git a/coms/service/src/spawn.rs b/coms/service/src/spawn.rs
index 2ff9e92..9b895aa 100644
--- a/coms/service/src/spawn.rs
+++ b/coms/service/src/spawn.rs
@@ -171,7 +171,7 @@ impl ServiceSpawn {
}
fn watchdog_timer(&self) -> u64 {
- self.config.config_data().borrow().Service.WatchdogSec * 1000000
+ self.config.config_data().borrow().Service.WatchdogSec
}
pub(super) fn set_socket_fd(&self, fd: i32) {
diff --git a/coms/service/src/unit.rs b/coms/service/src/unit.rs
index 4bb235e..ac2e05b 100644
--- a/coms/service/src/unit.rs
+++ b/coms/service/src/unit.rs
@@ -405,11 +405,5 @@ impl ServiceUnit {
}
}
-/*impl Default for ServiceUnit {
- fn default() -> Self {
- ServiceUnit::new()
- }
-}*/
-
use sysmaster::declare_unitobj_plugin_with_param;
declare_unitobj_plugin_with_param!(ServiceUnit, ServiceUnit::new);
diff --git a/core/sysmaster/mount/setup.rs b/core/sysmaster/mount/setup.rs
index e7ca9df..850a2b2 100644
--- a/core/sysmaster/mount/setup.rs
+++ b/core/sysmaster/mount/setup.rs
@@ -32,7 +32,6 @@ use std::{
use sysmaster::error::*;
const EARLY_MOUNT_NUM: u8 = 3;
-// const CGROUP_ROOT: &str = "/sys/fs/cgroup/";
type Callback = fn() -> bool;
diff --git a/libs/basic/src/time_util.rs b/libs/basic/src/time_util.rs
index 45a12af..a6eb5cb 100644
--- a/libs/basic/src/time_util.rs
+++ b/libs/basic/src/time_util.rs
@@ -15,9 +15,6 @@ use std::time::SystemTime;
const USEC_INFINITY: u128 = u128::MAX;
-/// usec per sec
-pub const USEC_PER_SEC: u64 = 1000000;
-
///
pub fn timespec_load(systime: SystemTime) -> u128 {
match systime.duration_since(SystemTime::UNIX_EPOCH) {
diff --git a/libs/constants/src/lib.rs b/libs/constants/src/lib.rs
index 46a3a50..3be5723 100644
--- a/libs/constants/src/lib.rs
+++ b/libs/constants/src/lib.rs
@@ -35,3 +35,12 @@ pub const INIT_PARA_PATH: &str = "/run/sysmaster/init_para";
/// invalid fd
pub const INVALID_FD: i32 = -1;
+
+/// USec per Sec
+pub const USEC_PER_SEC: u64 = 1000000;
+/// NSec per USec
+pub const NSEC_PER_USEC: u64 = 1000;
+/// NSec per Sec
+pub const NSEC_PER_SEC: u64 = 1000000000;
+/// USec infinity
+pub const USEC_INFINITY: u64 = u64::MAX;
diff --git a/libs/event/Cargo.toml b/libs/event/Cargo.toml
index 8cd9398..55a5cb4 100644
--- a/libs/event/Cargo.toml
+++ b/libs/event/Cargo.toml
@@ -7,6 +7,7 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+constants = { path = "../constants" }
libc = { version = "0.2" }
nix = { version = "0.24" }
snafu = { version = "0.7" }
diff --git a/libs/event/src/timer.rs b/libs/event/src/timer.rs
index a94025b..9a0cb3d 100644
--- a/libs/event/src/timer.rs
+++ b/libs/event/src/timer.rs
@@ -19,11 +19,7 @@ use std::{
};
use crate::{EventType, Source};
-
-use std::u64::MAX as USEC_INFINITY;
-const USEC_PER_SEC: u64 = 1000000;
-const NSEC_PER_USEC: u64 = 1000;
-const NSEC_PER_SEC: u64 = 1000000000;
+use constants::{NSEC_PER_SEC, NSEC_PER_USEC, USEC_INFINITY, USEC_PER_SEC};
#[derive(Debug, Clone, Copy)]
pub(crate) struct Timestamp {
@@ -137,16 +133,11 @@ impl Timer {
pub fn push(&mut self, source: Rc<dyn Source>) {
// calc the time
let mut next = source.time_relative();
- if next != u64::MAX {
- next += self.timerid(&source.event_type());
- } else {
+ let now = self.timerid(&source.event_type());
+ if next > USEC_INFINITY - now {
next = source.time();
- }
-
- if next == u64::MAX {
- panic!(
- "You need to implement time() or time_relative(), and cannot be set to u64::MAX"
- );
+ } else {
+ next += now;
}
let cd = ClockData::new(source.clone(), next);
@@ -165,7 +156,6 @@ impl Timer {
pub fn pop(&mut self, et: &EventType) -> Option<Rc<dyn Source>> {
let next = self.timerid(et);
- // self.now();
match self.timer_set.get_mut(et) {
Some(timer) => {
if timer.data.is_empty() {
--
2.33.0