From: Andrew Bartlett Date: Sat, 29 Feb 2020 03:03:00 +0000 (+1300) Subject: ldb: ensure that ldbedit operates like ldbmodify: set DONT_CREATE_DB X-Git-Tag: ldb-2.2.0~1535 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8aa05525e276fb315e21f78d468e48fa286e6c3;p=thirdparty%2Fsamba.git ldb: ensure that ldbedit operates like ldbmodify: set DONT_CREATE_DB ldb* tools, when passed a raw filename assume tdb:// By default, ldb_tdb will call tdb with O_CREAT. TDB, when passed O_CREAT and a not-tdb file, will wipe the file. This means that if you run ldbedit the file will be wiped, which is unexpected. I noticed this while trying to corrupt a sam.ldb backend file (for testing), but instead I wiped it! Ideally tdb would not do that, but the behaviour has been this way for decades. Ideally ldb would have had a "create db" command, but this has been the job of ldbadd for over a decade. So this just blunts the knife for ldbedit. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14302 Signed-off-by: Andrew Bartlett Reviewed-by: Gary Lockyer --- diff --git a/lib/ldb/tools/cmdline.c b/lib/ldb/tools/cmdline.c index a2fe97ee6b2..d53161574fd 100644 --- a/lib/ldb/tools/cmdline.c +++ b/lib/ldb/tools/cmdline.c @@ -96,6 +96,7 @@ static bool add_control(TALLOC_CTX *mem_ctx, const char *control) static struct ldb_cmdline *ldb_cmdline_process_internal(struct ldb_context *ldb, int argc, const char **argv, void (*usage)(struct ldb_context *), + bool dont_create, bool search) { struct ldb_cmdline *ret=NULL; @@ -326,14 +327,21 @@ struct ldb_cmdline *ldb_cmdline_process_search(struct ldb_context *ldb, int argc, const char **argv, void (*usage)(struct ldb_context *)) { - return ldb_cmdline_process_internal(ldb, argc, argv, usage, true); + return ldb_cmdline_process_internal(ldb, argc, argv, usage, true, true); +} + +struct ldb_cmdline *ldb_cmdline_process_edit(struct ldb_context *ldb, + int argc, const char **argv, + void (*usage)(struct ldb_context *)) +{ + return ldb_cmdline_process_internal(ldb, argc, argv, usage, false, true); } struct ldb_cmdline *ldb_cmdline_process(struct ldb_context *ldb, int argc, const char **argv, void (*usage)(struct ldb_context *)) { - return ldb_cmdline_process_internal(ldb, argc, argv, usage, false); + return ldb_cmdline_process_internal(ldb, argc, argv, usage, false, false); } /* this function check controls reply and determines if more diff --git a/lib/ldb/tools/cmdline.h b/lib/ldb/tools/cmdline.h index 9af0ea168b7..dbc216aab17 100644 --- a/lib/ldb/tools/cmdline.h +++ b/lib/ldb/tools/cmdline.h @@ -49,6 +49,9 @@ struct ldb_cmdline { struct ldb_cmdline *ldb_cmdline_process_search(struct ldb_context *ldb, int argc, const char **argv, void (*usage)(struct ldb_context *)); +struct ldb_cmdline *ldb_cmdline_process_edit(struct ldb_context *ldb, + int argc, const char **argv, + void (*usage)(struct ldb_context *)); struct ldb_cmdline *ldb_cmdline_process(struct ldb_context *ldb, int argc, const char **argv, void (*usage)(struct ldb_context *)); diff --git a/lib/ldb/tools/ldbedit.c b/lib/ldb/tools/ldbedit.c index 5b837834482..497ef970244 100644 --- a/lib/ldb/tools/ldbedit.c +++ b/lib/ldb/tools/ldbedit.c @@ -327,7 +327,7 @@ int main(int argc, const char **argv) return LDB_ERR_OPERATIONS_ERROR; } - options = ldb_cmdline_process(ldb, argc, argv, usage); + options = ldb_cmdline_process_edit(ldb, argc, argv, usage); /* the check for '=' is for compatibility with ldapsearch */ if (options->argc > 0 &&