diff options
author | Joseph Sutton <josephsutton@catalyst.net.nz> | 2023-01-27 08:06:47 +1300 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2023-03-08 04:39:32 +0000 |
commit | d5f053711bd5b78f2eff035b4b287995ae286901 (patch) | |
tree | e8825cfda74e18a4a161e0d87878b229f9b65bc1 /lib/ldb | |
parent | 598eaa3474191d29ab2f1a356a26e479a441a198 (diff) | |
download | samba-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.c | 13 |
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; } /* |