NULevelDB icon indicating copy to clipboard operation
NULevelDB copied to clipboard

BAD ACCESS in enumerateFromIndex:to:block:

Open scriptease opened this issue 13 years ago • 1 comments

Hi,

i get a bad access when i am using enumerateFromIndex, normal access with storedDataForIndexKey works.

Here the stack trace:

#0  0x017bfeff in memcpy$VARIANT$sse42 ()
#1  0x0016666b in std::string::append(char const*, unsigned long) ()
#2  0x000448c8 in leveldb::AppendInternalKey(std::string*, leveldb::ParsedInternalKey const&) at /Users/florian/GitHub/NULevelDB/leveldb/db/dbformat.cc:19
#3  0x0002e466 in leveldb::(anonymous namespace)::DBIter::Seek(leveldb::Slice const&) at /Users/florian/GitHub/NULevelDB/leveldb/db/db_iter.cc:260
#4  0x0001a813 in NULDBIterateIndex(leveldb::DB*, leveldb::Slice&, leveldb::Slice&, signed char ()(unsigned long long, NSData*) block_pointer) at /Users/florian/GitHub/NULevelDB/Classes/NULDBDB+Enumeration.mm:111
#5  0x00019c07 in -[NULDBDB(Enumeration) enumerateFromIndex:to:block:] at /Users/florian/GitHub/NULevelDB/Classes/NULDBDB+Enumeration.mm:186
#6  0x00002cda in -[NULevelDB_TestAppAppDelegate runTests] at     /Users/florian/GitHub/NULevelDB/Tests/NULevelDB-TestApp/NULevelDB-TestApp/NULevelDB_TestAppAppDelegate.m:90

Here a simple example that will crash

NSData* data = [NSData dataWithContentsOfFile:@"~/GitHub/NULevelDB/README.md"];

[db storeData: data forIndexKey:10 error:NULL];
[db storeData: data forIndexKey:11 error:NULL];
[db storeData: data forIndexKey:12 error:NULL];
[db storeData: data forIndexKey:13 error:NULL];
[db storeData: data forIndexKey:14 error:NULL];
[db storeData: data forIndexKey:15 error:NULL];

NSLog(@"%@",[db storedDataForIndexKey:10 error:NULL]);

[db enumerateFromIndex:10 to:15 block:^(uint64_t key, NSData *value) {
    NSLog(@"%@",value);
    return YES;
}];

Thanks!

Greetings, Florian

scriptease avatar Oct 27 '12 12:10 scriptease

Found the bug in NULDBDB+Enumeration:

- (void)enumerateFromIndex:(uint64_t)start to:(uint64_t)limit block:(BOOL (^)(uint64_t key, NSData *value))block {
    Slice startSlice((char *)start, sizeof(uint64_t));
    Slice limitSlice((char *)limit, sizeof(uint64_t));

    NULDBIterateIndex(db, startSlice, limitSlice, block);
}

should be

- (void)enumerateFromIndex:(uint64_t)start to:(uint64_t)limit block:(BOOL (^)(uint64_t key, NSData *value))block {
    Slice startSlice((char *)&start, sizeof(uint64_t));
    Slice limitSlice((char *)&limit, sizeof(uint64_t));

    NULDBIterateIndex(db, startSlice, limitSlice, block);
}

scriptease avatar Oct 27 '12 13:10 scriptease