From 9b24115c085679ba3ccc357321d20b2c9beaba78 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Thu, 3 Jan 2013 20:25:46 +0100 Subject: [PATCH] base-linux: fix delegation of invalid capabilities This patch uses a local_name of -1 to encode an invalid capability. --- base-linux/include/base/ipc.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/base-linux/include/base/ipc.h b/base-linux/include/base/ipc.h index 2fff12b1a..f15d22a8b 100644 --- a/base-linux/include/base/ipc.h +++ b/base-linux/include/base/ipc.h @@ -19,10 +19,13 @@ inline void Genode::Ipc_ostream::_marshal_capability(Genode::Native_capability const &cap) { - _write_to_buf(cap.local_name()); + if (cap.valid()) { + _write_to_buf(cap.local_name()); - if (cap.valid()) _snd_msg->append_cap(cap.dst().socket); + } else { + _write_to_buf(-1L); + } } @@ -31,8 +34,17 @@ inline void Genode::Ipc_istream::_unmarshal_capability(Genode::Native_capability long local_name = 0; _read_from_buf(local_name); - int const socket = _rcv_msg->read_cap(); - cap = Native_capability(Cap_dst_policy::Dst(socket), local_name); + if (local_name == -1) { + + /* construct invalid capability */ + cap = Genode::Native_capability(); + + } else { + + /* construct valid capability */ + int const socket = _rcv_msg->read_cap(); + cap = Native_capability(Cap_dst_policy::Dst(socket), local_name); + } } #endif /* _INCLUDE__BASE__IPC_H_ */