]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
mdb_dbi_open tweak
authorHoward Chu <hyc@openldap.org>
Thu, 31 Aug 2017 14:11:54 +0000 (15:11 +0100)
committerHoward Chu <hyc@openldap.org>
Sat, 10 Oct 2020 12:05:55 +0000 (13:05 +0100)
Always save the terminating NUL of the incoming DB name
Stop using the old mdb_open/mdb_close function names
 .. should consider renaming mdb_stat/mdb_drop to mdb_dbi_... too.

libraries/liblmdb/mdb.c
libraries/liblmdb/mdb_dump.c
libraries/liblmdb/mdb_load.c
libraries/liblmdb/mdb_stat.c

index 4b774588067742d2a5b5625920223a65b530b766..8f2a18ccd620e45a5f5b4f7d6199b28a01b2c70f 100644 (file)
@@ -11110,7 +11110,7 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
        int rc, dbflag, exact;
        unsigned int unused = 0, seq;
        char *namedup;
-       size_t len;
+       size_t size;
 
        if (flags & ~VALID_FLAGS)
                return EINVAL;
@@ -11137,15 +11137,15 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
        }
 
        /* Is the DB already open? */
-       len = strlen(name);
+       size = strlen(name) + 1;
        for (i=CORE_DBS; i<txn->mt_numdbs; i++) {
                if (!txn->mt_dbxs[i].md_name.mv_size) {
                        /* Remember this free slot */
                        if (!unused) unused = i;
                        continue;
                }
-               if (len == txn->mt_dbxs[i].md_name.mv_size &&
-                       !strncmp(name, txn->mt_dbxs[i].md_name.mv_data, len)) {
+               if (size == txn->mt_dbxs[i].md_name.mv_size &&
+                       !strcmp(name, txn->mt_dbxs[i].md_name.mv_data)) {
                        *dbi = i;
                        return MDB_SUCCESS;
                }
@@ -11162,7 +11162,7 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
        /* Find the DB info */
        dbflag = DB_NEW|DB_VALID|DB_USRVALID;
        exact = 0;
-       key.mv_size = len;
+       key.mv_size = size;
        key.mv_data = (void *)name;
        mdb_cursor_init(&mc, txn, MAIN_DBI, NULL);
        rc = mdb_cursor_set(&mc, &key, &data, MDB_SET, &exact);
@@ -11197,7 +11197,7 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
                /* Got info, register DBI in this txn */
                unsigned int slot = unused ? unused : txn->mt_numdbs;
                txn->mt_dbxs[slot].md_name.mv_data = namedup;
-               txn->mt_dbxs[slot].md_name.mv_size = len;
+               txn->mt_dbxs[slot].md_name.mv_size = size;
                txn->mt_dbxs[slot].md_rel = NULL;
                txn->mt_dbflags[slot] = dbflag;
                /* txn-> and env-> are the same in read txns, use
index 77c2a5a3583b6294d8942846223458c5461de7b3..57e79837df70c91a3302a1f3ac004fa64e86810c 100644 (file)
@@ -254,9 +254,9 @@ int main(int argc, char *argv[])
                goto env_close;
        }
 
-       rc = mdb_open(txn, subname, 0, &dbi);
+       rc = mdb_dbi_open(txn, subname, 0, &dbi);
        if (rc) {
-               fprintf(stderr, "mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
+               fprintf(stderr, "mdb_dbi_open failed, error %d %s\n", rc, mdb_strerror(rc));
                goto txn_abort;
        }
 
@@ -271,27 +271,22 @@ int main(int argc, char *argv[])
                        goto txn_abort;
                }
                while ((rc = mdb_cursor_get(cursor, &key, NULL, MDB_NEXT_NODUP)) == 0) {
-                       char *str;
                        MDB_dbi db2;
-                       if (memchr(key.mv_data, '\0', key.mv_size))
+                       if (memchr(key.mv_data, '\0', key.mv_size-1) || ((char *)key.mv_data)[key.mv_size=1] != '\0')
                                continue;
                        count++;
-                       str = malloc(key.mv_size+1);
-                       memcpy(str, key.mv_data, key.mv_size);
-                       str[key.mv_size] = '\0';
-                       rc = mdb_open(txn, str, 0, &db2);
+                       rc = mdb_dbi_open(txn, key.mv_data, 0, &db2);
                        if (rc == MDB_SUCCESS) {
                                if (list) {
-                                       printf("%s\n", str);
+                                       printf("%s\n", (char *)key.mv_data);
                                        list++;
                                } else {
-                                       rc = dumpit(txn, db2, str);
+                                       rc = dumpit(txn, db2, key.mv_data);
                                        if (rc)
                                                break;
                                }
-                               mdb_close(env, db2);
+                               mdb_dbi_close(env, db2);
                        }
-                       free(str);
                        if (rc) continue;
                }
                mdb_cursor_close(cursor);
index 417fad2e3a325b9cb3f18fccb62601597f119d1b..7888144a7e5098bc6a89b30196cf94d12bbf6160 100644 (file)
@@ -384,9 +384,9 @@ int main(int argc, char *argv[])
                        goto env_close;
                }
 
-               rc = mdb_open(txn, subname, flags|MDB_CREATE, &dbi);
+               rc = mdb_dbi_open(txn, subname, flags|MDB_CREATE, &dbi);
                if (rc) {
-                       fprintf(stderr, "mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
+                       fprintf(stderr, "mdb_dbi_open failed, error %d %s\n", rc, mdb_strerror(rc));
                        goto txn_abort;
                }
 
index c67ed6021adc93c83740dee02d4d17f132c10cf1..a94f5cd9facab762084e244b946903dddc7de063 100644 (file)
@@ -204,9 +204,9 @@ int main(int argc, char *argv[])
                printf("  Free pages: %"Yu"\n", pages);
        }
 
-       rc = mdb_open(txn, subname, 0, &dbi);
+       rc = mdb_dbi_open(txn, subname, 0, &dbi);
        if (rc) {
-               fprintf(stderr, "mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
+               fprintf(stderr, "mdb_dbi_open failed, error %d %s\n", rc, mdb_strerror(rc));
                goto txn_abort;
        }
 
@@ -228,17 +228,12 @@ int main(int argc, char *argv[])
                        goto txn_abort;
                }
                while ((rc = mdb_cursor_get(cursor, &key, NULL, MDB_NEXT_NODUP)) == 0) {
-                       char *str;
                        MDB_dbi db2;
-                       if (memchr(key.mv_data, '\0', key.mv_size))
+                       if (memchr(key.mv_data, '\0', key.mv_size-1) || ((char *)key.mv_data)[key.mv_size-1] != '\0')
                                continue;
-                       str = malloc(key.mv_size+1);
-                       memcpy(str, key.mv_data, key.mv_size);
-                       str[key.mv_size] = '\0';
-                       rc = mdb_open(txn, str, 0, &db2);
+                       rc = mdb_dbi_open(txn, key.mv_data, 0, &db2);
                        if (rc == MDB_SUCCESS)
-                               printf("Status of %s\n", str);
-                       free(str);
+                               printf("Status of %s\n", (char *)key.mv_data);
                        if (rc) continue;
                        rc = mdb_stat(txn, db2, &mst);
                        if (rc) {
@@ -246,7 +241,7 @@ int main(int argc, char *argv[])
                                goto txn_abort;
                        }
                        prstat(&mst);
-                       mdb_close(env, db2);
+                       mdb_dbi_close(env, db2);
                }
                mdb_cursor_close(cursor);
        }
@@ -254,7 +249,7 @@ int main(int argc, char *argv[])
        if (rc == MDB_NOTFOUND)
                rc = MDB_SUCCESS;
 
-       mdb_close(env, dbi);
+       mdb_dbi_close(env, dbi);
 txn_abort:
        mdb_txn_abort(txn);
 env_close: