From: Volker Lendecke Date: Wed, 4 Jan 2023 10:43:59 +0000 (+0100) Subject: lib: Add "starting_id" to idr_get_new_random() X-Git-Tag: talloc-2.4.0~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=43f041de6567bcb40a8e4564fce66ee08af6cc0b;p=thirdparty%2Fsamba.git lib: Add "starting_id" to idr_get_new_random() To be used in smbXsrv_open.c, for this we need a lower bound. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/lib/util/idtree_random.c b/lib/util/idtree_random.c index 80758e74d6d..d22245a7734 100644 --- a/lib/util/idtree_random.c +++ b/lib/util/idtree_random.c @@ -40,7 +40,10 @@ /** allocate a new id randomly in the given range */ -_PUBLIC_ int idr_get_new_random(struct idr_context *idp, void *ptr, int limit) +_PUBLIC_ int idr_get_new_random(struct idr_context *idp, + void *ptr, + int starting_id, + int limit) { int id; @@ -48,12 +51,17 @@ _PUBLIC_ int idr_get_new_random(struct idr_context *idp, void *ptr, int limit) then start randomly in the bottom half of the range. This can only fail if the range is over half full, and finally fallback to any free id */ - id = idr_get_new_above(idp, ptr, 1+(generate_random() % limit), limit); + id = idr_get_new_above( + idp, ptr, starting_id+(generate_random() % limit), limit); if (id == -1) { - id = idr_get_new_above(idp, ptr, 1+(generate_random()%(limit/2)), limit); + id = idr_get_new_above( + idp, + ptr, + starting_id+(generate_random()%(limit/2)), + limit); } if (id == -1) { - id = idr_get_new_above(idp, ptr, 1, limit); + id = idr_get_new_above(idp, ptr, starting_id, limit); } return id; diff --git a/lib/util/idtree_random.h b/lib/util/idtree_random.h index 4d3b61c33d5..623147c48a7 100644 --- a/lib/util/idtree_random.h +++ b/lib/util/idtree_random.h @@ -33,6 +33,9 @@ /** allocate a new id randomly in the given range */ -int idr_get_new_random(struct idr_context *idp, void *ptr, int limit); +int idr_get_new_random(struct idr_context *idp, + void *ptr, + int starting_id, + int limit); #endif /* _SAMBA_IDTREE_RANDOM_H_ */ diff --git a/libcli/cldap/cldap.c b/libcli/cldap/cldap.c index 3cca85b9921..22a47705d65 100644 --- a/libcli/cldap/cldap.c +++ b/libcli/cldap/cldap.c @@ -623,8 +623,8 @@ struct tevent_req *cldap_search_send(TALLOC_CTX *mem_ctx, state->request.dest = NULL; } - state->message_id = idr_get_new_random(cldap->searches.idr, - state, UINT16_MAX); + state->message_id = idr_get_new_random( + cldap->searches.idr, state, 1, UINT16_MAX); if (state->message_id == -1) { tevent_req_nterror(req, NT_STATUS_INSUFFICIENT_RESOURCES); goto post; diff --git a/libcli/nbt/nbtsocket.c b/libcli/nbt/nbtsocket.c index 97b0ca34337..3e0dd493a91 100644 --- a/libcli/nbt/nbtsocket.c +++ b/libcli/nbt/nbtsocket.c @@ -407,7 +407,8 @@ struct nbt_name_request *nbt_name_request_send(TALLOC_CTX *mem_ctx, /* we select a random transaction id unless the user supplied one */ if (request->name_trn_id == 0) { - id = idr_get_new_random(req->nbtsock->idr, req, UINT16_MAX); + id = idr_get_new_random( + req->nbtsock->idr, req, 1, UINT16_MAX); } else { if (idr_find(req->nbtsock->idr, request->name_trn_id)) goto failed; id = idr_get_new_above(req->nbtsock->idr, req, request->name_trn_id, diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index 32fbb78f5ff..71be70bf79d 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -161,6 +161,7 @@ static NTSTATUS dcesrv_assoc_group_new(struct dcesrv_call_state *call) id = idr_get_new_random(dce_ctx->assoc_groups_idr, assoc_group, + 1, UINT16_MAX); if (id == -1) { TALLOC_FREE(assoc_group); diff --git a/source3/rpc_server/rpc_worker.c b/source3/rpc_server/rpc_worker.c index 2d2bb35af0f..1bc84531e55 100644 --- a/source3/rpc_server/rpc_worker.c +++ b/source3/rpc_server/rpc_worker.c @@ -654,7 +654,7 @@ static struct dcesrv_assoc_group *rpc_worker_assoc_group_new( } id = idr_get_new_random( - dce_ctx->assoc_groups_idr, assoc_group, UINT16_MAX); + dce_ctx->assoc_groups_idr, assoc_group, 1, UINT16_MAX); if (id == -1) { talloc_free(assoc_group); DBG_WARNING("Out of association groups!\n"); diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c index c896b3574a2..6ec6f832da2 100644 --- a/source4/rpc_server/dcerpc_server.c +++ b/source4/rpc_server/dcerpc_server.c @@ -99,7 +99,8 @@ static struct dcesrv_assoc_group *dcesrv_assoc_group_new(struct dcesrv_connectio return NULL; } - id = idr_get_new_random(dce_ctx->assoc_groups_idr, assoc_group, UINT16_MAX); + id = idr_get_new_random( + dce_ctx->assoc_groups_idr, assoc_group, 1, UINT16_MAX); if (id == -1) { talloc_free(assoc_group); DEBUG(0,(__location__ ": Out of association groups!\n")); diff --git a/source4/smb_server/session.c b/source4/smb_server/session.c index 321d7dd6388..a561b2e7fc4 100644 --- a/source4/smb_server/session.c +++ b/source4/smb_server/session.c @@ -141,7 +141,11 @@ struct smbsrv_session *smbsrv_session_new(struct smbsrv_connection *smb_conn, if (!sess) return NULL; sess->smb_conn = smb_conn; - i = idr_get_new_random(smb_conn->sessions.idtree_vuid, sess, smb_conn->sessions.idtree_limit); + i = idr_get_new_random( + smb_conn->sessions.idtree_vuid, + sess, + 1, + smb_conn->sessions.idtree_limit); if (i == -1) { DEBUG(1,("ERROR! Out of connection structures\n")); talloc_free(sess); diff --git a/source4/smb_server/tcon.c b/source4/smb_server/tcon.c index 39bc0a5ff5f..8186bba23ef 100644 --- a/source4/smb_server/tcon.c +++ b/source4/smb_server/tcon.c @@ -163,7 +163,8 @@ static struct smbsrv_tcon *smbsrv_tcon_new(struct smbsrv_connection *smb_conn, goto failed; } - i = idr_get_new_random(tcons_ctx->idtree_tid, tcon, tcons_ctx->idtree_limit); + i = idr_get_new_random( + tcons_ctx->idtree_tid, tcon, 1, tcons_ctx->idtree_limit); if (i == -1) { DEBUG(1,("ERROR! Out of connection structures\n")); goto failed;