]> git.sur5r.net Git - openldap/commitdiff
mtest*.c: Fix MDB_NOOVERWRITE, plug cursor leak
authorHallvard Furuseth <hallvard@openldap.org>
Wed, 20 May 2015 01:17:47 +0000 (03:17 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Wed, 27 May 2015 22:10:29 +0000 (00:10 +0200)
libraries/liblmdb/mtest.c
libraries/liblmdb/mtest2.c
libraries/liblmdb/mtest6.c

index 7efa8b59e15b9f314320d4b44a492ca7bc3a220d..9d15088b0c2cfa7a1babeed93c04085367e5b345 100644 (file)
@@ -54,12 +54,13 @@ int main(int argc,char * argv[])
    
                key.mv_size = sizeof(int);
                key.mv_data = sval;
-               data.mv_size = sizeof(sval);
-               data.mv_data = sval;
 
                printf("Adding %d values\n", count);
            for (i=0;i<count;i++) {     
                        sprintf(sval, "%03x %d foo bar", values[i], values[i]);
+                       /* Set <data> in each iteration, since MDB_NOOVERWRITE may modify it */
+                       data.mv_size = sizeof(sval);
+                       data.mv_data = sval;
                        if (RES(MDB_KEYEXIST, mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE))) {
                                j++;
                                data.mv_size = sizeof(sval);
@@ -130,6 +131,7 @@ int main(int argc,char * argv[])
                                (int) key.mv_size,  (char *) key.mv_data,
                                (int) data.mv_size, (char *) data.mv_data);
 
+               mdb_cursor_close(cursor);
                mdb_txn_abort(txn);
 
                printf("Deleting with cursor\n");
index cc6ecf602665e70c2fc2307a5f6a8bbc3317366a..eacbe59d53b3dd73711147a23821e11acbf1e7d4 100644 (file)
@@ -57,12 +57,12 @@ int main(int argc,char * argv[])
    
        key.mv_size = sizeof(int);
        key.mv_data = sval;
-       data.mv_size = sizeof(sval);
-       data.mv_data = sval;
 
        printf("Adding %d values\n", count);
        for (i=0;i<count;i++) { 
                sprintf(sval, "%03x %d foo bar", values[i], values[i]);
+               data.mv_size = sizeof(sval);
+               data.mv_data = sval;
                if (RES(MDB_KEYEXIST, mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE)))
                        j++;
        }
index 174f4f67f6c6cd08f85a99a8178eeb57f7b13516..ae3c7f264ca400bf7248dfd12a22a4ccd86d039b 100644 (file)
@@ -31,7 +31,7 @@ int main(int argc,char * argv[])
        int i = 0, j = 0, rc;
        MDB_env *env;
        MDB_dbi dbi;
-       MDB_val key, data;
+       MDB_val key, data, sdata;
        MDB_txn *txn;
        MDB_stat mst;
        MDB_cursor *cursor;
@@ -55,25 +55,28 @@ int main(int argc,char * argv[])
        sval = calloc(1, mst.ms_psize / 4);
        key.mv_size = sizeof(long);
        key.mv_data = &kval;
-       data.mv_size = mst.ms_psize / 4 - 30;
-       data.mv_data = sval;
+       sdata.mv_size = mst.ms_psize / 4 - 30;
+       sdata.mv_data = sval;
 
        printf("Adding 12 values, should yield 3 splits\n");
        for (i=0;i<12;i++) {
                kval = i*5;
                sprintf(sval, "%08x", kval);
+               data = sdata;
                (void)RES(MDB_KEYEXIST, mdb_cursor_put(cursor, &key, &data, MDB_NOOVERWRITE));
        }
        printf("Adding 12 more values, should yield 3 splits\n");
        for (i=0;i<12;i++) {
                kval = i*5+4;
                sprintf(sval, "%08x", kval);
+               data = sdata;
                (void)RES(MDB_KEYEXIST, mdb_cursor_put(cursor, &key, &data, MDB_NOOVERWRITE));
        }
        printf("Adding 12 more values, should yield 3 splits\n");
        for (i=0;i<12;i++) {
                kval = i*5+1;
                sprintf(sval, "%08x", kval);
+               data = sdata;
                (void)RES(MDB_KEYEXIST, mdb_cursor_put(cursor, &key, &data, MDB_NOOVERWRITE));
        }
        E(mdb_cursor_get(cursor, &key, &data, MDB_FIRST));