aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJokler <jokler.contact@gmail.com>2018-02-23 18:29:20 +0100
committerJokler <jokler.contact@gmail.com>2018-02-23 18:29:20 +0100
commit297ceaa0899a6228f47f1f14e4bd261ec4cc6619 (patch)
treeb97f3cc18306ceb4fe0a4fc2330f9f402c8c3f5c
parent806614b5bf00581c9a564fcda4ecb760b6d27c6a (diff)
downloadfrippy-297ceaa0899a6228f47f1f14e4bd261ec4cc6619.tar.gz
frippy-297ceaa0899a6228f47f1f14e4bd261ec4cc6619.zip
Add possibly unsafe timeout hook to factoids
-rw-r--r--Cargo.lock38
-rw-r--r--Cargo.toml2
-rw-r--r--src/plugins/factoids/mod.rs9
-rw-r--r--src/plugins/factoids/sandbox.lua17
-rw-r--r--src/plugins/factoids/utils.rs8
5 files changed, 66 insertions, 8 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 6b471e8..118e68f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -342,6 +342,25 @@ dependencies = [
]
[[package]]
+name = "failure"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "backtrace 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "failure_derive"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "foreign-types"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -372,7 +391,7 @@ dependencies = [
"log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"reqwest 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "rlua 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rlua 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)",
"select 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -952,9 +971,10 @@ dependencies = [
[[package]]
name = "rlua"
-version = "0.9.7"
+version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
+ "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1159,6 +1179,15 @@ dependencies = [
]
[[package]]
+name = "synstructure"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "take"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1451,6 +1480,8 @@ dependencies = [
"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
"checksum error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8"
+"checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82"
+"checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b"
"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
"checksum fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f6c0581a4e363262e52b87f59ee2afe3415361c6ec35e665924eb08afe8ff159"
@@ -1517,7 +1548,7 @@ dependencies = [
"checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
"checksum relay 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f301bafeb60867c85170031bdb2fcf24c8041f33aee09e7b116a58d4e9f781c5"
"checksum reqwest 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3161ca63fd11ce36c7718af239e6492a25a3dbfcec54240f959b9d816cf42413"
-"checksum rlua 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)" = "fb7eec2f28b4812553f10b2e69888a5a674b2e761f5a39731c14541c32bdb6d8"
+"checksum rlua 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4d6a9d2d1da31dd5cb4878789b924e46a600bdca4895b30f2efd6370d0dfc80e"
"checksum rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aee45432acc62f7b9a108cc054142dac51f979e69e71ddce7d6fc7adf29e817e"
"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
"checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f"
@@ -1543,6 +1574,7 @@ dependencies = [
"checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc"
"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
+"checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd"
"checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5"
"checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6"
"checksum tendril 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1b72f8e2f5b73b65c315b1a70c730f24b9d7a25f39e98de8acbe2bb795caea"
diff --git a/Cargo.toml b/Cargo.toml
index 1775455..aadd44c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -27,7 +27,7 @@ tokio-core = "0.1.10"
futures = "0.1.16"
log = "0.3.8"
time = "0.1"
-rlua = "0.9.3"
+rlua = "0.12.2"
reqwest = "0.8.0"
select = "0.4.2"
regex = "0.2.2"
diff --git a/src/plugins/factoids/mod.rs b/src/plugins/factoids/mod.rs
index 252ba83..08e8f12 100644
--- a/src/plugins/factoids/mod.rs
+++ b/src/plugins/factoids/mod.rs
@@ -15,7 +15,7 @@ pub mod database;
use self::database::{Database, DbResponse};
mod utils;
-use self::utils::download;
+use self::utils::*;
static LUA_SANDBOX: &'static str = include_str!("sandbox.lua");
@@ -247,16 +247,17 @@ impl<T: Database> Factoids<T> {
.map(ToOwned::to_owned)
.collect::<Vec<String>>();
- let lua = Lua::new();
+ let lua = unsafe { Lua::new_with_debug() };
let globals = lua.globals();
globals.set("factoid", code)?;
- globals.set("download", lua.create_function(download))?;
+ globals.set("download", lua.create_function(download)?)?;
+ globals.set("sleep", lua.create_function(sleep)?)?;
globals.set("args", args)?;
globals.set("input", command.tokens.join(" "))?;
globals.set("user", command.source.clone())?;
globals.set("channel", command.target.clone())?;
- globals.set("output", lua.create_table())?;
+ globals.set("output", lua.create_table()?)?;
lua.exec::<()>(LUA_SANDBOX, Some(name))?;
let output: Vec<String> = globals.get::<_, Vec<String>>("output")?;
diff --git a/src/plugins/factoids/sandbox.lua b/src/plugins/factoids/sandbox.lua
index 8ebf518..3fde65e 100644
--- a/src/plugins/factoids/sandbox.lua
+++ b/src/plugins/factoids/sandbox.lua
@@ -24,9 +24,26 @@ local env = { print = send,
table = table,
string = string,
tostring = tostring,
+ tonumber = tonumber,
math = math }
local f, e = load(factoid, nil, nil, env)
+
+-- Check if the factoid timed out
+function checktime(event, line)
+ if os.time() - time >= timeout then
+ error("Timed out after " .. timeout .. " seconds", 0)
+ else
+ -- Limit the cpu usage of factoids
+ sleep(1)
+ end
+end
+
+-- Add timeout hook
+time = os.time()
+timeout = 30
+debug.sethook(checktime, "l")
+
if f then
f()
else
diff --git a/src/plugins/factoids/utils.rs b/src/plugins/factoids/utils.rs
index ad25eef..fc86fb3 100644
--- a/src/plugins/factoids/utils.rs
+++ b/src/plugins/factoids/utils.rs
@@ -1,5 +1,8 @@
extern crate reqwest;
+use std::thread;
+use std::time::Duration;
+
use utils;
use super::rlua::prelude::*;
@@ -11,3 +14,8 @@ pub fn download(_: &Lua, url: String) -> Result<String, LuaError> {
None => Err(RuntimeError(format!("Failed to download {}", url))),
}
}
+
+pub fn sleep(_: &Lua, dur: u64) -> Result<(), LuaError> {
+ thread::sleep(Duration::from_millis(dur));
+ Ok(())
+}