Author: idra Date: 2005-09-18 10:47:03 +0000 (Sun, 18 Sep 2005) New Revision: 10304
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10304 Log: check for basic ldb_message sanity and return appropriate LDB_ERR_ value Modified: branches/SAMBA_4_0/source/lib/ldb/common/ldb.c branches/SAMBA_4_0/source/lib/ldb/common/ldb_msg.c branches/SAMBA_4_0/source/lib/ldb/include/ldb.h branches/SAMBA_4_0/source/lib/ldb/include/ldb_private.h Changeset: Modified: branches/SAMBA_4_0/source/lib/ldb/common/ldb.c =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/common/ldb.c 2005-09-18 10:46:21 UTC (rev 10303) +++ branches/SAMBA_4_0/source/lib/ldb/common/ldb.c 2005-09-18 10:47:03 UTC (rev 10304) @@ -34,6 +34,7 @@ #include "includes.h" #include "ldb/include/ldb.h" +#include "ldb/include/ldb_errors.h" #include "ldb/include/ldb_private.h" /* @@ -89,20 +90,20 @@ #endif else { ldb_debug(ldb, LDB_DEBUG_FATAL, "Unable to find backend for '%s'\n", url); - return -1; + return LDB_ERR_OTHER; } - if (ret != 0) { + if (ret != LDB_ERR_SUCCESS) { ldb_debug(ldb, LDB_DEBUG_ERROR, "Failed to connect to '%s'\n", url); return ret; } - if (ldb_load_modules(ldb, options) != 0) { + if (ldb_load_modules(ldb, options) != LDB_ERR_SUCCESS) { ldb_debug(ldb, LDB_DEBUG_FATAL, "Unable to load modules for '%s'\n", url); - return -1; + return LDB_ERR_OTHER; } - return 0; + return LDB_ERR_SUCCESS; } /* @@ -162,9 +163,15 @@ int ldb_add(struct ldb_context *ldb, const struct ldb_message *message) { - int status = ldb_start_trans(ldb); - if (status != 0) return status; + int status; + + status = ldb_msg_sanity_check(message); + if (status != LDB_ERR_SUCCESS) return status; + + status = ldb_start_trans(ldb); + if (status != LDB_ERR_SUCCESS) return status; + status = ldb->modules->ops->add_record(ldb->modules, message); return ldb_end_trans(ldb, status); } @@ -175,9 +182,14 @@ int ldb_modify(struct ldb_context *ldb, const struct ldb_message *message) { - int status = ldb_start_trans(ldb); - if (status != 0) return status; + int status; + status = ldb_msg_sanity_check(message); + if (status != LDB_ERR_SUCCESS) return status; + + status = ldb_start_trans(ldb); + if (status != LDB_ERR_SUCCESS) return status; + status = ldb->modules->ops->modify_record(ldb->modules, message); return ldb_end_trans(ldb, status); } @@ -189,7 +201,7 @@ int ldb_delete(struct ldb_context *ldb, const struct ldb_dn *dn) { int status = ldb_start_trans(ldb); - if (status != 0) return status; + if (status != LDB_ERR_SUCCESS) return status; status = ldb->modules->ops->delete_record(ldb->modules, dn); return ldb_end_trans(ldb, status); @@ -201,7 +213,7 @@ int ldb_rename(struct ldb_context *ldb, const struct ldb_dn *olddn, const struct ldb_dn *newdn) { int status = ldb_start_trans(ldb); - if (status != 0) return status; + if (status != LDB_ERR_SUCCESS) return status; status = ldb->modules->ops->rename_record(ldb->modules, olddn, newdn); return ldb_end_trans(ldb, status); @@ -227,13 +239,13 @@ struct ldb_opaque *o = talloc(ldb, struct ldb_opaque); if (o == NULL) { ldb_oom(ldb); - return -1; + return LDB_ERR_OTHER; } o->next = ldb->opaque; o->name = name; o->value = value; ldb->opaque = o; - return 0; + return LDB_ERR_SUCCESS; } /* Modified: branches/SAMBA_4_0/source/lib/ldb/common/ldb_msg.c =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/common/ldb_msg.c 2005-09-18 10:46:21 UTC (rev 10303) +++ branches/SAMBA_4_0/source/lib/ldb/common/ldb_msg.c 2005-09-18 10:47:03 UTC (rev 10304) @@ -34,6 +34,7 @@ #include "includes.h" #include "ldb/include/ldb.h" +#include "ldb/include/ldb_errors.h" #include "ldb/include/ldb_private.h" /* @@ -499,3 +500,32 @@ return mod; } + +int ldb_msg_sanity_check(const struct ldb_message *msg) +{ + int i, j; + + /* basic check on DN */ + if (msg->dn == NULL) { + /* TODO: return also an error string */ + return LDB_ERR_INVALID_DN_SYNTAX; + } + if (msg->dn->comp_num == 0) { + /* root dse has empty dn */ + /* TODO: return also an error string */ + return LDB_ERR_ENTRY_ALREADY_EXISTS; + } + + /* basic syntax checks */ + for (i = 0; i < msg->num_elements; i++) { + for (j = 0; j < msg->elements[i].num_values; j++) { + if (msg->elements[i].values[j].length == 0) { + /* an attribute cannot be empty */ + /* TODO: return also an error string */ + return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; + } + } + } + + return LDB_ERR_SUCCESS; +} Modified: branches/SAMBA_4_0/source/lib/ldb/include/ldb.h =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/include/ldb.h 2005-09-18 10:46:21 UTC (rev 10303) +++ branches/SAMBA_4_0/source/lib/ldb/include/ldb.h 2005-09-18 10:47:03 UTC (rev 10304) @@ -3,6 +3,7 @@ Copyright (C) Andrew Tridgell 2004 Copyright (C) Stefan Metzmacher 2004 + Copyright (C) Simo Sorce 2005 ** NOTE! The following LGPL license applies to the ldb ** library. This does NOT imply that all of Samba is released @@ -451,6 +452,8 @@ struct ldb_message *msg1, struct ldb_message *msg2); +int ldb_msg_sanity_check(const struct ldb_message *msg); + struct ldb_val ldb_val_dup(void *mem_ctx, const struct ldb_val *v); /* Modified: branches/SAMBA_4_0/source/lib/ldb/include/ldb_private.h =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/include/ldb_private.h 2005-09-18 10:46:21 UTC (rev 10303) +++ branches/SAMBA_4_0/source/lib/ldb/include/ldb_private.h 2005-09-18 10:47:03 UTC (rev 10304) @@ -3,7 +3,7 @@ Copyright (C) Andrew Tridgell 2004 Copyright (C) Stefan Metzmacher 2004 - Copyright (C) Simo Sorce 2004 + Copyright (C) Simo Sorce 2004-2005 ** NOTE! The following LGPL license applies to the ldb ** library. This does NOT imply that all of Samba is released
