Skip to content

Commit 51ffcbb

Browse files
committed
Fix for ArrayPool allocating buffers larger than requested
1 parent a1d2524 commit 51ffcbb

File tree

4 files changed

+27
-20
lines changed

4 files changed

+27
-20
lines changed

Maploader/World/SubChunkData.cs

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public class SubChunkData
77
{
88
public byte[] Key { get; set; }
99
public byte[] Data { get; set; }
10+
public int DataLength { get; set; }
1011
public UInt32 Crc32 { get; set; }
1112
public byte Index { get; set; }
1213
public bool FoundInDb { get; set; }

Maploader/World/World.cs

+18-13
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,17 @@ public ChunkData GetOverworldChunkData(int x, int z)
4747
for (byte subChunkIdx = 0; subChunkIdx < 15; subChunkIdx++)
4848
{
4949
key[9] = subChunkIdx;
50-
51-
var data = db.Get(key);
50+
UIntPtr length;
51+
var data = db.Get(key, out length);
5252
if (data != null)
5353
{
5454
var subChunkData = new SubChunkData()
5555
{
5656
Index = subChunkIdx,
5757
Data = data,
58+
DataLength = (int)length,
5859
Key = key,
59-
Crc32 = Force.Crc32.Crc32CAlgorithm.Compute(data)
60+
Crc32 = Force.Crc32.Crc32CAlgorithm.Compute(data, 0, (int)length)
6061
};
6162
ret.SubChunks.Add(subChunkData);
6263
}
@@ -100,8 +101,8 @@ public Chunk GetChunk(int x, int z)
100101
for (byte subChunkIdx = 0; subChunkIdx < 15; subChunkIdx++)
101102
{
102103
key[9] = subChunkIdx;
103-
104-
var data = db.Get(key);
104+
UIntPtr length;
105+
var data = db.Get(key, out length);
105106
if (data != null)
106107
{
107108
subChunks[subChunkIdx] = data;
@@ -461,16 +462,17 @@ public ChunkData GetChunkData(GroupedChunkSubKeys groupedChunkSubKeys)
461462
foreach (var kvp in groupedChunkSubKeys.Subchunks)
462463
{
463464
var key = kvp.Value;
464-
465-
var data = db.Get(key.Key);
465+
UIntPtr length;
466+
var data = db.Get(key.Key, out length);
466467
if (data != null)
467468
{
468469
var subChunkData = new SubChunkData()
469470
{
470471
Index = kvp.Key,
471472
Data = data,
473+
DataLength = (int)length,
472474
Key = kvp.Value.Key,
473-
Crc32 = Force.Crc32.Crc32CAlgorithm.Compute(data),
475+
Crc32 = Force.Crc32.Crc32CAlgorithm.Compute(data, 0, (int)length),
474476
};
475477
ret.SubChunks.Add(subChunkData);
476478
}
@@ -499,16 +501,17 @@ public ChunkData GetChunkData(IGrouping<ulong, LevelDbWorldKey2> groupedChunkSub
499501
foreach (var kvp in groupedChunkSubKeys)
500502
{
501503
var key = kvp;
502-
503-
var data = db.Get(key.Key);
504+
UIntPtr length;
505+
var data = db.Get(key.Key, out length);
504506
if (data != null)
505507
{
506508
var subChunkData = new SubChunkData()
507509
{
508510
Index = key.SubChunkId,
509511
Data = data,
512+
DataLength = (int)length,
510513
Key = key.Key,
511-
// Crc32 = Force.Crc32.Crc32CAlgorithm.Compute(data),
514+
// Crc32 = Force.Crc32.Crc32CAlgorithm.Compute(data, 0, (int)length),
512515
};
513516
ret.SubChunks.Add(subChunkData);
514517
}
@@ -534,15 +537,17 @@ public ChunkData GetChunkData(int x, int z)
534537
var key = CreateKey(x, z);
535538
key[9] = (byte)kvp;
536539

537-
var data = db.Get(key);
540+
UIntPtr length;
541+
var data = db.Get(key, out length);
538542
if (data != null)
539543
{
540544
var subChunkData = new SubChunkData()
541545
{
542546
Index = (byte)kvp,
543547
Data = data,
548+
DataLength = (int)length,
544549
Key = key,
545-
Crc32 = Force.Crc32.Crc32CAlgorithm.Compute(data),
550+
Crc32 = Force.Crc32.Crc32CAlgorithm.Compute(data, 0, (int)length),
546551
};
547552
ret.SubChunks.Add(subChunkData);
548553
}

leveldb-sharp-std/DB.cs

+6-5
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ public class DB : IDisposable, IEnumerable<KeyValuePair<byte[], byte[]>>
6262

6363
public byte[] this[byte[] key] {
6464
get {
65-
return Get(null, key);
65+
UIntPtr unusedLength;
66+
return Get(null, key, out unusedLength);
6667
}
6768
set {
6869
Put(null, key, value);
@@ -183,18 +184,18 @@ public void Write(WriteBatch writeBatch)
183184
Write(null, writeBatch);
184185
}
185186

186-
public byte[] Get(ReadOptions options, byte[] key)
187+
public byte[] Get(ReadOptions options, byte[] key, out UIntPtr length)
187188
{
188189
CheckDisposed();
189190
if (options == null) {
190191
options = new ReadOptions();
191192
}
192-
return Native.leveldb_get(Handle, options.Handle, key);
193+
return Native.leveldb_get(Handle, options.Handle, key, out length);
193194
}
194195

195-
public byte[] Get(byte[] key)
196+
public byte[] Get(byte[] key, out UIntPtr length)
196197
{
197-
return Get(null, key);
198+
return Get(null, key, out length);
198199
}
199200

200201
IEnumerator IEnumerable.GetEnumerator()

leveldb-sharp-std/Native.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -196,15 +196,15 @@ public static extern IntPtr leveldb_get(IntPtr db,
196196

197197
public static byte[] leveldb_get(IntPtr db,
198198
IntPtr readOptions,
199-
byte[] key)
199+
byte[] key,
200+
out UIntPtr valueLength)
200201
{
201202

202203

203204
unsafe
204205
{
205206
fixed (byte* p = key)
206207
{
207-
UIntPtr valueLength;
208208
string error;
209209
var keyLength = (UIntPtr) key.Length;
210210
IntPtr keyPtr = (IntPtr)p;

0 commit comments

Comments
 (0)