[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH 4/7] kernel2: lio_stream_origin()
+ kernel2: Neuer Syscall lio_stream_origin(), mit dem sich feststellen
lässt, ob ein Stream tatsächlich existiert und von dem Prozess kommt,
der das (z.B. in einem RPC-Aufruf) behauptet.
Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
src/include/syscallno.h | 3 ++-
src/kernel2/include/lostio/core.h | 3 +++
src/kernel2/include/syscall.h | 3 +++
src/kernel2/src/lostio/userspace.c | 1 +
src/kernel2/src/syscall.c | 1 +
src/kernel2/src/syscalls/lostio.c | 16 ++++++++++++++++
src/modules/include/syscall.h | 13 +++++++++++++
src/modules/lib/syscalls/lostio.c | 25 +++++++++++++++++++++++++
8 files changed, 64 insertions(+), 1 deletion(-)
diff --git a/src/include/syscallno.h b/src/include/syscallno.h
index 3938718..d4794f5 100644
--- a/src/include/syscallno.h
+++ b/src/include/syscallno.h
@@ -109,7 +109,8 @@
#define SYSCALL_LIO_SYNC_ALL 99
#define SYSCALL_LIO_PASS_FD 100
#define SYSCALL_LIO_PROBE_SERVICE 101
-#define SYSCALL_LIO_DUP 102
+#define SYSCALL_LIO_DUP 102
+#define SYSCALL_LIO_STREAM_ORIGIN 103
#define SYSCALL_LIO_SRV_SERVICE_REGISTER 110
#define SYSCALL_LIO_SRV_TREE_SET_RING 111
diff --git a/src/kernel2/include/lostio/core.h b/src/kernel2/include/lostio/core.h
index 3e71dc3..d8ad945 100644
--- a/src/kernel2/include/lostio/core.h
+++ b/src/kernel2/include/lostio/core.h
@@ -66,6 +66,9 @@ struct lio_usp_stream {
/** Sortierung nach usp_id im Baum */
struct tree_item usp_item;
+
+ /** PID des Prozesses, der den Stream dem aktuellen übergeben hat */
+ pid_t origin;
};
struct lio_node {
diff --git a/src/kernel2/include/syscall.h b/src/kernel2/include/syscall.h
index c979373..e2b9148 100644
--- a/src/kernel2/include/syscall.h
+++ b/src/kernel2/include/syscall.h
@@ -217,6 +217,9 @@ int syscall_lio_dup(lio_usp_stream_t* source, lio_usp_stream_t* dest);
/// Stream an anderen Prozess weitergeben
int syscall_lio_pass_fd(lio_usp_stream_t* stream_id, pid_t pid);
+/// PID des Prozesses, der den Stream dem aktuellen übergeben hat, auslesen
+int syscall_lio_stream_origin(lio_usp_stream_t* stream_id);
+
/// Aus Stream lesen
void syscall_lio_read(lio_usp_stream_t* stream_id, uint64_t* offset,
size_t bytes, void* buffer, int updatepos, ssize_t* result);
diff --git a/src/kernel2/src/lostio/userspace.c b/src/kernel2/src/lostio/userspace.c
index 6fd5638..e814149 100644
--- a/src/kernel2/src/lostio/userspace.c
+++ b/src/kernel2/src/lostio/userspace.c
@@ -103,6 +103,7 @@ struct lio_usp_stream* lio_usp_do_add_stream(pm_process_t* proc,
entry->stream = stream;
entry->usp_id = id;
+ entry->origin = proc->pid;
tree_insert(proc->lio_streams, entry);
stream->usp_refcount++;
diff --git a/src/kernel2/src/syscall.c b/src/kernel2/src/syscall.c
index 557ab12..0cee76b 100644
--- a/src/kernel2/src/syscall.c
+++ b/src/kernel2/src/syscall.c
@@ -132,6 +132,7 @@ void syscall_init()
syscall_register(SYSCALL_LIO_PASS_FD, &syscall_lio_pass_fd, 2);
syscall_register(SYSCALL_LIO_PROBE_SERVICE, &syscall_lio_probe_service, 2);
syscall_register(SYSCALL_LIO_DUP, &syscall_lio_dup, 2);
+ syscall_register(SYSCALL_LIO_STREAM_ORIGIN, &syscall_lio_stream_origin, 1);
syscall_register(SYSCALL_LIO_SRV_SERVICE_REGISTER,
&syscall_lio_srv_service_register, 4);
diff --git a/src/kernel2/src/syscalls/lostio.c b/src/kernel2/src/syscalls/lostio.c
index 73aa98e..47c2f8c 100644
--- a/src/kernel2/src/syscalls/lostio.c
+++ b/src/kernel2/src/syscalls/lostio.c
@@ -177,6 +177,7 @@ int syscall_lio_pass_fd(lio_usp_stream_t* stream_id, pid_t pid)
stream = fd->stream;
new_fd = lio_usp_add_stream(process, stream);
+ new_fd->origin = current_process->pid;
*stream_id = new_fd->usp_id;
// Wir haben gerade eine zweite Referenz hinzugefügt, also kann kein
@@ -187,6 +188,21 @@ int syscall_lio_pass_fd(lio_usp_stream_t* stream_id, pid_t pid)
return 0;
}
+/// PID des Prozesses, der den Stream dem aktuellen übergeben hat, auslesen
+int syscall_lio_stream_origin(lio_usp_stream_t* stream_id)
+{
+ struct lio_usp_stream* fd;
+
+ // TODO: is_userspace
+ fd = lio_usp_get_stream(current_process, *stream_id);
+ if (fd == NULL) {
+ return -EBADF;
+ }
+
+ return fd->origin;
+}
+
+
/// Aus Stream lesen
void syscall_lio_read(lio_usp_stream_t* stream_id, uint64_t* offset,
size_t bytes, void* buffer, int flags, ssize_t* result)
diff --git a/src/modules/include/syscall.h b/src/modules/include/syscall.h
index 2fac1f4..5a493bb 100644
--- a/src/modules/include/syscall.h
+++ b/src/modules/include/syscall.h
@@ -198,6 +198,19 @@ int lio_close(lio_stream_t s);
lio_stream_t lio_pass_fd(lio_stream_t s, pid_t pid);
/**
+ * Gibt den Prozess zurück, der den Stream an den aktuellen Prozess übergeben
+ * hat.
+ *
+ * @param s Der zu prüfende Stream
+ * @return Falls der Stream von einem anderen Prozess übergeben wurde, dessen
+ * PID. Falls er von diesem Prozess geöffnet wurde, die eigene PID. Negativ
+ * im Fehlerfall, insbesondere:
+ *
+ * -EBADF Die Stream-ID ist ungültig
+ */
+int lio_stream_origin(lio_stream_t s);
+
+/**
* Liest aus dem Stream.
*
* @param s Auszulesender Stream
diff --git a/src/modules/lib/syscalls/lostio.c b/src/modules/lib/syscalls/lostio.c
index b898e7a..eb14658 100644
--- a/src/modules/lib/syscalls/lostio.c
+++ b/src/modules/lib/syscalls/lostio.c
@@ -202,6 +202,31 @@ lio_stream_t lio_pass_fd(lio_stream_t s, pid_t pid)
}
}
+/**
+ * Gibt den Prozess zurück, der den Stream an den aktuellen Prozess übergeben
+ * hat.
+ *
+ * @param s Der zu prüfende Stream
+ * @return Falls der Stream von einem anderen Prozess übergeben wurde, dessen
+ * PID. Falls er von diesem Prozess geöffnet wurde, die eigene PID. Negativ
+ * im Fehlerfall, insbesondere:
+ *
+ * -EBADF Die Stream-ID ist ungültig
+ */
+int lio_stream_origin(lio_stream_t s)
+{
+ int result;
+
+ asm(
+ "pushl %2;"
+ "mov %1, %%eax;"
+ "int $0x30;"
+ "add $0x4, %%esp;"
+ : "=a" (result): "i" (SYSCALL_LIO_STREAM_ORIGIN), "r" (&s) : "memory");
+
+ return result;
+}
+
ssize_t lio_readf(lio_stream_t s, uint64_t offset, size_t bytes,
void* buf, int flags)
{
--
2.1.4