]> git.saurik.com Git - apple/security.git/blob - OSX/libsecurity_filedb/lib/ReadWriteSection.cpp
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / libsecurity_filedb / lib / ReadWriteSection.cpp
1 #include "ReadWriteSection.h"
2
3 uint32 WriteSection::put(uint32 inOffset, uint32 inValue)
4 {
5 uint32 aLength = CheckUInt32Add(inOffset, sizeof(inValue));
6 if (aLength > mCapacity)
7 grow(aLength);
8
9 if (mAddress == NULL)
10 CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
11
12 *reinterpret_cast<uint32 *>(mAddress + inOffset) = htonl(inValue);
13 return aLength;
14 }
15
16
17
18 uint32 WriteSection::put(uint32 inOffset, uint32 inLength, const uint8 *inData)
19 {
20 // if we are being asked to put 0 bytes, just return
21 if (inLength == 0 || inData == NULL)
22 {
23 return inOffset;
24 }
25
26 uint32 aLength = CheckUInt32Add(inOffset, inLength);
27
28 // Round up to nearest multiple of 4 bytes, to pad with zeros
29 uint32 aNewOffset = align(aLength);
30 if (aNewOffset > mCapacity)
31 grow(aNewOffset);
32
33 if (mAddress == NULL)
34 CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
35
36 memcpy(mAddress + inOffset, inData, inLength);
37
38 for (uint32 anOffset = aLength; anOffset < aNewOffset; anOffset++)
39 mAddress[anOffset] = 0;
40
41 return aNewOffset;
42 }
43
44
45
46 void WriteSection::grow(size_t inNewCapacity)
47 {
48 size_t n = CheckUInt32Multiply((uint32)mCapacity, 2);
49 size_t aNewCapacity = max(n, inNewCapacity);
50 mAddress = reinterpret_cast<uint8 *>(mAllocator.realloc(mAddress, aNewCapacity));
51
52 if (mAddress == NULL)
53 CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
54
55 memset(mAddress + mCapacity, 0, aNewCapacity - mCapacity);
56 mCapacity = aNewCapacity;
57 }