From 62ede2e6a215a2858333453a52cb81d37b80614b Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Mon, 5 Jan 2015 11:53:07 +0100 Subject: [PATCH] BMessage: avoid code duplication in Unflatten The buffer version of Unflatten can be implemented by wrapping the buffer in a BMemoryIO. This allows sharing more code, and the BDataIO version of Unflatten has some extra error checks. Fixes #11670. --- src/kits/app/Message.cpp | 61 ++-------------------------------------- 1 file changed, 2 insertions(+), 59 deletions(-) diff --git a/src/kits/app/Message.cpp b/src/kits/app/Message.cpp index 1533e3c9e3..bd5e592cc9 100644 --- a/src/kits/app/Message.cpp +++ b/src/kits/app/Message.cpp @@ -1274,65 +1274,8 @@ BMessage::Unflatten(const char* flatBuffer) if (flatBuffer == NULL) return B_BAD_VALUE; - uint32 format = *(uint32*)flatBuffer; - if (format != MESSAGE_FORMAT_HAIKU) - return BPrivate::MessageAdapter::Unflatten(format, this, flatBuffer); - - // native message unflattening - - _Clear(); - - fHeader = (message_header*)malloc(sizeof(message_header)); - if (fHeader == NULL) - return B_NO_MEMORY; - - memcpy(fHeader, flatBuffer, sizeof(message_header)); - flatBuffer += sizeof(message_header); - - if (fHeader->format != MESSAGE_FORMAT_HAIKU - || (fHeader->flags & MESSAGE_FLAG_VALID) == 0) { - _InitHeader(); - return B_BAD_VALUE; - } - - what = fHeader->what; - - if ((fHeader->flags & MESSAGE_FLAG_PASS_BY_AREA) != 0 - && fHeader->message_area >= 0) { - status_t result = _Reference(); - if (result != B_OK) { - _InitHeader(); - return result; - } - } else { - fHeader->message_area = -1; - - if (fHeader->field_count > 0) { - size_t fieldsSize = fHeader->field_count * sizeof(field_header); - fFields = (field_header*)malloc(fieldsSize); - if (fFields == NULL) { - _InitHeader(); - return B_NO_MEMORY; - } - - memcpy(fFields, flatBuffer, fieldsSize); - flatBuffer += fieldsSize; - } - - if (fHeader->data_size > 0) { - fData = (uint8*)malloc(fHeader->data_size); - if (fData == NULL) { - free(fFields); - fFields = NULL; - _InitHeader(); - return B_NO_MEMORY; - } - - memcpy(fData, flatBuffer, fHeader->data_size); - } - } - - return _ValidateMessage(); + BMemoryIO io(flatBuffer, SIZE_MAX); + return Unflatten(&io); }