Fixed the Dano message reader:
* The size returned was too big, as the size in the flattened message included the message format. * Made it a bit more robust, too (bail out if the section header size is smaller than zero). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17772 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2005, Haiku.
|
* Copyright 2005-2006, Haiku.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@@ -84,10 +84,13 @@ BPrivate::dano_message_flattened_size(const char *buffer)
|
|||||||
{
|
{
|
||||||
section_header *header = (section_header *)buffer;
|
section_header *header = (section_header *)buffer;
|
||||||
|
|
||||||
if (header->code == kMessageFormatSwapped)
|
// The size contains the message format that won't be part of
|
||||||
return __swap_int32(header->size);
|
// the buffer unflatten_dano_message() will get
|
||||||
|
|
||||||
return header->size;
|
if (header->code == kMessageFormatSwapped)
|
||||||
|
return __swap_int32(header->size) - sizeof(header->code);
|
||||||
|
|
||||||
|
return header->size - sizeof(header->code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -118,7 +121,7 @@ BPrivate::unflatten_dano_message(uint32 format, BDataIO &stream,
|
|||||||
// be safe. this shouldn't be necessary but in some testcases it was.
|
// be safe. this shouldn't be necessary but in some testcases it was.
|
||||||
sectionHeader.size = pad_to_8(sectionHeader.size);
|
sectionHeader.size = pad_to_8(sectionHeader.size);
|
||||||
|
|
||||||
if (offset + sectionHeader.size > size)
|
if (offset + sectionHeader.size > size || sectionHeader.size < 0)
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
|
|
||||||
ssize_t fieldSize = sectionHeader.size - sizeof(section_header);
|
ssize_t fieldSize = sectionHeader.size - sizeof(section_header);
|
||||||
@@ -133,10 +136,12 @@ BPrivate::unflatten_dano_message(uint32 format, BDataIO &stream,
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (sectionHeader.code) {
|
switch (sectionHeader.code) {
|
||||||
case SECTION_OFFSET_TABLE: break; /* discard */
|
case SECTION_OFFSET_TABLE:
|
||||||
case SECTION_TARGET_INFORMATION: break; /* discard */
|
case SECTION_TARGET_INFORMATION:
|
||||||
case SECTION_SORTED_INDEX_TABLE: break; /* discard */
|
case SECTION_SORTED_INDEX_TABLE:
|
||||||
case SECTION_END_OF_DATA: break; /* discard */
|
case SECTION_END_OF_DATA:
|
||||||
|
// discard
|
||||||
|
break;
|
||||||
|
|
||||||
case SECTION_SINGLE_ITEM_DATA: {
|
case SECTION_SINGLE_ITEM_DATA: {
|
||||||
single_item *field = (single_item *)fieldBuffer;
|
single_item *field = (single_item *)fieldBuffer;
|
||||||
|
|||||||
Reference in New Issue
Block a user