[haiku-commits] haiku: hrev46599 - src/kits/media

  • From: korli@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 25 Dec 2013 18:40:41 +0100 (CET)

hrev46599 adds 1 changeset to branch 'master'
old head: 80c9ee9c3f7dc0e34ba8995bce9c16825a89e8b7
new head: 9f79c0ca9a386ae6f98498cf238381abbca82042
overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=9f79c0c+%5E80c9ee9

----------------------------------------------------------------------------

9f79c0c: media: Fix ParameterWeb (un)flattening behavior for x86_64.
  
  * should fix #10316.

                                   [ Jérôme Duval <jerome.duval@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev46599
Commit:      9f79c0ca9a386ae6f98498cf238381abbca82042
URL:         http://cgit.haiku-os.org/haiku/commit/?id=9f79c0c
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Wed Dec 25 17:29:55 2013 UTC

Ticket:      https://dev.haiku-os.org/ticket/10316

----------------------------------------------------------------------------

1 file changed, 25 insertions(+), 16 deletions(-)
src/kits/media/ParameterWeb.cpp | 41 ++++++++++++++++++++++---------------

----------------------------------------------------------------------------

diff --git a/src/kits/media/ParameterWeb.cpp b/src/kits/media/ParameterWeb.cpp
index cdf6f4d..35ef993 100644
--- a/src/kits/media/ParameterWeb.cpp
+++ b/src/kits/media/ParameterWeb.cpp
@@ -150,7 +150,7 @@ static const uint32 kBufferGroupMagicNoFlags = 0x03040507;
 static const uint32 kParameterMagic = 0x02040607;
 
 static const ssize_t kAdditionalParameterGroupSize = 12;
-static const ssize_t kAdditionalParameterSize = 35;
+static const ssize_t kAdditionalParameterSize = 23 + 3 * sizeof(ssize_t);
 
 /* BContinuousParameter - FlattenedSize() fixed part
  *     Min: 4 bytes (as float)
@@ -160,7 +160,8 @@ static const ssize_t kAdditionalParameterSize = 35;
  *     Factor: 4 bytes (as float)
  *     Offset: 4 bytes (as float)
  */
-static const ssize_t kAdditionalContinuousParameterSize = 24;
+static const ssize_t kAdditionalContinuousParameterSize = 5 * sizeof(float)
+       + sizeof(BContinuousParameter::response);
 static const ssize_t kAdditionalDiscreteParameterSize = sizeof(ssize_t);
 
 
@@ -488,8 +489,7 @@ BParameterWeb::FlattenedSize() const
                BParameterGroup* group
                        = static_cast<BParameterGroup*>(fGroups->ItemAt(i));
                if (group != NULL) {
-                       size += 4 + group->FlattenedSize();
-                               // 4 bytes for the flattened size
+                       size += sizeof(ssize_t) + group->FlattenedSize();
                }
        }
 
@@ -892,7 +892,7 @@ BParameterGroup::FlattenedSize() const
        ssize_t size = 13;
 
        if (fFlags != 0)
-               size += 4;
+               size += sizeof(uint32);
 
        if (fName != NULL)
                size += min_c(strlen(fName), 255);
@@ -902,7 +902,8 @@ BParameterGroup::FlattenedSize() const
                BParameter* parameter = 
static_cast<BParameter*>(fControls->ItemAt(i));
                if (parameter != NULL) {
                        // overhead for each parameter flattened
-                       size += 16 + parameter->FlattenedSize();
+                       size += sizeof(BParameter*) + 
sizeof(BParameter::media_parameter_type)
+                                + sizeof(ssize_t) + parameter->FlattenedSize();
                }
        }
 
@@ -912,7 +913,8 @@ BParameterGroup::FlattenedSize() const
                        = static_cast<BParameterGroup*>(fGroups->ItemAt(i));
                if (group != NULL) {
                        // overhead for each group flattened
-                       size += 16 + group->FlattenedSize();
+                       size += sizeof(BParameterGroup*) + sizeof(type_code)
+                               + sizeof(ssize_t) + group->FlattenedSize();
                }
        }
 
