summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2022-07-26 10:57:19 +0200
committerJule Anger <janger@samba.org>2022-09-18 16:46:09 +0000
commitc56e2e2e700cb1b4a75f5bb3224ecf4657dd2a99 (patch)
treeef08bd7b8c64bbb3be1fe0b09161d6e97872600c
parentf78ff75c51f6cd15b476de373f11b1c87f962970 (diff)
downloadsamba-c56e2e2e700cb1b4a75f5bb3224ecf4657dd2a99.tar.gz
s3:rpc_server: Use a done goto label for dcesrv_samr_SetUserInfo()
This will be used in the following commits. Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> (cherry picked from commit a246ae993fd8553bf66aa8ee1700eb68b85f2857)
-rw-r--r--source4/rpc_server/samr/dcesrv_samr.c84
1 files changed, 54 insertions, 30 deletions
diff --git a/source4/rpc_server/samr/dcesrv_samr.c b/source4/rpc_server/samr/dcesrv_samr.c
index 10c53b19e0d..ccb4e37bf31 100644
--- a/source4/rpc_server/samr/dcesrv_samr.c
+++ b/source4/rpc_server/samr/dcesrv_samr.c
@@ -3713,13 +3713,14 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
r->in.info->info18.lm_pwd_active ? r->in.info->info18.lm_pwd.hash : NULL,
r->in.info->info18.nt_pwd_active ? r->in.info->info18.nt_pwd.hash : NULL);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto done;
}
if (r->in.info->info18.password_expired > 0) {
struct ldb_message_element *set_el;
if (samdb_msg_add_uint64(sam_ctx, mem_ctx, msg, "pwdLastSet", 0) != LDB_SUCCESS) {
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_NO_MEMORY;
+ goto done;
}
set_el = ldb_msg_find_element(msg, "pwdLastSet");
set_el->flags = LDB_FLAG_MOD_REPLACE;
@@ -3731,8 +3732,10 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
break;
case 21:
- if (r->in.info->info21.fields_present == 0)
- return NT_STATUS_INVALID_PARAMETER;
+ if (r->in.info->info21.fields_present == 0) {
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto done;
+ }
#define IFSET(bit) if (bit & r->in.info->info21.fields_present)
IFSET(SAMR_FIELD_LAST_LOGON)
@@ -3777,8 +3780,10 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
SET_UINT (msg, info21.code_page, "codePage");
/* password change fields */
- IFSET(SAMR_FIELD_LAST_PWD_CHANGE)
- return NT_STATUS_ACCESS_DENIED;
+ IFSET(SAMR_FIELD_LAST_PWD_CHANGE) {
+ status = NT_STATUS_ACCESS_DENIED;
+ goto done;
+ }
IFSET((SAMR_FIELD_LM_PASSWORD_PRESENT
| SAMR_FIELD_NT_PASSWORD_PRESENT)) {
@@ -3787,7 +3792,8 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
if (r->in.info->info21.lm_password_set) {
if ((r->in.info->info21.lm_owf_password.length != 16)
|| (r->in.info->info21.lm_owf_password.size != 16)) {
- return NT_STATUS_INVALID_PARAMETER;
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto done;
}
lm_pwd_hash = (uint8_t *) r->in.info->info21.lm_owf_password.array;
@@ -3795,7 +3801,8 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
if (r->in.info->info21.nt_password_set) {
if ((r->in.info->info21.nt_owf_password.length != 16)
|| (r->in.info->info21.nt_owf_password.size != 16)) {
- return NT_STATUS_INVALID_PARAMETER;
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto done;
}
nt_pwd_hash = (uint8_t *) r->in.info->info21.nt_owf_password.array;
@@ -3808,7 +3815,7 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
lm_pwd_hash,
nt_pwd_hash);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto done;
}
}
@@ -3821,7 +3828,8 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
t = "-1";
}
if (ldb_msg_add_string(msg, "pwdLastSet", t) != LDB_SUCCESS) {
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_NO_MEMORY;
+ goto done;
}
set_el = ldb_msg_find_element(msg, "pwdLastSet");
set_el->flags = LDB_FLAG_MOD_REPLACE;
@@ -3830,8 +3838,10 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
break;
case 23:
- if (r->in.info->info23.info.fields_present == 0)
- return NT_STATUS_INVALID_PARAMETER;
+ if (r->in.info->info23.info.fields_present == 0) {
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto done;
+ }
#define IFSET(bit) if (bit & r->in.info->info23.info.fields_present)
IFSET(SAMR_FIELD_LAST_LOGON)
@@ -3877,8 +3887,10 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
SET_UINT (msg, info23.info.code_page, "codePage");
/* password change fields */
- IFSET(SAMR_FIELD_LAST_PWD_CHANGE)
- return NT_STATUS_ACCESS_DENIED;
+ IFSET(SAMR_FIELD_LAST_PWD_CHANGE) {
+ status = NT_STATUS_ACCESS_DENIED;
+ goto done;
+ }
IFSET(SAMR_FIELD_NT_PASSWORD_PRESENT) {
status = samr_set_password(dce_call,
@@ -3896,7 +3908,7 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
&r->in.info->info23.password);
}
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto done;
}
IFSET(SAMR_FIELD_EXPIRED_FLAG) {
@@ -3907,7 +3919,8 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
t = "-1";
}
if (ldb_msg_add_string(msg, "pwdLastSet", t) != LDB_SUCCESS) {
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_NO_MEMORY;
+ goto done;
}
set_el = ldb_msg_find_element(msg, "pwdLastSet");
set_el->flags = LDB_FLAG_MOD_REPLACE;
@@ -3924,13 +3937,14 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
mem_ctx,
&r->in.info->info24.password);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto done;
}
if (r->in.info->info24.password_expired > 0) {
struct ldb_message_element *set_el;
if (samdb_msg_add_uint64(sam_ctx, mem_ctx, msg, "pwdLastSet", 0) != LDB_SUCCESS) {
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_NO_MEMORY;
+ goto done;
}
set_el = ldb_msg_find_element(msg, "pwdLastSet");
set_el->flags = LDB_FLAG_MOD_REPLACE;
@@ -3938,8 +3952,10 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
break;
case 25:
- if (r->in.info->info25.info.fields_present == 0)
- return NT_STATUS_INVALID_PARAMETER;
+ if (r->in.info->info25.info.fields_present == 0) {
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto done;
+ }
#define IFSET(bit) if (bit & r->in.info->info25.info.fields_present)
IFSET(SAMR_FIELD_LAST_LOGON)
@@ -3984,8 +4000,10 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
SET_UINT (msg, info25.info.code_page, "codePage");
/* password change fields */
- IFSET(SAMR_FIELD_LAST_PWD_CHANGE)
- return NT_STATUS_ACCESS_DENIED;
+ IFSET(SAMR_FIELD_LAST_PWD_CHANGE) {
+ status = NT_STATUS_ACCESS_DENIED;
+ goto done;
+ }
IFSET(SAMR_FIELD_NT_PASSWORD_PRESENT) {
status = samr_set_password_ex(dce_call,
@@ -4003,7 +4021,7 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
&r->in.info->info25.password);
}
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto done;
}
IFSET(SAMR_FIELD_EXPIRED_FLAG) {
@@ -4014,7 +4032,8 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
t = "-1";
}
if (ldb_msg_add_string(msg, "pwdLastSet", t) != LDB_SUCCESS) {
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_NO_MEMORY;
+ goto done;
}
set_el = ldb_msg_find_element(msg, "pwdLastSet");
set_el->flags = LDB_FLAG_MOD_REPLACE;
@@ -4031,7 +4050,7 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
mem_ctx,
&r->in.info->info26.password);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto done;
}
if (r->in.info->info26.password_expired > 0) {
@@ -4042,7 +4061,8 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
t = "-1";
}
if (ldb_msg_add_string(msg, "pwdLastSet", t) != LDB_SUCCESS) {
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_NO_MEMORY;
+ goto done;
}
set_el = ldb_msg_find_element(msg, "pwdLastSet");
set_el->flags = LDB_FLAG_MOD_REPLACE;
@@ -4051,11 +4071,12 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
default:
/* many info classes are not valid for SetUserInfo */
- return NT_STATUS_INVALID_INFO_CLASS;
+ status = NT_STATUS_INVALID_INFO_CLASS;
+ goto done;
}
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto done;
}
/* modify the samdb record */
@@ -4066,11 +4087,14 @@ static NTSTATUS dcesrv_samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALL
ldb_dn_get_linearized(a_state->account_dn),
ldb_errstring(a_state->sam_ctx)));
- return dsdb_ldb_err_to_ntstatus(ret);
+ status = dsdb_ldb_err_to_ntstatus(ret);
+ goto done;
}
}
- return NT_STATUS_OK;
+ status = NT_STATUS_OK;
+done:
+ return status;
}