ramfs: Put key length in the type in Attribute::GetKey.
Many of the callers of this method didn't initialize the length parameter properly, which led to uninitialized memory being used as part of the min() calculation, which caused all sorts of problems. Now we don't require them to pass in anything, and use the constant directly. Fixes #19252.
This commit is contained in:
@@ -7,7 +7,6 @@
|
|||||||
#include "Attribute.h"
|
#include "Attribute.h"
|
||||||
#include "Misc.h"
|
#include "Misc.h"
|
||||||
#include "Node.h"
|
#include "Node.h"
|
||||||
#include "ramfs.h"
|
|
||||||
#include "Volume.h"
|
#include "Volume.h"
|
||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
@@ -102,7 +101,7 @@ Attribute::_Changed(uint8* oldKey, size_t oldLength, off_t changeOffset, ssize_t
|
|||||||
|
|
||||||
// update live queries
|
// update live queries
|
||||||
uint8 newKey[kMaxIndexKeyLength];
|
uint8 newKey[kMaxIndexKeyLength];
|
||||||
size_t newLength = kMaxIndexKeyLength;
|
size_t newLength;
|
||||||
GetKey(newKey, &newLength);
|
GetKey(newKey, &newLength);
|
||||||
GetVolume()->UpdateLiveQueries(NULL, fNode, GetName(), fType, oldKey,
|
GetVolume()->UpdateLiveQueries(NULL, fNode, GetName(), fType, oldKey,
|
||||||
oldLength, newKey, newLength);
|
oldLength, newKey, newLength);
|
||||||
@@ -125,10 +124,9 @@ Attribute::SetIndex(AttributeIndex *index, bool inIndex)
|
|||||||
|
|
||||||
// GetKey
|
// GetKey
|
||||||
void
|
void
|
||||||
Attribute::GetKey(uint8 *key, size_t *length)
|
Attribute::GetKey(uint8 key[kMaxIndexKeyLength], size_t *length)
|
||||||
{
|
{
|
||||||
*length = min(*length, kMaxIndexKeyLength);
|
ReadAt(0, key, kMaxIndexKeyLength, length);
|
||||||
ReadAt(0, key, *length, length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AttachAttributeIterator
|
// AttachAttributeIterator
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "AttributeIterator.h"
|
#include "AttributeIterator.h"
|
||||||
#include "DataContainer.h"
|
#include "DataContainer.h"
|
||||||
#include "String.h"
|
#include "String.h"
|
||||||
|
#include "ramfs.h"
|
||||||
|
|
||||||
class AllocationInfo;
|
class AllocationInfo;
|
||||||
class Node;
|
class Node;
|
||||||
@@ -36,13 +37,13 @@ public:
|
|||||||
off_t GetSize() const { return DataContainer::GetSize(); }
|
off_t GetSize() const { return DataContainer::GetSize(); }
|
||||||
|
|
||||||
virtual status_t WriteAt(off_t offset, const void *buffer, size_t size,
|
virtual status_t WriteAt(off_t offset, const void *buffer, size_t size,
|
||||||
size_t *bytesWritten);
|
size_t *bytesWritten);
|
||||||
|
|
||||||
// index support
|
// index support
|
||||||
void SetIndex(AttributeIndex *index, bool inIndex);
|
void SetIndex(AttributeIndex *index, bool inIndex);
|
||||||
AttributeIndex *GetIndex() const { return fIndex; }
|
AttributeIndex *GetIndex() const { return fIndex; }
|
||||||
bool IsInIndex() const { return fInIndex; }
|
bool IsInIndex() const { return fInIndex; }
|
||||||
void GetKey(uint8 *key, size_t *length);
|
void GetKey(uint8 key[kMaxIndexKeyLength], size_t *length);
|
||||||
|
|
||||||
// iterator management
|
// iterator management
|
||||||
void AttachAttributeIterator(AttributeIterator *iterator);
|
void AttachAttributeIterator(AttributeIterator *iterator);
|
||||||
|
|||||||
Reference in New Issue
Block a user