@@ -1076,8 +1078,11 @@ BParameterGroup::Unflatten(type_code code, const void* 
buffer, ssize_t size)
 
        for (int32 i = 0; i < count; i++) {
                // make sure we can read as many bytes
-               if (size_left(size, bufferStart, buffer) < 12)
+               if (size_left(size, bufferStart, buffer) < (ssize_t)(
+                               sizeof(BParameter*) + 
sizeof(BParameter::media_parameter_type)
+                               + sizeof(ssize_t))) {
                        return B_BAD_VALUE;
+               }
 
                BParameter* oldPointer = 
read_pointer_from_buffer_swap<BParameter*>(
                        &buffer, isSwapped);
@@ -1125,8 +1130,11 @@ BParameterGroup::Unflatten(type_code code, const void* 
buffer, ssize_t size)
 
        for (int32 i = 0; i < count; i++) {
                // make sure we can read as many bytes
-               if (size_left(size, bufferStart, buffer) < 12)
+               if (size_left(size, bufferStart, buffer) < (ssize_t)(
+                               sizeof(BParameterGroup*) + sizeof(type_code)
+                               + sizeof(ssize_t))) {
                        return B_BAD_VALUE;
+               }
 
                BParameterGroup* oldPointer = read_pointer_from_buffer_swap<
                        BParameterGroup*>(&buffer, isSwapped);
@@ -1527,7 +1535,7 @@ BParameter::FlattenedSize() const
                Flags: 4 bytes
        */
        //35 bytes are guaranteed, after that, add the variable length parts.
-       ssize_t size = 35;
+       ssize_t size = kAdditionalParameterSize;
 
        if (fName != NULL)
                size += strlen(fName);
@@ -1659,8 +1667,8 @@ BParameter::Unflatten(type_code code, const void* buffer, 
ssize_t size)
        // Channel Count (4 bytes)
        // Flags (4 bytes)
        // TOTAL: 27 bytes
-       const ssize_t MinFlattenedParamSize(27);
-       if (parameterSize < MinFlattenedParamSize) {
+       const ssize_t kMinFlattenedParamSize = 15 + 3 * sizeof(ssize_t);
+       if (parameterSize < kMinFlattenedParamSize) {
                ERROR("BParameter::Unflatten out of memory (2)\n");
                return B_ERROR;
        }
@@ -1680,20 +1688,21 @@ BParameter::Unflatten(type_code code, const void* 
buffer, ssize_t size)
        // it will directly add the pointers in the flattened message to the 
list;
        // these will be fixed to point to the real inputs/outputs later in 
FixRefs()
 
-       int32 count = read_from_buffer_swap32<int32>(&buffer, fSwapDetected);
+       ssize_t count = read_pointer_from_buffer_swap<ssize_t>(&buffer,
+               fSwapDetected);
 
        fInputs->MakeEmpty();
-       for (int32 i = 0; i < count; i++) {
+       for (ssize_t i = 0; i < count; i++) {
                fInputs->AddItem(read_pointer_from_buffer_swap<BParameter * 
const>(
                        &buffer, fSwapDetected));
        }
 
        // read the list of outputs
 
-       count = read_from_buffer_swap32<int32>(&buffer, fSwapDetected);
+       count = read_pointer_from_buffer_swap<ssize_t>(&buffer, fSwapDetected);
 
        fOutputs->MakeEmpty();
-       for (int32 i = 0; i < count; i++) {
+       for (ssize_t i = 0; i < count; i++) {
                fOutputs->AddItem(read_pointer_from_buffer_swap<BParameter * 
const>(
                        &buffer, fSwapDetected));
        }


Other related posts:

  • » [haiku-commits] haiku: hrev46599 - src/kits/media - korli