[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