From 6179308e3f6e4c64013e5db5da9b30a22abca704 Mon Sep 17 00:00:00 2001
From: Anton Kling <anton@kling.gg>
Date: Sat, 14 Dec 2024 15:13:01 +0100
Subject: sb: Allow input to be "ignored"

This removes edge cases from read calls and makes bugs harder
to introduce.
---
 kernel/fs/procfs.c | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

(limited to 'kernel/fs/procfs.c')

diff --git a/kernel/fs/procfs.c b/kernel/fs/procfs.c
index 69022d4..bfe3aac 100644
--- a/kernel/fs/procfs.c
+++ b/kernel/fs/procfs.c
@@ -23,8 +23,7 @@ void process_close(vfs_fd_t *fd) {
 int procfs_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
   struct sb builder;
   sb_init_buffer(&builder, buffer, len);
-
-  size_t read_amount = 0;
+  sb_set_ignore(&builder, offset);
 
   process_t *p = ready_queue;
   for (; p; p = p->next) {
@@ -32,13 +31,11 @@ int procfs_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
     entry.d_ino = p->pid;
     ksnprintf(entry.d_name, sizeof(entry.d_name), "%u", p->pid);
 
-    if (read_amount >= offset) {
-      if (0 == sb_append_buffer(&builder, (u8 *)&entry, sizeof(entry))) {
-        break;
-      }
+    if (0 == sb_append_buffer(&builder, (u8 *)&entry, sizeof(entry))) {
+      break;
     }
-    read_amount += sizeof(struct dirent);
   }
+
   return sv_length(SB_TO_SV(builder));
 }
 
@@ -70,27 +67,23 @@ int process_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
 
   struct sb builder;
   sb_init_buffer(&builder, buffer, len);
+  sb_set_ignore(&builder, offset);
 
   int id = fd->inode->inode_num;
   if (PROCESS_ROOT == id) {
-    size_t read_amount = 0;
     for (size_t i = 0; i < ARRAY_LENGTH(process_entries); i++) {
       if (0 == strlen(process_entries[i].d_name)) {
         continue;
       }
-      if (read_amount >= offset) {
-        if (0 == sb_append_buffer(&builder, (u8 *)&process_entries[i],
-                                  sizeof(struct dirent))) {
-          break;
-        }
+      if (0 == sb_append_buffer(&builder, (u8 *)&process_entries[i],
+                                sizeof(struct dirent))) {
+        break;
       }
-      read_amount += sizeof(struct dirent);
     }
     return sv_length(SB_TO_SV(builder));
   }
   if (PROCESS_NAME == id) {
     struct sv program_name = C_TO_SV(p->program_name);
-    sv_take(program_name, &program_name, offset);
     sb_append_sv(&builder, program_name);
     return sv_length(SB_TO_SV(builder));
   }
-- 
cgit v1.2.3