packages: consolidate genodeSources patches

This commit is contained in:
Emery Hemingway 2021-02-19 19:13:33 +01:00
parent 4a613364df
commit ba1d50ab6b
11 changed files with 705 additions and 733 deletions

View File

@ -35,11 +35,7 @@ let
version = builtins.substring 0 7 upstreamSources.rev; version = builtins.substring 0 7 upstreamSources.rev;
src = upstreamSources; src = upstreamSources;
nativeBuildInputs = [ expect gnumake tcl ]; nativeBuildInputs = [ expect gnumake tcl ];
patches = [ patches = [ ./patches/sources.patch ];
./patches/binary-labels.patch
./patches/label-fail.patch
./patches/phdr.patch
];
configurePhase = '' configurePhase = ''
patchShebangs ./tool patchShebangs ./tool
substituteInPlace repos/base/etc/tools.conf \ substituteInPlace repos/base/etc/tools.conf \
@ -335,12 +331,6 @@ let
''; '';
}; };
basePatches = [
./patches/cxx-align.patch
./patches/core-diag.patch
./patches/ld-ro.patch
];
in makePackages // depotPackages // { in makePackages // depotPackages // {
genodeSources = genodeSources // { genodeSources = genodeSources // {
@ -353,7 +343,6 @@ in makePackages // depotPackages // {
KERNEL = "hw"; KERNEL = "hw";
BOARD = "pc"; BOARD = "pc";
targets = [ "bootstrap" "core" "timer" "lib/ld" ]; targets = [ "bootstrap" "core" "timer" "lib/ld" ];
patches = basePatches;
postInstall = '' postInstall = ''
mv $out/lib/ld-hw.lib.so $out/lib/ld.lib.so mv $out/lib/ld-hw.lib.so $out/lib/ld.lib.so
mv $out/bin/hw_timer_drv $out/bin/timer_drv mv $out/bin/hw_timer_drv $out/bin/timer_drv
@ -369,7 +358,6 @@ in makePackages // depotPackages // {
KERNEL = "hw"; KERNEL = "hw";
BOARD = "virt_qemu"; BOARD = "virt_qemu";
targets = [ "bootstrap" "core" "timer" "lib/ld" ]; targets = [ "bootstrap" "core" "timer" "lib/ld" ];
patches = basePatches;
postInstall = '' postInstall = ''
mv $out/lib/ld-hw.lib.so $out/lib/ld.lib.so mv $out/lib/ld-hw.lib.so $out/lib/ld.lib.so
mv $out/bin/hw_timer_drv $out/bin/timer_drv mv $out/bin/hw_timer_drv $out/bin/timer_drv
@ -384,7 +372,6 @@ in makePackages // depotPackages // {
KERNEL = "linux"; KERNEL = "linux";
BOARD = "linux"; BOARD = "linux";
targets = [ "core" "timer" "lib/ld" ]; targets = [ "core" "timer" "lib/ld" ];
patches = basePatches;
postInstall = '' postInstall = ''
mv $out/lib/ld-linux.lib.so $out/lib/ld.lib.so mv $out/lib/ld-linux.lib.so $out/lib/ld.lib.so
mv $out/bin/linux_timer_drv $out/bin/timer_drv mv $out/bin/linux_timer_drv $out/bin/timer_drv
@ -397,7 +384,6 @@ in makePackages // depotPackages // {
outputs = [ "out" "coreObj" ]; outputs = [ "out" "coreObj" ];
KERNEL = "nova"; KERNEL = "nova";
targets = [ "core" "timer" "lib/ld" ]; targets = [ "core" "timer" "lib/ld" ];
patches = basePatches;
postInstall = '' postInstall = ''
mv $out/lib/ld-nova.lib.so $out/lib/ld.lib.so mv $out/lib/ld-nova.lib.so $out/lib/ld.lib.so
mv $out/bin/nova_timer_drv $out/bin/timer_drv mv $out/bin/nova_timer_drv $out/bin/timer_drv

View File

