mirror of
https://gitlab.com/niansa/libhss.git
synced 2025-03-06 20:49:21 +01:00
Initial commit
This commit is contained in:
commit
6e9cd2c5cb
8 changed files with 133 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
CMakeLists.txt.user
|
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[submodule "qipc"]
|
||||||
|
path = qipc
|
||||||
|
url = https://gitlab.com/niansa/quickipc.git
|
||||||
|
[submodule "dlhandlepp"]
|
||||||
|
path = dlhandlepp
|
||||||
|
url = https://gitlab.com/niansa/dlhandlepp
|
16
CMakeLists.txt
Normal file
16
CMakeLists.txt
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
|
project(libhss LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
add_executable(HSSChildLauncher child_launcher.cpp)
|
||||||
|
target_link_libraries(HSSChildLauncher PRIVATE seccomp dl)
|
||||||
|
target_include_directories(HSSChildLauncher PRIVATE qipc/include dlhandlepp)
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
install(TARGETS HSSChildLauncher
|
||||||
|
RUNTIME DESTINATION bin
|
||||||
|
)
|
||||||
|
install(FILES hss.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/)
|
49
child_launcher.cpp
Normal file
49
child_launcher.cpp
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include <linux/seccomp.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#include <seccomp.h>
|
||||||
|
|
||||||
|
#include <QIPC/ipc.hpp>
|
||||||
|
#include <dlhandle.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
void enable_limits() {
|
||||||
|
// rlimit
|
||||||
|
constexpr size_t memLimit = 4 * 1000; // 4 KB
|
||||||
|
rlimit memRLimit{memLimit, memLimit};
|
||||||
|
if (setrlimit(RLIMIT_AS, &memRLimit) < 0) {
|
||||||
|
throw std::runtime_error("Error setting ressource limits");
|
||||||
|
}
|
||||||
|
// Seccomp
|
||||||
|
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ERRNO(EOPNOTSUPP));
|
||||||
|
for (const auto sysc : {
|
||||||
|
SCMP_SYS(mmap), SCMP_SYS(mmap2), SCMP_SYS(munmap),
|
||||||
|
SCMP_SYS(write), SCMP_SYS(read), SCMP_SYS(close),
|
||||||
|
SCMP_SYS(exit), SCMP_SYS(exit_group)
|
||||||
|
}) {
|
||||||
|
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, sysc, 0);
|
||||||
|
}
|
||||||
|
seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(write), 0);
|
||||||
|
if (seccomp_load(ctx) < 0) {
|
||||||
|
throw std::runtime_error("Error setting up seccomp");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
// Get IPC
|
||||||
|
if (argc != 4) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
QIPC ipc(QIPC::Fds{{std::stoi(argv[1]), std::stoi(argv[2])}});
|
||||||
|
// Launch
|
||||||
|
close(STDIN_FILENO);
|
||||||
|
close(STDOUT_FILENO);
|
||||||
|
close(STDERR_FILENO);
|
||||||
|
Dlhandle dl(argv[3], RTLD_NOW | RTLD_LOCAL);
|
||||||
|
auto entry = dl.get<void*(QIPC&)>("entry");
|
||||||
|
enable_limits();
|
||||||
|
entry(ipc);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
12
example/CMakeLists.txt
Normal file
12
example/CMakeLists.txt
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
|
project(hss_examples LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
add_executable(HSSTestMain main.cpp)
|
||||||
|
target_include_directories(HSSTestMain PRIVATE qipc/include ..)
|
||||||
|
|
||||||
|
add_library(HSSTestChild SHARED child.cpp)
|
||||||
|
target_include_directories(HSSTestChild PRIVATE qipc/include ..)
|
14
example/child.cpp
Normal file
14
example/child.cpp
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#include <string>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <QIPC/ipc.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
void entry(QIPC& ipc) {
|
||||||
|
open("lol", 0);
|
||||||
|
ipc.send("Lol");
|
||||||
|
std::string test = "Dynamic ";
|
||||||
|
test += "memory";
|
||||||
|
ipc.send(test.c_str());
|
||||||
|
ipc.send_raw(size_t(1234567890));
|
||||||
|
}
|
17
example/main.cpp
Normal file
17
example/main.cpp
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <QIPC/ipc.hpp>
|
||||||
|
#include <hss.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
QIPC ipc;
|
||||||
|
ipc.create();
|
||||||
|
|
||||||
|
HSS::run(ipc, "./libHSSTestChild.so");
|
||||||
|
|
||||||
|
std::cout << ipc.recv() << std::endl;
|
||||||
|
std::cout << ipc.recv() << std::endl;
|
||||||
|
std::cout << ipc.recv_raw<size_t>() << std::endl;
|
||||||
|
}
|
18
hss.hpp
Normal file
18
hss.hpp
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#include <string>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <QIPC/ipc.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace HSS {
|
||||||
|
inline void run(QIPC& ipc, const std::string& file) {
|
||||||
|
if (fork() == 0) {
|
||||||
|
execlp("HSSChildLauncher", "child",
|
||||||
|
std::to_string(ipc.get_fds().get_in()).c_str(),
|
||||||
|
std::to_string(ipc.get_fds().get_out()).c_str(),
|
||||||
|
file.c_str(),
|
||||||
|
nullptr);
|
||||||
|
throw std::runtime_error("Failed to run HSSChildLauncher");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue