Fix enum_objects_by_type and its usage.
authorcoderain <coderain@sdf.org>
Thu, 16 Feb 2017 04:11:57 +0000 (05:11 +0100)
committercoderain <coderain@sdf.org>
Thu, 16 Feb 2017 04:11:57 +0000 (05:11 +0100)
kernel/src/device.c
kernel/src/object.c
kernel/src/process.c
kernel/src/user.c

index a74f376629f79ea30329e132ea12f614966b13ab..3f4953410d00ddb977c314cf1e76c91b51c13ec8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * device.c
  *
- * Copyright (C) 2015 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
+ * Copyright (C) 2017 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -368,7 +368,7 @@ dword_t device_write_file(file_instance_t *_file, const void *buffer, qword_t of
         safe_buffer = (void*)buffer;
     }
 
-        ret = device_write(file->device, safe_buffer, offset, length, &safe_bytes_written);
+    ret = device_write(file->device, safe_buffer, offset, length, &safe_bytes_written);
 
     if (get_previous_mode() == USER_MODE)
     {
index 13d7f1a9c7e99a16fc662c3d3b99ea9f581f94a1..ce8c0091c0f4990d8aac18b47ef0be53626d5fee 100644 (file)
@@ -430,6 +430,7 @@ dword_t enum_objects_by_type(object_type_t type, object_t **object)
 
     if (ptr == &objects_by_type[type])
     {
+        dereference(*object);
         release_lock(&obj_lock);
         return ERR_NOMORE;
     }
index cf58663f8bc6a71ba2958136f266822c0a2cad5b..3bcd5f33b6875836642d15e14a028b582b6e50fc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * process.c
  *
- * Copyright (C) 2016 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
+ * Copyright (C) 2017 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -109,7 +109,7 @@ dword_t open_process(dword_t pid, handle_t *handle)
     process_t *proc = NULL;
 
     ret = enum_objects_by_type(OBJECT_PROCESS, (object_t**)&proc);
-    if (ret != ERR_NOMORE) return ret;
+    ASSERT(ret == ERR_SUCCESS || ret == ERR_NOMORE);
 
     while (ret == ERR_SUCCESS)
     {
@@ -117,6 +117,7 @@ dword_t open_process(dword_t pid, handle_t *handle)
         ret = enum_objects_by_type(OBJECT_PROCESS, (object_t**)&proc);
     }
 
+    ASSERT(ret == ERR_SUCCESS || ret == ERR_NOMORE);
     if (ret == ERR_NOMORE) ret = ERR_NOTFOUND;
 
     if (ret == ERR_SUCCESS)
@@ -129,6 +130,8 @@ dword_t open_process(dword_t pid, handle_t *handle)
         {
             ret = ERR_FORBIDDEN;
         }
+
+        dereference(&proc->header);
     }
 
     return ret;
@@ -629,7 +632,15 @@ dword_t enum_processes(dword_t *pid_array, dword_t *count)
         ret = enum_objects_by_type(OBJECT_PROCESS, (object_t**)&proc);
     }
 
-    if (ret == ERR_NOMORE) ret = ERR_SUCCESS;
+    if (ret == ERR_NOMORE)
+    {
+        ret = ERR_SUCCESS;
+    }
+    else if (ret == ERR_SUCCESS)
+    {
+        dereference(&proc->header);
+        ret = ERR_SMALLBUF;
+    }
 
 cleanup:
     EH_TRY *count = cnt;
index a93111336f3f8c5dac1268730ef9692cd54ce7ed..c8c9d5f0a91aba501646b1a56551002b7e727258 100644 (file)
@@ -251,15 +251,20 @@ dword_t delete_user(dword_t uid)
 
     process_t *proc = NULL;
     dword_t ret = enum_objects_by_type(OBJECT_PROCESS, (object_t**)&proc);
-    if (ret != ERR_NOMORE) return ret;
+    ASSERT(ret == ERR_SUCCESS || ret == ERR_NOMORE);
 
     while (ret == ERR_SUCCESS)
     {
-        if (proc->current_user->uid == uid || proc->original_user->uid == uid) return ERR_BUSY;
+        if (proc->current_user->uid == uid || proc->original_user->uid == uid)
+        {
+            dereference(&proc->header);
+            return ERR_BUSY;
+        }
+
         ret = enum_objects_by_type(OBJECT_PROCESS, (object_t**)&proc);
     }
 
-    if (ret != ERR_NOMORE) return ret;
+    ASSERT(ret == ERR_NOMORE);
 
     acquire_resource_exclusive(&user_list_res);
     user_t *user = get_user(uid);