diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-09-13 22:05:45 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:38:09 -0500 |
commit | a129ad36eb34bbeda80c75b2f8d771bdaca8451e (patch) | |
tree | 07a70c2d8d5a7f687a79334874b4a3d34701922b | |
parent | 234481fd40f02a3cd2cccfea0909d248b82a83d8 (diff) | |
download | samba-a129ad36eb34bbeda80c75b2f8d771bdaca8451e.tar.gz samba-a129ad36eb34bbeda80c75b2f8d771bdaca8451e.tar.bz2 samba-a129ad36eb34bbeda80c75b2f8d771bdaca8451e.zip |
r10213: fixed a memory leak in the ldap client and server code spotted by Karl
Melcher. ldap_encode() now takes a memory context to use for the data
blob
(This used to be commit 09948a59336a7f02bf2b4605f2d4d886e65b85f2)
-rw-r--r-- | source4/ldap_server/ldap_server.c | 4 | ||||
-rw-r--r-- | source4/libcli/cldap/cldap.c | 9 | ||||
-rw-r--r-- | source4/libcli/ldap/ldap.c | 4 | ||||
-rw-r--r-- | source4/libcli/ldap/ldap_client.c | 2 |
4 files changed, 9 insertions, 10 deletions
diff --git a/source4/ldap_server/ldap_server.c b/source4/ldap_server/ldap_server.c index 4320a0ad5e..92adc8a890 100644 --- a/source4/ldap_server/ldap_server.c +++ b/source4/ldap_server/ldap_server.c @@ -87,12 +87,14 @@ static void ldapsrv_process_message(struct ldapsrv_connection *conn, DATA_BLOB b; msg = call->replies->msg; - if (!ldap_encode(msg, &b)) { + if (!ldap_encode(msg, &b, call)) { DEBUG(0,("Failed to encode ldap reply of type %d\n", msg->type)); goto failed; } status = data_blob_append(call, &blob, b.data, b.length); + data_blob_free(&b); + if (!NT_STATUS_IS_OK(status)) goto failed; DLIST_REMOVE(call->replies, call->replies); diff --git a/source4/libcli/cldap/cldap.c b/source4/libcli/cldap/cldap.c index 4ffa40d134..07744553c8 100644 --- a/source4/libcli/cldap/cldap.c +++ b/source4/libcli/cldap/cldap.c @@ -337,12 +337,11 @@ struct cldap_request *cldap_search_send(struct cldap_socket *cldap, goto failed; } - if (!ldap_encode(msg, &req->encoded)) { + if (!ldap_encode(msg, &req->encoded, req)) { DEBUG(0,("Failed to encode cldap message to %s:%d\n", req->dest_addr, req->dest_port)); goto failed; } - talloc_steal(req, req->encoded.data); DLIST_ADD_END(cldap->send_queue, req, struct cldap_request *); @@ -389,13 +388,12 @@ NTSTATUS cldap_reply_send(struct cldap_socket *cldap, struct cldap_reply *io) msg->type = LDAP_TAG_SearchResultEntry; msg->r.SearchResultEntry = *io->response; - if (!ldap_encode(msg, &blob1)) { + if (!ldap_encode(msg, &blob1, req)) { DEBUG(0,("Failed to encode cldap message to %s:%d\n", req->dest_addr, req->dest_port)); status = NT_STATUS_INVALID_PARAMETER; goto failed; } - talloc_steal(req, blob1.data); } else { blob1 = data_blob(NULL, 0); } @@ -403,13 +401,12 @@ NTSTATUS cldap_reply_send(struct cldap_socket *cldap, struct cldap_reply *io) msg->type = LDAP_TAG_SearchResultDone; msg->r.SearchResultDone = *io->result; - if (!ldap_encode(msg, &blob2)) { + if (!ldap_encode(msg, &blob2, req)) { DEBUG(0,("Failed to encode cldap message to %s:%d\n", req->dest_addr, req->dest_port)); status = NT_STATUS_INVALID_PARAMETER; goto failed; } - talloc_steal(req, blob2.data); req->encoded = data_blob_talloc(req, NULL, blob1.length + blob2.length); if (req->encoded.data == NULL) goto failed; diff --git a/source4/libcli/ldap/ldap.c b/source4/libcli/ldap/ldap.c index f7f6feea38..815d543038 100644 --- a/source4/libcli/ldap/ldap.c +++ b/source4/libcli/ldap/ldap.c @@ -189,7 +189,7 @@ static void ldap_encode_response(struct asn1_data *data, struct ldap_Result *res } } -BOOL ldap_encode(struct ldap_message *msg, DATA_BLOB *result) +BOOL ldap_encode(struct ldap_message *msg, DATA_BLOB *result, TALLOC_CTX *mem_ctx) { struct asn1_data data; int i, j; @@ -462,7 +462,7 @@ BOOL ldap_encode(struct ldap_message *msg, DATA_BLOB *result) return False; } - *result = data_blob(data.data, data.length); + *result = data_blob_talloc(mem_ctx, data.data, data.length); asn1_free(&data); return True; } diff --git a/source4/libcli/ldap/ldap_client.c b/source4/libcli/ldap/ldap_client.c index 97b75602aa..800e523eb4 100644 --- a/source4/libcli/ldap/ldap_client.c +++ b/source4/libcli/ldap/ldap_client.c @@ -497,7 +497,7 @@ struct ldap_request *ldap_request_send(struct ldap_connection *conn, msg->messageid = req->messageid; - if (!ldap_encode(msg, &req->data)) { + if (!ldap_encode(msg, &req->data, req)) { goto failed; } |