From 83f46ed6ab97c9ccd617b70017422a8113eb6308 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 21 Jul 2010 09:55:04 +0000 Subject: [PATCH] file_cache_write() can get a NULL buffer and still a size != 0, which the request handling wasn't taking into account. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37640 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/userlandfs/private/Requests.h | 1 + .../kernel_add_on/KernelRequestHandler.cpp | 14 +++++++++++--- .../file_systems/userlandfs/server/kernel_emu.cpp | 10 +++++++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/headers/private/userlandfs/private/Requests.h b/headers/private/userlandfs/private/Requests.h index 00785ab0bf..81f39f29a8 100644 --- a/headers/private/userlandfs/private/Requests.h +++ b/headers/private/userlandfs/private/Requests.h @@ -1838,6 +1838,7 @@ public: void* cookie; Address buffer; + size_t size; off_t pos; }; diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelRequestHandler.cpp b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelRequestHandler.cpp index f3b6aef346..90ad31fd44 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelRequestHandler.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelRequestHandler.cpp @@ -706,9 +706,17 @@ KernelRequestHandler::_HandleRequest(FileCacheWriteRequest* request) 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 diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/kernel_emu.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/kernel_emu.cpp index b7d6ad53e6..4d9f2300ee 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/kernel_emu.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/kernel_emu.cpp @@ -824,11 +824,15 @@ UserlandFS::KernelEmu::file_cache_write(dev_t mountID, ino_t vnodeID, 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);