@ -98,7 +98,7 @@ in {
imx53_qsb_drivers = { }; imx53_qsb_drivers = { };
imx8_fb_drv = { }; imx8_fb_drv = { };
imx8q_evk_drivers = { }; imx8q_evk_drivers = { };
init.patches = [ ./patches/sandbox.patch ./patches/xml-fail.patch ]; init = { };
input_event_bridge = { }; input_event_bridge = { };
intel_fb_drv = { intel_fb_drv = {
BOARD = "pc"; BOARD = "pc";
@ -306,7 +306,7 @@ in {
vbox5-nova = vbox5'; vbox5-nova = vbox5';
verify = { }; verify = { };
vesa_drv.portInputs = with ports; [ libc x86emu ]; vesa_drv.portInputs = with ports; [ libc x86emu ];
vfs.patches = [ ./patches/vfs.patch ]; vfs = { };
vfs_audit = { }; vfs_audit = { };
vfs_block = { }; vfs_block = { };
vfs_fatfs = { }; vfs_fatfs = { };

View File

@ -1,98 +0,0 @@
commit 2d76b3271fa826a97c3974b7e67f2799e9ba448d
Author: Emery Hemingway <ehmry@posteo.net>
Date: Fri May 29 18:42:57 2020 +0530
Use 128-byte strings for session labels
Sixty-four bytes is insufficient for Nix store paths.
diff --git a/repos/base/include/base/child.h b/repos/base/include/base/child.h
index 8c7b33a9d9..3bd6483547 100644
--- a/repos/base/include/base/child.h
+++ b/repos/base/include/base/child.h
@@ -44,9 +44,9 @@ namespace Genode {
*/
struct Genode::Child_policy
{
- typedef String<64> Name;
- typedef String<64> Binary_name;
- typedef String<64> Linker_name;
+ typedef String<128> Name;
+ typedef String<128> Binary_name;
+ typedef String<128> Linker_name;
virtual ~Child_policy() { }
@@ -407,7 +407,7 @@ class Genode::Child : protected Rpc_object<Parent>,
Id_space<Parent::Client>::Id const _client_id;
- typedef String<64> Label;
+ typedef String<128> Label;
Args const _args;
diff --git a/repos/base/include/base/shared_object.h b/repos/base/include/base/shared_object.h
index f4dd1622fe..7ffe5fa34c 100644
--- a/repos/base/include/base/shared_object.h
+++ b/repos/base/include/base/shared_object.h
@@ -128,7 +128,7 @@ class Genode::Dynamic_linker
struct Object_info
{
/* name of shared library, or "binary" for the main program */
- typedef String<64> Name;
+ typedef String<128> Name;
Name name;
Rom_dataspace_capability ds_cap;
diff --git a/repos/base/src/lib/ldso/include/file.h b/repos/base/src/lib/ldso/include/file.h
index a8875a781e..e06749f7ef 100644
--- a/repos/base/src/lib/ldso/include/file.h
+++ b/repos/base/src/lib/ldso/include/file.h
@@ -98,7 +98,7 @@ struct Linker::Elf_file : File
Ram_dataspace_capability ram_cap[Phdr::MAX_PHDR];
bool const loaded;
- typedef String<64> Name;
+ typedef String<128> Name;
Rom_dataspace_capability _rom_dataspace(Name const &name)
{
diff --git a/repos/libports/src/lib/libc/internal/types.h b/repos/libports/src/lib/libc/internal/types.h
index 233da10b47..afaee3f8d7 100644
--- a/repos/libports/src/lib/libc/internal/types.h
+++ b/repos/libports/src/lib/libc/internal/types.h
@@ -23,7 +23,7 @@ namespace Libc {
using namespace Genode;
typedef Genode::uint64_t uint64_t;
- typedef String<64> Binary_name;
+ typedef String<128> Binary_name;
}
#endif /* _LIBC__INTERNAL__TYPES_H_ */
diff --git a/repos/libports/src/lib/libc/kernel.cc b/repos/libports/src/lib/libc/kernel.cc
index 430295e7d5..bdb3c66598 100644
--- a/repos/libports/src/lib/libc/kernel.cc
+++ b/repos/libports/src/lib/libc/kernel.cc
@@ -300,7 +300,7 @@ void Libc::Kernel::_clone_state_from_parent()
/* clone RW segment of a shared library or the binary */
if (node.type() == "rw") {
- typedef String<64> Name;
+ typedef String<128> Name;
Name const name = node.attribute_value("name", Name());
/*
diff --git a/repos/os/src/lib/sandbox/child.h b/repos/os/src/lib/sandbox/child.h
index 030ccbd66d..5164d33ba5 100644
--- a/repos/os/src/lib/sandbox/child.h
+++ b/repos/os/src/lib/sandbox/child.h
@@ -119,7 +119,6 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup
throw Missing_name_attribute();
}
- typedef String<64> Name;
Name const _unique_name { _name_from_xml(_start_node->xml()) };
static Binary_name _binary_from_xml(Xml_node start_node,

View File

@ -1,39 +0,0 @@
From 55f35e33680287ba925accf3bddadaa46d5ff30a Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Sat, 7 Nov 2020 08:37:29 +0100
Subject: [PATCH] core: log ROM requests with affirmative "diag" flag
---
repos/base/src/core/include/rom_session_component.h | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/repos/base/src/core/include/rom_session_component.h b/repos/base/src/core/include/rom_session_component.h
index c584701f5f..2c93302e14 100644
--- a/repos/base/src/core/include/rom_session_component.h
+++ b/repos/base/src/core/include/rom_session_component.h
@@ -35,12 +35,20 @@ namespace Genode {
{
/* extract label */
Session_label const label = label_from_args(args);
+ auto const name = label.last_element();
+
+ /* extract diag flag */
+ bool diag = session_diag_from_args(args).enabled;
/* find ROM module for trailing label element */
- Rom_module const * rom = rom_fs.find(label.last_element().string());
- if (rom)
+ Rom_module const * rom = rom_fs.find(name.string());
+
+ if (rom) {
+ if (diag) log("serve ROM \"", name, "\" to \"", label, "\"");
return *rom;
+ }
+ error("ROM not found for ", args);
throw Service_denied();
}
--
2.29.2

View File

@ -1,57 +0,0 @@
commit 0df2ea0956e46f3914be01aa9d7b20a06d805e53
Author: Emery Hemingway <ehmry@posteo.net>
Date: Wed Apr 8 12:39:44 2020 +0530
cxx: align exception allocator to sixteen bytes
diff --git a/repos/base/src/lib/cxx/malloc_free.cc b/repos/base/src/lib/cxx/malloc_free.cc
index b551dfe627..870dbb6c6d 100644
--- a/repos/base/src/lib/cxx/malloc_free.cc
+++ b/repos/base/src/lib/cxx/malloc_free.cc
@@ -61,27 +61,23 @@ void Genode::init_cxx_heap(Env &env)
}
-typedef unsigned long Block_header;
+typedef size_t Block_header;
extern "C" void *malloc(size_t size)
{
- /* enforce size to be a multiple of 4 bytes */
- size = (size + 3) & ~3;
-
/*
- * We store the size of the allocation at the very
- * beginning of the allocated block and return
- * the subsequent address. This way, we can retrieve
- * the size information when freeing the block.
+ * We pad each allocation with 16 leading bytes for
+ * storing the size of the allocation. This way, we can
+ * retrieve the size information when freeing the block.
*/
- unsigned long real_size = size + sizeof(Block_header);
- void *addr = 0;
- if (!cxx_heap().alloc(real_size, &addr))
- return 0;
+ size_t real_size = size + 16;
+ addr_t real_addr = 0;
+ if (!cxx_heap().alloc(real_size, (void**)&real_addr))
+ return nullptr;
- *(Block_header *)addr = real_size;
- return (Block_header *)addr + 1;
+ *(Block_header *)real_addr = real_size;
+ return (void*)(real_addr + 16);
}
@@ -101,7 +97,7 @@ extern "C" void free(void *ptr)
{
if (!ptr) return;
- unsigned long *addr = ((unsigned long *)ptr) - 1;
+ unsigned long *addr = (unsigned long *)(addr_t(ptr) - 16);
cxx_heap().free(addr, *addr);
}

View File

@ -1,184 +0,0 @@
From 4250346b87b8e24a48d04ddacc77512eaa20ce0e Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Sat, 7 Nov 2020 11:23:03 +0100
Subject: [PATCH 1/3] base: fail on label truncation
---
repos/base/include/base/session_label.h | 27 ++++++++++++++++++++++---
repos/base/include/util/arg_string.h | 6 ++++++
2 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/repos/base/include/base/session_label.h b/repos/base/include/base/session_label.h
index d5e752d120..85034904e5 100644
--- a/repos/base/include/base/session_label.h
+++ b/repos/base/include/base/session_label.h
@@ -16,10 +16,14 @@
#define _INCLUDE__BASE__SESSION_LABEL_H_
#include <base/snprintf.h>
+#include <base/log.h>
#include <util/arg_string.h>
#include <util/string.h>
-namespace Genode { struct Session_label; }
+namespace Genode {
+ struct Session_label;
+ class Label_overflow : Exception { };
+}
struct Genode::Session_label : String<160>
{
@@ -33,6 +37,8 @@ struct Genode::Session_label : String<160>
using String = String<capacity()>;
using String::String;
+ /* TODO: String::String can still truncate and break labels */
+
/**
* Copy constructor
*
@@ -41,7 +47,13 @@ struct Genode::Session_label : String<160>
*/
template <size_t N>
Session_label(Genode::String<N> const &other)
- : Genode::String<160>(other) { }
+ : Genode::String<160>(other)
+ {
+ if (length() < other.length()) {
+ error(__func__, " overflow - «", other, "»");
+ throw Label_overflow();
+ }
+ }
Session_label last_element() const
{
@@ -90,8 +102,13 @@ namespace Genode {
inline Session_label label_from_args(char const *args)
{
char buf[Session_label::capacity()];
- Arg_string::find_arg(args, "label").string(buf, sizeof(buf), "");
+ auto arg = Arg_string::find_arg(args, "label");
+ if (Session_label::capacity() <= arg.length()) {
+ error(__func__, " overflow - «", (char const *)args, "»");
+ throw Label_overflow();
+ }
+ arg.string(buf, sizeof(buf), "");
return Session_label(Cstring(buf));
}
@@ -103,6 +120,10 @@ namespace Genode {
String<N2> const &label)
{
String<N1 + N2 + 4> const prefixed_label(prefix, " -> ", label);
+ if (Session_label::capacity() <= prefixed_label.length()) {
+ error(__func__, " overflow - «", prefix, "» - «", label, "»");
+ throw Label_overflow();
+ }
return Session_label(prefixed_label);
}
}
diff --git a/repos/base/include/util/arg_string.h b/repos/base/include/util/arg_string.h
index 610fbb16b3..48777e0c2a 100644
--- a/repos/base/include/util/arg_string.h
+++ b/repos/base/include/util/arg_string.h
@@ -114,6 +114,12 @@ class Genode::Arg
inline bool valid() const { return _key; }
+ size_t length() const
+ {
+ return _value.type() == Token::STRING
+ ? _value.len() - 2 : _value.len();
+ }
+
unsigned long ulong_value(unsigned long default_value) const
{
unsigned long value = 0;
--
2.30.0
From 252c08cf61ad7feef83bd2e542465330633ba41f Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Wed, 10 Feb 2021 13:32:42 +0100
Subject: [PATCH 2/3] Detect destroyed argument buffers at Env::session
Session request arguments are silently zeroed when their length
exceedes some buffer size.
---
repos/base/src/lib/base/component.cc | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/repos/base/src/lib/base/component.cc b/repos/base/src/lib/base/component.cc
index 568be31efb..913687ea7f 100644
--- a/repos/base/src/lib/base/component.cc
+++ b/repos/base/src/lib/base/component.cc
@@ -122,6 +122,10 @@ namespace {
Affinity const &affinity) override
{
Mutex::Guard guard(_mutex);
+ if (!args.valid_string()) {
+ error("invalid args for ", name.string(), " service request");
+ throw Service_denied();
+ }
/*
* Since we account for the backing store for session meta data on
--
2.30.0
From 53641e192bc3f9a756ae15b91640a42ac7e70918 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Thu, 11 Feb 2021 14:10:50 +0100
Subject: [PATCH 3/3] Increase session arguments buffer size to 240 bytes
---
repos/base/include/parent/parent.h | 2 +-
repos/base/include/root/root.h | 2 +-
repos/base/lib/symbols/ld | 2 ++
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/repos/base/include/parent/parent.h b/repos/base/include/parent/parent.h
index 7379342e5b..6e94047788 100644
--- a/repos/base/include/parent/parent.h
+++ b/repos/base/include/parent/parent.h
@@ -54,7 +54,7 @@ class Genode::Parent
public:
typedef Rpc_in_buffer<64> Service_name;
- typedef Rpc_in_buffer<160> Session_args;
+ typedef Rpc_in_buffer<240> Session_args;
typedef Rpc_in_buffer<160> Upgrade_args;
struct Client : Interface { typedef Id_space<Client>::Id Id; };
diff --git a/repos/base/include/root/root.h b/repos/base/include/root/root.h
index c7e3a0c908..4fda9e341f 100644
--- a/repos/base/include/root/root.h
+++ b/repos/base/include/root/root.h
@@ -29,7 +29,7 @@ namespace Genode {
struct Genode::Root
{
- typedef Rpc_in_buffer<160> Session_args;
+ typedef Rpc_in_buffer<240> Session_args;
typedef Rpc_in_buffer<160> Upgrade_args;
virtual ~Root() { }
diff --git a/repos/base/lib/symbols/ld b/repos/base/lib/symbols/ld
index 3cfbdd7466..d7603e8ca4 100644
--- a/repos/base/lib/symbols/ld
+++ b/repos/base/lib/symbols/ld
@@ -398,6 +398,8 @@ _ZThn236_N5Timer10Connection11set_timeoutEN6Genode12MicrosecondsERNS1_15Timeout_
_ZThn236_N5Timer10Connection9curr_timeEv T
_ZThn288_N5Timer10Connection11set_timeoutEN6Genode12MicrosecondsERNS1_15Timeout_handlerE T
_ZThn288_N5Timer10Connection9curr_timeEv T
+_ZThn368_N5Timer10Connection11set_timeoutEN6Genode12MicrosecondsERNS1_15Timeout_handlerE T
+_ZThn368_N5Timer10Connection9curr_timeEv T
_ZThn8_N6Genode17Timeout_scheduler14handle_timeoutENS_8DurationE T
_ZThn8_N6Genode17Timeout_schedulerD0Ev T
_ZThn8_N6Genode17Timeout_schedulerD1Ev T
--
2.30.0

View File

@ -1,90 +0,0 @@
From 8c4bb7d84838e8c01673caa8ad45a4c042ccdd11 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Mon, 6 Apr 2020 16:32:13 +0530
Subject: [PATCH] ld: support for loading read-only segments
---
repos/base/src/lib/ldso/include/file.h | 24 ++++++++++++++++++--
repos/base/src/lib/ldso/include/region_map.h | 10 ++++++++
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/repos/base/src/lib/ldso/include/file.h b/repos/base/src/lib/ldso/include/file.h
index 1c9ce53ca3..6688f0edd2 100644
--- a/repos/base/src/lib/ldso/include/file.h
+++ b/repos/base/src/lib/ldso/include/file.h
@@ -34,6 +34,9 @@ namespace Linker {
static inline bool is_rw(Elf::Phdr const &ph) {
return ((ph.p_flags & PF_MASK) == (PF_R | PF_W)); }
+
+ static inline bool is_ro(Elf::Phdr const &ph) {
+ return ((ph.p_flags & PF_MASK) == PF_R); }
}
@@ -280,15 +283,21 @@ struct Linker::Elf_file : File
else if (is_rw(*ph))
load_segment_rw(*ph, i);
+ else if (is_ro(*ph))
+ load_segment_ro(*ph);
+
else {
- error("LD: Non-RW/RX segment");
+ auto X = ph->p_flags & PF_X ? "X" : "-";
+ auto W = ph->p_flags & PF_W ? "W" : "-";
+ auto R = ph->p_flags & PF_R ? "R" : "-";
+ error("LD: unhandled ", X,W,R, " segment at file offset ", Hex(ph->p_offset));
throw Invalid_file();
}
}
}
/**
- * Map read-only segment
+ * Map read-execute-only segment
*/
void load_segment_rx(Elf::Phdr const &p)
{
@@ -318,6 +327,17 @@ struct Linker::Elf_file : File
env.rm().detach(src);
}
+ /**
+ * Map read-only segment
+ */
+ void load_segment_ro(Elf::Phdr const &p)
+ {
+ Region_map::r()->attach_readonly(rom_cap,
+ trunc_page(p.p_vaddr) + reloc_base,
+ round_page(p.p_memsz),
+ trunc_page(p.p_offset));
+ }
+
/**
* Unmap segements, RM regions, and free allocated dataspaces
*/
diff --git a/repos/base/src/lib/ldso/include/region_map.h b/repos/base/src/lib/ldso/include/region_map.h
index cbee34c639..b30c2221da 100644
--- a/repos/base/src/lib/ldso/include/region_map.h
+++ b/repos/base/src/lib/ldso/include/region_map.h
@@ -122,6 +122,16 @@ class Linker::Region_map
[&] () { _env.upgrade(Parent::Env::pd(), "ram_quota=8K"); });
}
+ Local_addr attach_readonly(Dataspace_capability ds, addr_t local_addr,
+ size_t size = 0, off_t offset = 0)
+ {
+ return retry<Genode::Out_of_ram>(
+ [&] () {
+ return _rm.attach(ds, size, offset, true, local_addr - _base, false, false);
+ },
+ [&] () { _env.upgrade(Parent::Env::pd(), "ram_quota=8K"); });
+ }
+
void detach(Local_addr local_addr) { _rm.detach((addr_t)local_addr - _base); }
};
--
2.28.0

View File

@ -1,27 +0,0 @@
From 45c73b01d4609f59ca576141bc836baad8e468ed Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Thu, 28 Jan 2021 13:39:29 +0100
Subject: [PATCH] genode_dyn.ld: do not emit PHDR segment
Recent version of binutils check that PHDR segments are covered
by a LOAD segment. In this case the unloaded PHDR segment can be
ommited.
---
repos/base/src/ld/genode_dyn.ld | 1 -
1 file changed, 1 deletion(-)
diff --git a/repos/base/src/ld/genode_dyn.ld b/repos/base/src/ld/genode_dyn.ld
index 5fa6ddc29e..57ec92f0f6 100644
--- a/repos/base/src/ld/genode_dyn.ld
+++ b/repos/base/src/ld/genode_dyn.ld
@@ -18,7 +18,6 @@
PHDRS
{
- phdr PT_PHDR PHDRS;
interp PT_INTERP;
ro PT_LOAD;
rw PT_LOAD;
--
2.29.2

View File

@ -1,7 +1,98 @@
From 735e7af9458005092451f448ddf3dfc1cad4acbd Mon Sep 17 00:00:00 2001 From bf2613eb22091125c0aff894e580063dac5e2bff Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Mon, 6 Apr 2020 16:32:13 +0530
Subject: [PATCH 01/16] ld: support for loading read-only segments
---
repos/base/src/lib/ldso/include/file.h | 24 ++++++++++++++++++--
repos/base/src/lib/ldso/include/region_map.h | 10 ++++++++
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/repos/base/src/lib/ldso/include/file.h b/repos/base/src/lib/ldso/include/file.h
index 1c9ce53ca3..6688f0edd2 100644
--- a/repos/base/src/lib/ldso/include/file.h
+++ b/repos/base/src/lib/ldso/include/file.h
@@ -34,6 +34,9 @@ namespace Linker {
static inline bool is_rw(Elf::Phdr const &ph) {
return ((ph.p_flags & PF_MASK) == (PF_R | PF_W)); }
+
+ static inline bool is_ro(Elf::Phdr const &ph) {
+ return ((ph.p_flags & PF_MASK) == PF_R); }
}
@@ -280,15 +283,21 @@ struct Linker::Elf_file : File
else if (is_rw(*ph))
load_segment_rw(*ph, i);
+ else if (is_ro(*ph))
+ load_segment_ro(*ph);
+
else {
- error("LD: Non-RW/RX segment");
+ auto X = ph->p_flags & PF_X ? "X" : "-";
+ auto W = ph->p_flags & PF_W ? "W" : "-";
+ auto R = ph->p_flags & PF_R ? "R" : "-";
+ error("LD: unhandled ", X,W,R, " segment at file offset ", Hex(ph->p_offset));
throw Invalid_file();
}
}
}
/**
- * Map read-only segment
+ * Map read-execute-only segment
*/
void load_segment_rx(Elf::Phdr const &p)
{
@@ -318,6 +327,17 @@ struct Linker::Elf_file : File
env.rm().detach(src);
}
+ /**
+ * Map read-only segment
+ */
+ void load_segment_ro(Elf::Phdr const &p)
+ {
+ Region_map::r()->attach_readonly(rom_cap,
+ trunc_page(p.p_vaddr) + reloc_base,
+ round_page(p.p_memsz),
+ trunc_page(p.p_offset));
+ }
+
/**
* Unmap segements, RM regions, and free allocated dataspaces
*/
diff --git a/repos/base/src/lib/ldso/include/region_map.h b/repos/base/src/lib/ldso/include/region_map.h
index 78d2c7033d..f17d6dfec0 100644
--- a/repos/base/src/lib/ldso/include/region_map.h
+++ b/repos/base/src/lib/ldso/include/region_map.h
@@ -130,6 +130,16 @@ class Linker::Region_map
[&] () { _env.upgrade(Parent::Env::pd(), "ram_quota=8K"); });
}
+ Local_addr attach_readonly(Dataspace_capability ds, addr_t local_addr,
+ size_t size = 0, off_t offset = 0)
+ {
+ return retry<Genode::Out_of_ram>(
+ [&] () {
+ return _rm.attach(ds, size, offset, true, local_addr - _base, false, false);
+ },
+ [&] () { _env.upgrade(Parent::Env::pd(), "ram_quota=8K"); });
+ }
+
void detach(Local_addr local_addr) { _rm.detach((addr_t)local_addr - _base); }
};
--
2.30.0
From 525ab24c481acdf9bb784cac36e663a20084b55b Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net> From: Emery Hemingway <ehmry@posteo.net>
Date: Sat, 25 Apr 2020 17:10:03 +0530 Date: Sat, 25 Apr 2020 17:10:03 +0530
Subject: [PATCH 1/4] init/sandbox: <routes> support Subject: [PATCH 02/16] init/sandbox: <routes> support
Apply routing rules to a child from a <routes> node at the top-level of Apply routing rules to a child from a <routes> node at the top-level of
a sandbox config, unless the corresponding start node has as <route> a sandbox config, unless the corresponding start node has as <route>
@ -180,14 +271,123 @@ index 7afcaebf00..36aab737f2 100644
if (!scoped_label) if (!scoped_label)
return false; return false;
-- --
2.29.2 2.30.0
From 0b65d7660784dbff4ef4fe392af686103c60a32d Mon Sep 17 00:00:00 2001 From 16106e96b1cf7639b050097b131b3be3cdbcf739 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Fri, 29 May 2020 18:42:57 +0530
Subject: [PATCH 03/16] Use 128-byte strings for session labels
Sixty-four bytes is insufficient for Nix store paths.
---
repos/base/include/base/child.h | 8 ++++----
repos/base/include/base/shared_object.h | 2 +-
repos/base/src/lib/ldso/include/file.h | 2 +-
repos/libports/src/lib/libc/internal/types.h | 2 +-
repos/libports/src/lib/libc/kernel.cc | 2 +-
repos/os/src/lib/sandbox/child.h | 1 -
6 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/repos/base/include/base/child.h b/repos/base/include/base/child.h
index 8c7b33a9d9..3bd6483547 100644
--- a/repos/base/include/base/child.h
+++ b/repos/base/include/base/child.h
@@ -44,9 +44,9 @@ namespace Genode {
*/
struct Genode::Child_policy
{
- typedef String<64> Name;
- typedef String<64> Binary_name;
- typedef String<64> Linker_name;
+ typedef String<128> Name;
+ typedef String<128> Binary_name;
+ typedef String<128> Linker_name;
virtual ~Child_policy() { }
@@ -407,7 +407,7 @@ class Genode::Child : protected Rpc_object<Parent>,
Id_space<Parent::Client>::Id const _client_id;
- typedef String<64> Label;
+ typedef String<128> Label;
Args const _args;
diff --git a/repos/base/include/base/shared_object.h b/repos/base/include/base/shared_object.h
index f4dd1622fe..7ffe5fa34c 100644
--- a/repos/base/include/base/shared_object.h
+++ b/repos/base/include/base/shared_object.h
@@ -128,7 +128,7 @@ class Genode::Dynamic_linker
struct Object_info
{
/* name of shared library, or "binary" for the main program */
- typedef String<64> Name;
+ typedef String<128> Name;
Name name;
Rom_dataspace_capability ds_cap;
diff --git a/repos/base/src/lib/ldso/include/file.h b/repos/base/src/lib/ldso/include/file.h
index 6688f0edd2..e763264eee 100644
--- a/repos/base/src/lib/ldso/include/file.h
+++ b/repos/base/src/lib/ldso/include/file.h
@@ -101,7 +101,7 @@ struct Linker::Elf_file : File
Ram_dataspace_capability ram_cap[Phdr::MAX_PHDR];
bool const loaded;
- typedef String<64> Name;
+ typedef String<128> Name;
Rom_dataspace_capability _rom_dataspace(Name const &name)
{
diff --git a/repos/libports/src/lib/libc/internal/types.h b/repos/libports/src/lib/libc/internal/types.h
index 233da10b47..afaee3f8d7 100644
--- a/repos/libports/src/lib/libc/internal/types.h
+++ b/repos/libports/src/lib/libc/internal/types.h
@@ -23,7 +23,7 @@ namespace Libc {
using namespace Genode;
typedef Genode::uint64_t uint64_t;
- typedef String<64> Binary_name;
+ typedef String<128> Binary_name;
}
#endif /* _LIBC__INTERNAL__TYPES_H_ */
diff --git a/repos/libports/src/lib/libc/kernel.cc b/repos/libports/src/lib/libc/kernel.cc
index ac208b223e..3b81be01a9 100644
--- a/repos/libports/src/lib/libc/kernel.cc
+++ b/repos/libports/src/lib/libc/kernel.cc
@@ -364,7 +364,7 @@ void Libc::Kernel::_clone_state_from_parent()
/* clone RW segment of a shared library or the binary */
if (node.type() == "rw") {
- typedef String<64> Name;
+ typedef String<128> Name;
Name const name = node.attribute_value("name", Name());
/*
diff --git a/repos/os/src/lib/sandbox/child.h b/repos/os/src/lib/sandbox/child.h
index 81836a2045..f7b41ddd5b 100644
--- a/repos/os/src/lib/sandbox/child.h
+++ b/repos/os/src/lib/sandbox/child.h
@@ -128,7 +128,6 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup
throw Missing_name_attribute();
}
- typedef String<64> Name;
Name const _unique_name { _name_from_xml(_start_node->xml()) };
static Binary_name _binary_from_xml(Xml_node start_node,
--
2.30.0
From 3f38eacb25348a811f37ce267323253b1941cad2 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net> From: Emery Hemingway <ehmry@posteo.net>
Date: Wed, 4 Nov 2020 11:03:49 +0100 Date: Wed, 4 Nov 2020 11:03:49 +0100
Subject: [PATCH 2/4] init/sandbox: do not parse <parent-provides> if <routes> Subject: [PATCH 04/16] init/sandbox: do not parse <parent-provides> if
is present <routes> is present
--- ---
repos/os/src/lib/sandbox/library.cc | 124 +++++++++++++++++++--------- repos/os/src/lib/sandbox/library.cc | 124 +++++++++++++++++++---------
@ -331,13 +531,13 @@ index 30d0f2dfc1..caa9840ea6 100644
-- --
2.29.2 2.30.0
From 67d834c4556969e37bc050e151baeedddfb05ac9 Mon Sep 17 00:00:00 2001 From ef28369a1e6ba0f8910da3a6cb757f9e5ec334ad Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net> From: Emery Hemingway <ehmry@posteo.net>
Date: Wed, 4 Nov 2020 20:02:03 +0100 Date: Wed, 4 Nov 2020 20:02:03 +0100
Subject: [PATCH 3/4] init/sandbox: simplify routing Subject: [PATCH 05/16] init/sandbox: simplify routing
MIME-Version: 1.0 MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
@ -535,7 +735,7 @@ index d25e3d9683..46aa22411c 100644
_default_caps_accessor(default_caps_accessor), _default_caps_accessor(default_caps_accessor),
_ram_limit_accessor(ram_limit_accessor), _ram_limit_accessor(ram_limit_accessor),
diff --git a/repos/os/src/lib/sandbox/child.h b/repos/os/src/lib/sandbox/child.h diff --git a/repos/os/src/lib/sandbox/child.h b/repos/os/src/lib/sandbox/child.h
index 81836a2045..f9d04cfdaf 100644 index f7b41ddd5b..fd254d7f49 100644
--- a/repos/os/src/lib/sandbox/child.h --- a/repos/os/src/lib/sandbox/child.h
+++ b/repos/os/src/lib/sandbox/child.h +++ b/repos/os/src/lib/sandbox/child.h
@@ -49,7 +49,6 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup @@ -49,7 +49,6 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup
@ -554,7 +754,7 @@ index 81836a2045..f9d04cfdaf 100644
Routes_accessor &_routes_accessor; Routes_accessor &_routes_accessor;
Default_caps_accessor &_default_caps_accessor; Default_caps_accessor &_default_caps_accessor;
Ram_limit_accessor &_ram_limit_accessor; Ram_limit_accessor &_ram_limit_accessor;
@@ -481,7 +479,6 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup @@ -480,7 +478,6 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup
Id id, Id id,
Report_update_trigger &report_update_trigger, Report_update_trigger &report_update_trigger,
Xml_node start_node, Xml_node start_node,
@ -697,13 +897,182 @@ index 36aab737f2..639a4be4dd 100644
* Find service with certain values in given registry * Find service with certain values in given registry
* *
-- --
2.29.2 2.30.0
From 92c1f192d432f177c681e3ab001214e66e96e0f0 Mon Sep 17 00:00:00 2001 From 79ae552230809f62e1717a08f5ce9a63c044abf9 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Sat, 7 Nov 2020 08:37:29 +0100
Subject: [PATCH 06/16] core: log ROM requests with affirmative "diag" flag
---
repos/base/src/core/include/rom_session_component.h | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/repos/base/src/core/include/rom_session_component.h b/repos/base/src/core/include/rom_session_component.h
index c584701f5f..2c93302e14 100644
--- a/repos/base/src/core/include/rom_session_component.h
+++ b/repos/base/src/core/include/rom_session_component.h
@@ -35,12 +35,20 @@ namespace Genode {
{
/* extract label */
Session_label const label = label_from_args(args);
+ auto const name = label.last_element();
+
+ /* extract diag flag */
+ bool diag = session_diag_from_args(args).enabled;
/* find ROM module for trailing label element */
- Rom_module const * rom = rom_fs.find(label.last_element().string());
- if (rom)
+ Rom_module const * rom = rom_fs.find(name.string());
+
+ if (rom) {
+ if (diag) log("serve ROM \"", name, "\" to \"", label, "\"");
return *rom;
+ }
+ error("ROM not found for ", args);
throw Service_denied();
}
--
2.30.0
From 0e1ea49ea6ce4f85e2e30a01aa5ace7928b20267 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Sat, 7 Nov 2020 11:23:03 +0100
Subject: [PATCH 07/16] base: fail on label truncation
---
repos/base/include/base/session_label.h | 27 ++++++++++++++++++++++---
repos/base/include/util/arg_string.h | 6 ++++++
2 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/repos/base/include/base/session_label.h b/repos/base/include/base/session_label.h
index d5e752d120..85034904e5 100644
--- a/repos/base/include/base/session_label.h
+++ b/repos/base/include/base/session_label.h
@@ -16,10 +16,14 @@
#define _INCLUDE__BASE__SESSION_LABEL_H_
#include <base/snprintf.h>
+#include <base/log.h>
#include <util/arg_string.h>
#include <util/string.h>
-namespace Genode { struct Session_label; }
+namespace Genode {
+ struct Session_label;
+ class Label_overflow : Exception { };
+}
struct Genode::Session_label : String<160>
{
@@ -33,6 +37,8 @@ struct Genode::Session_label : String<160>
using String = String<capacity()>;
using String::String;
+ /* TODO: String::String can still truncate and break labels */
+
/**
* Copy constructor
*
@@ -41,7 +47,13 @@ struct Genode::Session_label : String<160>
*/
template <size_t N>
Session_label(Genode::String<N> const &other)
- : Genode::String<160>(other) { }
+ : Genode::String<160>(other)
+ {
+ if (length() < other.length()) {
+ error(__func__, " overflow - «", other, "»");
+ throw Label_overflow();
+ }
+ }
Session_label last_element() const
{
@@ -90,8 +102,13 @@ namespace Genode {
inline Session_label label_from_args(char const *args)
{
char buf[Session_label::capacity()];
- Arg_string::find_arg(args, "label").string(buf, sizeof(buf), "");
+ auto arg = Arg_string::find_arg(args, "label");
+ if (Session_label::capacity() <= arg.length()) {
+ error(__func__, " overflow - «", (char const *)args, "»");
+ throw Label_overflow();
+ }
+ arg.string(buf, sizeof(buf), "");
return Session_label(Cstring(buf));
}
@@ -103,6 +120,10 @@ namespace Genode {
String<N2> const &label)
{
String<N1 + N2 + 4> const prefixed_label(prefix, " -> ", label);
+ if (Session_label::capacity() <= prefixed_label.length()) {
+ error(__func__, " overflow - «", prefix, "» - «", label, "»");
+ throw Label_overflow();
+ }
return Session_label(prefixed_label);
}
}
diff --git a/repos/base/include/util/arg_string.h b/repos/base/include/util/arg_string.h
index 610fbb16b3..48777e0c2a 100644
--- a/repos/base/include/util/arg_string.h
+++ b/repos/base/include/util/arg_string.h
@@ -114,6 +114,12 @@ class Genode::Arg
inline bool valid() const { return _key; }
+ size_t length() const
+ {
+ return _value.type() == Token::STRING
+ ? _value.len() - 2 : _value.len();
+ }
+
unsigned long ulong_value(unsigned long default_value) const
{
unsigned long value = 0;
--
2.30.0
From 2c193324a6702e123c8cafabda45c30c7ca09257 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Sat, 7 Nov 2020 13:49:41 +0100
Subject: [PATCH 08/16] init: log error when configuration cannot be parsed
---
repos/os/src/init/main.cc | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/repos/os/src/init/main.cc b/repos/os/src/init/main.cc
index 7b69c95721..f1c1a1435a 100644
--- a/repos/os/src/init/main.cc
+++ b/repos/os/src/init/main.cc
@@ -47,6 +47,10 @@ struct Init::Main : Sandbox::State_handler
_config.update();
Xml_node const config = _config.xml();
+ if (config.has_type("empty")) {
+ error("failed to parse config ROM");
+ return;
+ };
bool reporter_enabled = false;
config.with_sub_node("report", [&] (Xml_node report) {
--
2.30.0
From 5d07e900e3c7f0fe507844bccc5f168bad046a3c Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net> From: Emery Hemingway <ehmry@posteo.net>
Date: Sat, 28 Nov 2020 14:00:49 +0100 Date: Sat, 28 Nov 2020 14:00:49 +0100
Subject: [PATCH 4/4] Do not default Child::binary_name() to Child::name() Subject: [PATCH 09/16] Do not default Child::binary_name() to Child::name()
--- ---
repos/base/include/base/child.h | 2 +- repos/base/include/base/child.h | 2 +-
@ -712,7 +1081,7 @@ Subject: [PATCH 4/4] Do not default Child::binary_name() to Child::name()
3 files changed, 4 insertions(+), 1 deletion(-) 3 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/repos/base/include/base/child.h b/repos/base/include/base/child.h diff --git a/repos/base/include/base/child.h b/repos/base/include/base/child.h
index 8c7b33a9d9..bca0d566f2 100644 index 3bd6483547..a00e59e3a4 100644
--- a/repos/base/include/base/child.h --- a/repos/base/include/base/child.h
+++ b/repos/base/include/base/child.h +++ b/repos/base/include/base/child.h
@@ -58,7 +58,7 @@ struct Genode::Child_policy @@ -58,7 +58,7 @@ struct Genode::Child_policy
@ -738,10 +1107,10 @@ index d480585221..7acacf0ffd 100644
Session_label const &label) override Session_label const &label) override
{ {
diff --git a/repos/os/src/lib/sandbox/child.h b/repos/os/src/lib/sandbox/child.h diff --git a/repos/os/src/lib/sandbox/child.h b/repos/os/src/lib/sandbox/child.h
index f9d04cfdaf..a1e45dab0d 100644 index fd254d7f49..036e7f8fc2 100644
--- a/repos/os/src/lib/sandbox/child.h --- a/repos/os/src/lib/sandbox/child.h
+++ b/repos/os/src/lib/sandbox/child.h +++ b/repos/os/src/lib/sandbox/child.h
@@ -595,6 +595,7 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup @@ -594,6 +594,7 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup
****************************/ ****************************/
Child_policy::Name name() const override { return _unique_name; } Child_policy::Name name() const override { return _unique_name; }
@ -750,5 +1119,320 @@ index f9d04cfdaf..a1e45dab0d 100644
Pd_session &ref_pd() override { return _env.pd(); } Pd_session &ref_pd() override { return _env.pd(); }
Pd_session_capability ref_pd_cap() const override { return _env.pd_session_cap(); } Pd_session_capability ref_pd_cap() const override { return _env.pd_session_cap(); }
-- --
2.29.2 2.30.0
From 0ac7fd14676b451e11b74c9e66f7de265b3ee4e6 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Thu, 3 Dec 2020 12:19:10 +0100
Subject: [PATCH 10/16] vfs: create missing root directories for writeable
sessions
This is the expected behavior.
---
repos/os/src/server/vfs/main.cc | 47 ++++++++++++++++++++++++++++++---
1 file changed, 43 insertions(+), 4 deletions(-)
diff --git a/repos/os/src/server/vfs/main.cc b/repos/os/src/server/vfs/main.cc
index b780b1fdd7..358afd28a9 100644
--- a/repos/os/src/server/vfs/main.cc
+++ b/repos/os/src/server/vfs/main.cc
@@ -841,6 +841,41 @@ class Vfs_server::Root : public Genode::Root_component<Session_component>,
Genode::Signal_transmitter(_reactivate_handler).submit();
}
+ /**
+ * Open a directory, ensuring all parent directories exists.
+ */
+ void _create_session_dir(Path const &path)
+ {
+ using namespace Genode;
+ typedef Vfs::Directory_service::Opendir_result Result;
+
+ Vfs_handle *handle { nullptr };
+ Vfs::File_system &vfs = _vfs_env.root_dir();
+
+ switch (vfs.opendir(path.string(), true, &handle, _vfs_heap)) {
+ case Result::OPENDIR_OK:
+ handle->close();
+ return;
+ case Result::OPENDIR_ERR_NODE_ALREADY_EXISTS:
+ if (vfs.directory(path.string())) return;
+ break;
+ case Result::OPENDIR_ERR_LOOKUP_FAILED: {
+ Path parent = path;
+ parent.strip_last_element();
+ _create_session_dir(parent.string());
+ auto res = vfs.opendir(path.string(), true, &handle, _vfs_heap);
+ if (res == Result::OPENDIR_OK) {
+ handle->close();
+ return;
+ }
+ }
+ default: break;
+ }
+
+ error("cannot create session root at ", path);
+ throw Service_denied();
+ }
+
protected:
Session_component *_create_session(const char *args) override
@@ -916,10 +951,14 @@ class Vfs_server::Root : public Genode::Root_component<Session_component>,
}
/* check if the session root exists */
- if (!((session_root == "/")
- || _vfs_env.root_dir().directory(session_root.base()))) {
- error("session root '", session_root, "' not found for '", label, "'");
- throw Service_denied();
+ if (session_root != "/") {
+ if (!_vfs_env.root_dir().directory(session_root.base())) {
+ if (writeable) { _create_session_dir(session_root); }
+ else {
+ error("session root '", session_root, "' not found for '", label, "'");
+ throw Service_denied();
+ }
+ }
}
Session_component *session = new (md_alloc())
--
2.30.0
From 6842e2d0c2c784d224a9d7bc100e491545b8e5e6 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Thu, 28 Jan 2021 13:39:29 +0100
Subject: [PATCH 11/16] genode_dyn.ld: do not emit PHDR segment
Recent version of binutils check that PHDR segments are covered
by a LOAD segment. In this case the unloaded PHDR segment can be
ommited.
---
repos/base/src/ld/genode_dyn.ld | 1 -
1 file changed, 1 deletion(-)
diff --git a/repos/base/src/ld/genode_dyn.ld b/repos/base/src/ld/genode_dyn.ld
index 5fa6ddc29e..57ec92f0f6 100644
--- a/repos/base/src/ld/genode_dyn.ld
+++ b/repos/base/src/ld/genode_dyn.ld
@@ -18,7 +18,6 @@
PHDRS
{
- phdr PT_PHDR PHDRS;
interp PT_INTERP;
ro PT_LOAD;
rw PT_LOAD;
--
2.30.0
From ff8ffb77ccf4238001abd7253c45dece86fe8983 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Wed, 3 Feb 2021 15:20:39 +0100
Subject: [PATCH 12/16] vfs: support for loading plugins by label
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Make the VFS plugin recognize <plugin label="…"/> nodes.
---
repos/os/src/lib/vfs/file_system_factory.cc | 33 ++++++++++++++++-----
1 file changed, 26 insertions(+), 7 deletions(-)
diff --git a/repos/os/src/lib/vfs/file_system_factory.cc b/repos/os/src/lib/vfs/file_system_factory.cc
index 5cdf20e8e3..1cf5d587ea 100644
--- a/repos/os/src/lib/vfs/file_system_factory.cc
+++ b/repos/os/src/lib/vfs/file_system_factory.cc
@@ -56,8 +56,16 @@ struct Vfs::Global_file_system_factory::Entry_base : Vfs::File_system_factory,
Entry_base(Fs_type_name const &name) : name(name) { }
- bool matches(Genode::Xml_node node) const {
- return node.has_type(name.string()); }
+ bool matches(Genode::Xml_node node) const
+ {
+ if (node.has_type(name.string()))
+ return true;
+
+ if (node.has_type("plugin") && node.has_attribute("load"))
+ return node.attribute("load").has_value(name.string());
+
+ return false;
+ }
};
@@ -165,14 +173,25 @@ Vfs::File_system_factory &Vfs::Global_file_system_factory::_load_factory(Vfs::En
bool Vfs::Global_file_system_factory::_probe_external_factory(Vfs::Env &env,
Genode::Xml_node node)
{
- Library_name const lib_name = _library_name(node.type());
-
try {
- _list.insert(new (env.alloc())
- External_entry(node.type().string(), _load_factory(env, lib_name)));
- return true;
+ if (node.has_type("plugin")) {
+ Library_name const lib_name = node.attribute_value("load", Library_name(""));
+
+ if (lib_name == "") {
+ error("missing \"load\" attribute at ", node);
+ return false;
+ }
+ _list.insert(new (env.alloc())
+ External_entry(lib_name.string(), _load_factory(env, lib_name)));
+ } else {
+ Library_name const lib_name = _library_name(node.type());
+
+ _list.insert(new (env.alloc())
+ External_entry(node.type().string(), _load_factory(env, lib_name)));
+ }
} catch (Factory_not_available) { return false; }
+ return true;
}
--
2.30.0
From 490fb611ceaad9ae67af35c22ac40dd65ddd7a42 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Wed, 3 Feb 2021 17:33:24 +0100
Subject: [PATCH 13/16] vfs: increase the capacity of tar ROM labels to 128
---
repos/os/src/lib/vfs/tar_file_system.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/repos/os/src/lib/vfs/tar_file_system.h b/repos/os/src/lib/vfs/tar_file_system.h
index d9941deb5f..fcb06a1459 100644
--- a/repos/os/src/lib/vfs/tar_file_system.h
+++ b/repos/os/src/lib/vfs/tar_file_system.h
@@ -27,7 +27,7 @@ class Vfs::Tar_file_system : public File_system
Genode::Env &_env;
Genode::Allocator &_alloc;
- typedef Genode::String<64> Rom_name;
+ typedef Genode::String<128> Rom_name;
Rom_name _rom_name;
Genode::Attached_rom_dataspace _tar_ds { _env, _rom_name.string() };
--
2.30.0
From a9900477faf8d9d41dbe3fa59a0b40ce5cab037f Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Wed, 10 Feb 2021 13:32:42 +0100
Subject: [PATCH 14/16] Detect destroyed argument buffers at Env::session
Session request arguments are silently zeroed when their length
exceedes some buffer size.
---
repos/base/src/lib/base/component.cc | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/repos/base/src/lib/base/component.cc b/repos/base/src/lib/base/component.cc
index 568be31efb..913687ea7f 100644
--- a/repos/base/src/lib/base/component.cc
+++ b/repos/base/src/lib/base/component.cc
@@ -122,6 +122,10 @@ namespace {
Affinity const &affinity) override
{
Mutex::Guard guard(_mutex);
+ if (!args.valid_string()) {
+ error("invalid args for ", name.string(), " service request");
+ throw Service_denied();
+ }
/*
* Since we account for the backing store for session meta data on
--
2.30.0
From d2da7f94d328336ab6ac618ff5779ae8093c5e9d Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Thu, 11 Feb 2021 14:10:50 +0100
Subject: [PATCH 15/16] Increase session arguments buffer size to 240 bytes
---
repos/base/include/parent/parent.h | 2 +-
repos/base/include/root/root.h | 2 +-
repos/base/lib/symbols/ld | 2 ++
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/repos/base/include/parent/parent.h b/repos/base/include/parent/parent.h
index 7379342e5b..6e94047788 100644
--- a/repos/base/include/parent/parent.h
+++ b/repos/base/include/parent/parent.h
@@ -54,7 +54,7 @@ class Genode::Parent
public:
typedef Rpc_in_buffer<64> Service_name;
- typedef Rpc_in_buffer<160> Session_args;
+ typedef Rpc_in_buffer<240> Session_args;
typedef Rpc_in_buffer<160> Upgrade_args;
struct Client : Interface { typedef Id_space<Client>::Id Id; };
diff --git a/repos/base/include/root/root.h b/repos/base/include/root/root.h
index c7e3a0c908..4fda9e341f 100644
--- a/repos/base/include/root/root.h
+++ b/repos/base/include/root/root.h
@@ -29,7 +29,7 @@ namespace Genode {
struct Genode::Root
{
- typedef Rpc_in_buffer<160> Session_args;
+ typedef Rpc_in_buffer<240> Session_args;
typedef Rpc_in_buffer<160> Upgrade_args;
virtual ~Root() { }
diff --git a/repos/base/lib/symbols/ld b/repos/base/lib/symbols/ld
index 3cfbdd7466..d7603e8ca4 100644
--- a/repos/base/lib/symbols/ld
+++ b/repos/base/lib/symbols/ld
@@ -398,6 +398,8 @@ _ZThn236_N5Timer10Connection11set_timeoutEN6Genode12MicrosecondsERNS1_15Timeout_
_ZThn236_N5Timer10Connection9curr_timeEv T
_ZThn288_N5Timer10Connection11set_timeoutEN6Genode12MicrosecondsERNS1_15Timeout_handlerE T
_ZThn288_N5Timer10Connection9curr_timeEv T
+_ZThn368_N5Timer10Connection11set_timeoutEN6Genode12MicrosecondsERNS1_15Timeout_handlerE T
+_ZThn368_N5Timer10Connection9curr_timeEv T
_ZThn8_N6Genode17Timeout_scheduler14handle_timeoutENS_8DurationE T
_ZThn8_N6Genode17Timeout_schedulerD0Ev T
_ZThn8_N6Genode17Timeout_schedulerD1Ev T
--
2.30.0
From 9b1a5e00ba1fc7fccfec5ba6671c6e80e428f129 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Fri, 19 Feb 2021 16:09:23 +0100
Subject: [PATCH 16/16] ldso: increase size of library names
---
repos/base/src/lib/ldso/include/config.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/repos/base/src/lib/ldso/include/config.h b/repos/base/src/lib/ldso/include/config.h
index 5708df0930..db9014a95b 100644
--- a/repos/base/src/lib/ldso/include/config.h
+++ b/repos/base/src/lib/ldso/include/config.h
@@ -58,7 +58,7 @@ class Linker::Config : Noncopyable
bool verbose() const { return _verbose; }
bool check_ctors() const { return _check_ctors; }
- typedef String<100> Rom_name;
+ typedef String<128> Rom_name;
/**
* Call fn for each library specified in the configuration
--
2.30.0

View File

@ -1,176 +0,0 @@
From a3063497d9aaf6bf06a3797804135105ad5f3bad Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Thu, 3 Dec 2020 12:19:10 +0100
Subject: [PATCH 1/3] vfs: create missing root directories for writeable
sessions
This is the expected behavior.
---
repos/os/src/server/vfs/main.cc | 47 ++++++++++++++++++++++++++++++---
1 file changed, 43 insertions(+), 4 deletions(-)
diff --git a/repos/os/src/server/vfs/main.cc b/repos/os/src/server/vfs/main.cc
index b780b1fdd7..358afd28a9 100644
--- a/repos/os/src/server/vfs/main.cc
+++ b/repos/os/src/server/vfs/main.cc
@@ -841,6 +841,41 @@ class Vfs_server::Root : public Genode::Root_component<Session_component>,
Genode::Signal_transmitter(_reactivate_handler).submit();
}
+ /**
+ * Open a directory, ensuring all parent directories exists.
+ */
+ void _create_session_dir(Path const &path)
+ {
+ using namespace Genode;
+ typedef Vfs::Directory_service::Opendir_result Result;
+
+ Vfs_handle *handle { nullptr };
+ Vfs::File_system &vfs = _vfs_env.root_dir();
+
+ switch (vfs.opendir(path.string(), true, &handle, _vfs_heap)) {
+ case Result::OPENDIR_OK:
+ handle->close();
+ return;
+ case Result::OPENDIR_ERR_NODE_ALREADY_EXISTS:
+ if (vfs.directory(path.string())) return;
+ break;
+ case Result::OPENDIR_ERR_LOOKUP_FAILED: {
+ Path parent = path;
+ parent.strip_last_element();
+ _create_session_dir(parent.string());
+ auto res = vfs.opendir(path.string(), true, &handle, _vfs_heap);
+ if (res == Result::OPENDIR_OK) {
+ handle->close();
+ return;
+ }
+ }
+ default: break;
+ }
+
+ error("cannot create session root at ", path);
+ throw Service_denied();
+ }
+
protected:
Session_component *_create_session(const char *args) override
@@ -916,10 +951,14 @@ class Vfs_server::Root : public Genode::Root_component<Session_component>,
}
/* check if the session root exists */
- if (!((session_root == "/")
- || _vfs_env.root_dir().directory(session_root.base()))) {
- error("session root '", session_root, "' not found for '", label, "'");
- throw Service_denied();
+ if (session_root != "/") {
+ if (!_vfs_env.root_dir().directory(session_root.base())) {
+ if (writeable) { _create_session_dir(session_root); }
+ else {
+ error("session root '", session_root, "' not found for '", label, "'");
+ throw Service_denied();
+ }
+ }
}
Session_component *session = new (md_alloc())
--
2.30.0
From 0c91101db93422a4ff0aa2407b0ac7610abcf14f Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Wed, 3 Feb 2021 15:20:39 +0100
Subject: [PATCH 2/3] vfs: support for loading plugins by label
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Make the VFS plugin recognize <plugin label="…"/> nodes.
---
repos/os/src/lib/vfs/file_system_factory.cc | 33 ++++++++++++++++-----
1 file changed, 26 insertions(+), 7 deletions(-)
diff --git a/repos/os/src/lib/vfs/file_system_factory.cc b/repos/os/src/lib/vfs/file_system_factory.cc
index 5cdf20e8e3..1cf5d587ea 100644
--- a/repos/os/src/lib/vfs/file_system_factory.cc
+++ b/repos/os/src/lib/vfs/file_system_factory.cc
@@ -56,8 +56,16 @@ struct Vfs::Global_file_system_factory::Entry_base : Vfs::File_system_factory,
Entry_base(Fs_type_name const &name) : name(name) { }
- bool matches(Genode::Xml_node node) const {
- return node.has_type(name.string()); }
+ bool matches(Genode::Xml_node node) const
+ {
+ if (node.has_type(name.string()))
+ return true;
+
+ if (node.has_type("plugin") && node.has_attribute("load"))
+ return node.attribute("load").has_value(name.string());
+
+ return false;
+ }
};
@@ -165,14 +173,25 @@ Vfs::File_system_factory &Vfs::Global_file_system_factory::_load_factory(Vfs::En
bool Vfs::Global_file_system_factory::_probe_external_factory(Vfs::Env &env,
Genode::Xml_node node)
{
- Library_name const lib_name = _library_name(node.type());
-
try {
- _list.insert(new (env.alloc())
- External_entry(node.type().string(), _load_factory(env, lib_name)));
- return true;
+ if (node.has_type("plugin")) {
+ Library_name const lib_name = node.attribute_value("load", Library_name(""));
+
+ if (lib_name == "") {
+ error("missing \"load\" attribute at ", node);
+ return false;
+ }
+ _list.insert(new (env.alloc())
+ External_entry(lib_name.string(), _load_factory(env, lib_name)));
+ } else {
+ Library_name const lib_name = _library_name(node.type());
+
+ _list.insert(new (env.alloc())
+ External_entry(node.type().string(), _load_factory(env, lib_name)));
+ }
} catch (Factory_not_available) { return false; }
+ return true;
}
--
2.30.0
From d2b15cb52415d18b9611862d9d184effc596bba6 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Wed, 3 Feb 2021 17:33:24 +0100
Subject: [PATCH 3/3] vfs: increase the capacity of tar ROM labels to 128
---
repos/os/src/lib/vfs/tar_file_system.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/repos/os/src/lib/vfs/tar_file_system.h b/repos/os/src/lib/vfs/tar_file_system.h
index d9941deb5f..fcb06a1459 100644
--- a/repos/os/src/lib/vfs/tar_file_system.h
+++ b/repos/os/src/lib/vfs/tar_file_system.h
@@ -27,7 +27,7 @@ class Vfs::Tar_file_system : public File_system
Genode::Env &_env;
Genode::Allocator &_alloc;
- typedef Genode::String<64> Rom_name;
+ typedef Genode::String<128> Rom_name;
Rom_name _rom_name;
Genode::Attached_rom_dataspace _tar_ds { _env, _rom_name.string() };
--
2.30.0

View File

@ -1,27 +0,0 @@
From 3898cf557ada28312731292074a8a09621d45abb Mon Sep 17 00:00:00 2001
From: Emery Hemingway <ehmry@posteo.net>
Date: Sat, 7 Nov 2020 13:49:41 +0100
Subject: [PATCH] init: log error when configuration cannot be parsed
---
repos/os/src/init/main.cc | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/repos/os/src/init/main.cc b/repos/os/src/init/main.cc
index 7b69c95721..f1c1a1435a 100644
--- a/repos/os/src/init/main.cc
+++ b/repos/os/src/init/main.cc
@@ -47,6 +47,10 @@ struct Init::Main : Sandbox::State_handler
_config.update();
Xml_node const config = _config.xml();
+ if (config.has_type("empty")) {
+ error("failed to parse config ROM");
+ return;
+ };
bool reporter_enabled = false;
config.with_sub_node("report", [&] (Xml_node report) {
--
2.28.0