Working on MP build (now can run, just crashes due to CPUs treading on each other...
[tpg/acess2.git] / Kernel / messages.c
index 93cf6ca..32e579b 100644 (file)
@@ -2,8 +2,8 @@
  * AcessOS Microkernel Version
  * messages.c
  */
-#include <common.h>
-#include <proc.h>
+#include <acess.h>
+#include <threads.h>
 #include <errno.h>
 
 // === CODE ===
@@ -12,6 +12,8 @@
  * \brief Send an IPC message
  * \param Err  Pointer to the errno variable
  * \param Dest Destination Thread
+ * \param Length       Length of the message
+ * \param Data Message data
  */
 int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
 {
@@ -63,6 +65,9 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
 /**
  * \fn int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer)
  * \brief Gets a message
+ * \param Err  Pointer to \a errno
+ * \param Source       Where to put the source TID
+ * \param Buffer       Buffer to place the message data (set to NULL to just get message length)
  */
 int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer)
 {
@@ -89,12 +94,20 @@ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer)
        
        // Get message
        if(Buffer != GETMSG_IGNORE)
+       {
+               if( !CheckMem( Buffer, cur->Messages->Length ) )
+               {
+                       *Err = -EINVAL;
+                       RELEASE( &cur->IsLocked );
+                       return -1;
+               }
                memcpy(Buffer, cur->Messages->Data, cur->Messages->Length);
+       }
        ret = cur->Messages->Length;
        
        // Remove from list
        tmp = cur->Messages->Next;
-       free(cur->Messages);
+       free( (void*)cur->Messages );
        cur->Messages = tmp;
        
        RELEASE( &cur->IsLocked );

UCC git Repository :: git.ucc.asn.au