]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
ldb: Make ldb_msg_remove_attr O(n)
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Thu, 26 Jan 2023 19:06:47 +0000 (08:06 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 8 Mar 2023 04:39:32 +0000 (04:39 +0000)
Previously it was O(n²).

Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
lib/ldb/common/ldb_msg.c

index 9cd7998e21ce423e838eb278abd0ff948ff68405..4146de185d707b738cdcdd1a55021d3542041c25 100644 (file)
@@ -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;
 }
 
 /*