summaryrefslogtreecommitdiff
path: root/lib/ldb
diff options
context:
space:
mode:
authorJoseph Sutton <josephsutton@catalyst.net.nz>2023-01-27 08:06:47 +1300
committerAndrew Bartlett <abartlet@samba.org>2023-03-08 04:39:32 +0000
commitd5f053711bd5b78f2eff035b4b287995ae286901 (patch)
treee8825cfda74e18a4a161e0d87878b229f9b65bc1 /lib/ldb
parent598eaa3474191d29ab2f1a356a26e479a441a198 (diff)
downloadsamba-d5f053711bd5b78f2eff035b4b287995ae286901.tar.gz
ldb: Make ldb_msg_remove_attr O(n)
Previously it was O(n²). Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'lib/ldb')
-rw-r--r--lib/ldb/common/ldb_msg.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/ldb/common/ldb_msg.c b/lib/ldb/common/ldb_msg.c
index 9cd7998e21c..4146de185d7 100644
--- a/lib/ldb/common/ldb_msg.c
+++ b/lib/ldb/common/ldb_msg.c
@@ -1464,11 +1464,18 @@ void ldb_msg_remove_element(struct ldb_message *msg, struct ldb_message_element
*/
void ldb_msg_remove_attr(struct ldb_message *msg, const char *attr)
{
- struct ldb_message_element *el;
+ unsigned int i;
+ unsigned int num_del = 0;
- while ((el = ldb_msg_find_element(msg, attr)) != NULL) {
- ldb_msg_remove_element(msg, el);
+ for (i = 0; i < msg->num_elements; ++i) {
+ if (ldb_attr_cmp(msg->elements[i].name, attr) == 0) {
+ ++num_del;
+ } else if (num_del) {
+ msg->elements[i - num_del] = msg->elements[i];
+ }
}
+
+ msg->num_elements -= num_del;
}
/*