diff --git a/packages/genodelabs/default.nix b/packages/genodelabs/default.nix index b04a7d3..8e4edcd 100644 --- a/packages/genodelabs/default.nix +++ b/packages/genodelabs/default.nix @@ -35,11 +35,7 @@ let version = builtins.substring 0 7 upstreamSources.rev; src = upstreamSources; nativeBuildInputs = [ expect gnumake tcl ]; - patches = [ - ./patches/binary-labels.patch - ./patches/label-fail.patch - ./patches/phdr.patch - ]; + patches = [ ./patches/sources.patch ]; configurePhase = '' patchShebangs ./tool 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 // { genodeSources = genodeSources // { @@ -353,7 +343,6 @@ in makePackages // depotPackages // { KERNEL = "hw"; BOARD = "pc"; targets = [ "bootstrap" "core" "timer" "lib/ld" ]; - patches = basePatches; postInstall = '' mv $out/lib/ld-hw.lib.so $out/lib/ld.lib.so mv $out/bin/hw_timer_drv $out/bin/timer_drv @@ -369,7 +358,6 @@ in makePackages // depotPackages // { KERNEL = "hw"; BOARD = "virt_qemu"; targets = [ "bootstrap" "core" "timer" "lib/ld" ]; - patches = basePatches; postInstall = '' mv $out/lib/ld-hw.lib.so $out/lib/ld.lib.so mv $out/bin/hw_timer_drv $out/bin/timer_drv @@ -384,7 +372,6 @@ in makePackages // depotPackages // { KERNEL = "linux"; BOARD = "linux"; targets = [ "core" "timer" "lib/ld" ]; - patches = basePatches; postInstall = '' mv $out/lib/ld-linux.lib.so $out/lib/ld.lib.so mv $out/bin/linux_timer_drv $out/bin/timer_drv @@ -397,7 +384,6 @@ in makePackages // depotPackages // { outputs = [ "out" "coreObj" ]; KERNEL = "nova"; targets = [ "core" "timer" "lib/ld" ]; - patches = basePatches; postInstall = '' mv $out/lib/ld-nova.lib.so $out/lib/ld.lib.so mv $out/bin/nova_timer_drv $out/bin/timer_drv diff --git a/packages/genodelabs/depot-targets.nix b/packages/genodelabs/depot-targets.nix index b2c59ea..0ea2cfe 100644 --- a/packages/genodelabs/depot-targets.nix +++ b/packages/genodelabs/depot-targets.nix @@ -98,7 +98,7 @@ in { imx53_qsb_drivers = { }; imx8_fb_drv = { }; imx8q_evk_drivers = { }; - init.patches = [ ./patches/sandbox.patch ./patches/xml-fail.patch ]; + init = { }; input_event_bridge = { }; intel_fb_drv = { BOARD = "pc"; @@ -306,7 +306,7 @@ in { vbox5-nova = vbox5'; verify = { }; vesa_drv.portInputs = with ports; [ libc x86emu ]; - vfs.patches = [ ./patches/vfs.patch ]; + vfs = { }; vfs_audit = { }; vfs_block = { }; vfs_fatfs = { }; diff --git a/packages/genodelabs/patches/binary-labels.patch b/packages/genodelabs/patches/binary-labels.patch deleted file mode 100644 index af5752a..0000000 --- a/packages/genodelabs/patches/binary-labels.patch +++ /dev/null @@ -1,98 +0,0 @@ -commit 2d76b3271fa826a97c3974b7e67f2799e9ba448d -Author: Emery Hemingway -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, - - Id_space::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, diff --git a/packages/genodelabs/patches/core-diag.patch b/packages/genodelabs/patches/core-diag.patch deleted file mode 100644 index e7cf664..0000000 --- a/packages/genodelabs/patches/core-diag.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 55f35e33680287ba925accf3bddadaa46d5ff30a Mon Sep 17 00:00:00 2001 -From: Emery Hemingway -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 - diff --git a/packages/genodelabs/patches/cxx-align.patch b/packages/genodelabs/patches/cxx-align.patch deleted file mode 100644 index c80dea9..0000000 --- a/packages/genodelabs/patches/cxx-align.patch +++ /dev/null @@ -1,57 +0,0 @@ -commit 0df2ea0956e46f3914be01aa9d7b20a06d805e53 -Author: Emery Hemingway -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); - } - diff --git a/packages/genodelabs/patches/label-fail.patch b/packages/genodelabs/patches/label-fail.patch deleted file mode 100644 index d6c2e2f..0000000 --- a/packages/genodelabs/patches/label-fail.patch +++ /dev/null @@ -1,184 +0,0 @@ -From 4250346b87b8e24a48d04ddacc77512eaa20ce0e Mon Sep 17 00:00:00 2001 -From: Emery Hemingway -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 -+#include - #include - #include - --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; - 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 - Session_label(Genode::String 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 const &label) - { - String 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 -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 -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::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 - diff --git a/packages/genodelabs/patches/ld-ro.patch b/packages/genodelabs/patches/ld-ro.patch deleted file mode 100644 index e5026ca..0000000 --- a/packages/genodelabs/patches/ld-ro.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 8c4bb7d84838e8c01673caa8ad45a4c042ccdd11 Mon Sep 17 00:00:00 2001 -From: Emery Hemingway -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( -+ [&] () { -+ 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 - diff --git a/packages/genodelabs/patches/phdr.patch b/packages/genodelabs/patches/phdr.patch deleted file mode 100644 index 4eb4399..0000000 --- a/packages/genodelabs/patches/phdr.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 45c73b01d4609f59ca576141bc836baad8e468ed Mon Sep 17 00:00:00 2001 -From: Emery Hemingway -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 - diff --git a/packages/genodelabs/patches/sandbox.patch b/packages/genodelabs/patches/sources.patch similarity index 54% rename from packages/genodelabs/patches/sandbox.patch rename to packages/genodelabs/patches/sources.patch index d97ff23..e332a61 100644 --- a/packages/genodelabs/patches/sandbox.patch +++ b/packages/genodelabs/patches/sources.patch @@ -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 +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( ++ [&] () { ++ 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 Date: Sat, 25 Apr 2020 17:10:03 +0530 -Subject: [PATCH 1/4] init/sandbox: support +Subject: [PATCH 02/16] init/sandbox: support Apply routing rules to a child from a node at the top-level of a sandbox config, unless the corresponding start node has as @@ -180,14 +271,123 @@ index 7afcaebf00..36aab737f2 100644 if (!scoped_label) 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 +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, + + Id_space::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 Date: Wed, 4 Nov 2020 11:03:49 +0100 -Subject: [PATCH 2/4] init/sandbox: do not parse if - is present +Subject: [PATCH 04/16] init/sandbox: do not parse if + is present --- 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 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 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -535,7 +735,7 @@ index d25e3d9683..46aa22411c 100644 _default_caps_accessor(default_caps_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 -index 81836a2045..f9d04cfdaf 100644 +index f7b41ddd5b..fd254d7f49 100644 --- a/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 @@ -554,7 +754,7 @@ index 81836a2045..f9d04cfdaf 100644 Routes_accessor &_routes_accessor; Default_caps_accessor &_default_caps_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, Report_update_trigger &report_update_trigger, Xml_node start_node, @@ -697,13 +897,182 @@ index 36aab737f2..639a4be4dd 100644 * 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 +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 +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 ++#include + #include + #include + +-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; + 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 + Session_label(Genode::String 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 const &label) + { + String 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 +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 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 +- @@ -712,7 +1081,7 @@ Subject: [PATCH 4/4] Do not default Child::binary_name() to Child::name() 3 files changed, 4 insertions(+), 1 deletion(-) 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 +++ b/repos/base/include/base/child.h @@ -58,7 +58,7 @@ struct Genode::Child_policy @@ -738,10 +1107,10 @@ index d480585221..7acacf0ffd 100644 Session_label const &label) override { 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 +++ 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; } @@ -750,5 +1119,320 @@ index f9d04cfdaf..a1e45dab0d 100644 Pd_session &ref_pd() override { return _env.pd(); } 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 +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, + 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, + } + + /* 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 +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 +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 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 +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 +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 +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::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 +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 diff --git a/packages/genodelabs/patches/vfs.patch b/packages/genodelabs/patches/vfs.patch deleted file mode 100644 index 3f90aeb..0000000 --- a/packages/genodelabs/patches/vfs.patch +++ /dev/null @@ -1,176 +0,0 @@ -From a3063497d9aaf6bf06a3797804135105ad5f3bad Mon Sep 17 00:00:00 2001 -From: Emery Hemingway -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, - 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, - } - - /* 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 -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 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 -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 - diff --git a/packages/genodelabs/patches/xml-fail.patch b/packages/genodelabs/patches/xml-fail.patch deleted file mode 100644 index 7f17e6b..0000000 --- a/packages/genodelabs/patches/xml-fail.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 3898cf557ada28312731292074a8a09621d45abb Mon Sep 17 00:00:00 2001 -From: Emery Hemingway -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 -