[haiku-commits] r37640 - in haiku/trunk: headers/private/userlandfs/private src/add-ons/kernel/file_systems/userlandfs/kernel_add_on src/add-ons/kernel/file_systems/userlandfs/server

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 21 Jul 2010 11:55:04 +0200 (CEST)

Author: bonefish
Date: 2010-07-21 11:55:04 +0200 (Wed, 21 Jul 2010)
New Revision: 37640
Changeset: http://dev.haiku-os.org/changeset/37640

Modified:
   haiku/trunk/headers/private/userlandfs/private/Requests.h
   
haiku/trunk/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelRequestHandler.cpp
   haiku/trunk/src/add-ons/kernel/file_systems/userlandfs/server/kernel_emu.cpp
Log:
file_cache_write() can get a NULL buffer and still a size != 0, which the
request handling wasn't taking into account.


Modified: haiku/trunk/headers/private/userlandfs/private/Requests.h
===================================================================
--- haiku/trunk/headers/private/userlandfs/private/Requests.h   2010-07-20 
23:21:26 UTC (rev 37639)
+++ haiku/trunk/headers/private/userlandfs/private/Requests.h   2010-07-21 
09:55:04 UTC (rev 37640)
@@ -1838,6 +1838,7 @@
 
        void*           cookie;
        Address         buffer;
+       size_t          size;
        off_t           pos;
 };
 

Modified: 
haiku/trunk/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelRequestHandler.cpp
===================================================================
--- 
haiku/trunk/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelRequestHandler.cpp
       2010-07-20 23:21:26 UTC (rev 37639)
+++ 
haiku/trunk/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelRequestHandler.cpp
       2010-07-21 09:55:04 UTC (rev 37640)
@@ -706,9 +706,17 @@
 
        size_t size = 0;
        if (result == B_OK) {
-               size = request->buffer.GetSize();
-               result = volume->WriteFileCache(request->vnid, request->cookie,
-                       request->pos, request->buffer.GetData(), &size);
+               const void* data = request->buffer.GetData();
+               size = request->size;
+               if (data != NULL) {
+                       if (size != (size_t)request->buffer.GetSize())
+                               result = B_BAD_DATA;
+               }
+
+               if (result == B_OK) {
+                       result = volume->WriteFileCache(request->vnid, 
request->cookie,
+                               request->pos, data, &size);
+               }
        }
 
        // prepare the reply

Modified: 
haiku/trunk/src/add-ons/kernel/file_systems/userlandfs/server/kernel_emu.cpp
===================================================================
--- 
haiku/trunk/src/add-ons/kernel/file_systems/userlandfs/server/kernel_emu.cpp    
    2010-07-20 23:21:26 UTC (rev 37639)
+++ 
haiku/trunk/src/add-ons/kernel/file_systems/userlandfs/server/kernel_emu.cpp    
    2010-07-21 09:55:04 UTC (rev 37640)
@@ -824,11 +824,15 @@
        request->nsid = mountID;
        request->vnid = vnodeID;
        request->cookie = cookie;
+       request->size = *_size;
        request->pos = offset;
 
-       error = allocator.AllocateData(request->buffer, buffer, *_size, 1, 
false);
-       if (error != B_OK)
-               return error;
+       if (buffer != NULL) {
+               error = allocator.AllocateData(request->buffer, buffer, *_size, 
1,
+                       false);
+               if (error != B_OK)
+                       return error;
+       }
 
        // send the request
        UserlandRequestHandler handler(fileSystem, FILE_CACHE_WRITE_REPLY);


Other related posts:

  • » [haiku-commits] r37640 - in haiku/trunk: headers/private/userlandfs/private src/add-ons/kernel/file_systems/userlandfs/kernel_add_on src/add-ons/kernel/file_systems/userlandfs/server - ingo_weinhold