b6b438
From bcbc9eca11583426d9b0e7ce4d4e51b16bda32f0 Mon Sep 17 00:00:00 2001
b6b438
From: Andreas Schneider <asn@samba.org>
b6b438
Date: Wed, 29 May 2019 16:22:11 +0200
b6b438
Subject: [PATCH 008/187] s3:rpc_client: Return NTSTATUS for
b6b438
 init_samr_CryptPassword()
b6b438
b6b438
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14031
b6b438
b6b438
Signed-off-by: Andreas Schneider <asn@samba.org>
b6b438
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
b6b438
(cherry picked from commit 4b9b1dbe9c8c988a39b1318a4f7aac031bc1ea8b)
b6b438
---
b6b438
 source3/lib/netapi/user.c      |  9 ++++++---
b6b438
 source3/libnet/libnet_join.c   | 10 +++++++---
b6b438
 source3/rpc_client/init_samr.c | 14 ++++++++++----
b6b438
 source3/rpc_client/init_samr.h |  6 +++---
b6b438
 source3/rpcclient/cmd_samr.c   |  5 ++++-
b6b438
 source3/utils/net_rpc.c        |  9 ++++++---
b6b438
 6 files changed, 36 insertions(+), 17 deletions(-)
b6b438
b6b438
diff --git a/source3/lib/netapi/user.c b/source3/lib/netapi/user.c
b6b438
index 4b66dab2f99..2136ef47ee6 100644
b6b438
--- a/source3/lib/netapi/user.c
b6b438
+++ b/source3/lib/netapi/user.c
b6b438
@@ -326,9 +326,12 @@ static NTSTATUS set_user_info_USER_INFO_X(TALLOC_CTX *ctx,
b6b438
 
b6b438
 			user_info.info23.info = info21;
b6b438
 
b6b438
-			init_samr_CryptPassword(uX->usriX_password,
b6b438
-						session_key,
b6b438
-						&user_info.info23.password);
b6b438
+			status = init_samr_CryptPassword(uX->usriX_password,
b6b438
+							 session_key,
b6b438
+							 &user_info.info23.password);
b6b438
+			if (!NT_STATUS_IS_OK(status)) {
b6b438
+				return status;
b6b438
+			}
b6b438
 
b6b438
 			status = dcerpc_samr_SetUserInfo2(b, talloc_tos(),
b6b438
 							  user_handle,
b6b438
diff --git a/source3/libnet/libnet_join.c b/source3/libnet/libnet_join.c
b6b438
index 9d4f656ffec..abf8672d050 100644
b6b438
--- a/source3/libnet/libnet_join.c
b6b438
+++ b/source3/libnet/libnet_join.c
b6b438
@@ -1570,9 +1570,12 @@ static NTSTATUS libnet_join_joindomain_rpc(TALLOC_CTX *mem_ctx,
b6b438
 
b6b438
 		/* retry with level 24 */
b6b438
 
b6b438
-		init_samr_CryptPassword(r->in.machine_password,
b6b438
-					&session_key,
b6b438
-					&crypt_pwd);
b6b438
+		status = init_samr_CryptPassword(r->in.machine_password,
b6b438
+						 &session_key,
b6b438
+						 &crypt_pwd);
b6b438
+		if (!NT_STATUS_IS_OK(status)) {
b6b438
+			goto error;
b6b438
+		}
b6b438
 
b6b438
 		user_info.info24.password = crypt_pwd;
b6b438
 		user_info.info24.password_expired = PASS_DONT_CHANGE_AT_NEXT_LOGON;
b6b438
@@ -1584,6 +1587,7 @@ static NTSTATUS libnet_join_joindomain_rpc(TALLOC_CTX *mem_ctx,
b6b438
 						  &result);
b6b438
 	}
b6b438
 
b6b438
+error:
b6b438
 	old_timeout = rpccli_set_timeout(pipe_hnd, old_timeout);
b6b438
 
b6b438
 	if (!NT_STATUS_IS_OK(status)) {
b6b438
diff --git a/source3/rpc_client/init_samr.c b/source3/rpc_client/init_samr.c
b6b438
index d116ece576f..8b41ec2f10f 100644
b6b438
--- a/source3/rpc_client/init_samr.c
b6b438
+++ b/source3/rpc_client/init_samr.c
b6b438
@@ -81,12 +81,18 @@ out:
b6b438
  inits a samr_CryptPassword structure
b6b438
  *************************************************************************/
b6b438
 
b6b438
-void init_samr_CryptPassword(const char *pwd,
b6b438
-			     DATA_BLOB *session_key,
b6b438
-			     struct samr_CryptPassword *pwd_buf)
b6b438
+NTSTATUS init_samr_CryptPassword(const char *pwd,
b6b438
+				 DATA_BLOB *session_key,
b6b438
+				 struct samr_CryptPassword *pwd_buf)
b6b438
 {
b6b438
 	/* samr_CryptPassword */
b6b438
+	bool ok;
b6b438
 
b6b438
-	encode_pw_buffer(pwd_buf->data, pwd, STR_UNICODE);
b6b438
+	ok = encode_pw_buffer(pwd_buf->data, pwd, STR_UNICODE);
b6b438
+	if (!ok) {
b6b438
+		return NT_STATUS_INTERNAL_ERROR;
b6b438
+	}
b6b438
 	arcfour_crypt_blob(pwd_buf->data, 516, session_key);
b6b438
+
b6b438
+	return NT_STATUS_OK;
b6b438
 }
b6b438
diff --git a/source3/rpc_client/init_samr.h b/source3/rpc_client/init_samr.h
b6b438
index 223fa91e3d9..4214ab55a04 100644
b6b438
--- a/source3/rpc_client/init_samr.h
b6b438
+++ b/source3/rpc_client/init_samr.h
b6b438
@@ -25,8 +25,8 @@
b6b438
 void init_samr_CryptPasswordEx(const char *pwd,
b6b438
 			       DATA_BLOB *session_key,
b6b438
 			       struct samr_CryptPasswordEx *pwd_buf);
b6b438
-void init_samr_CryptPassword(const char *pwd,
b6b438
-			     DATA_BLOB *session_key,
b6b438
-			     struct samr_CryptPassword *pwd_buf);
b6b438
+NTSTATUS init_samr_CryptPassword(const char *pwd,
b6b438
+				 DATA_BLOB *session_key,
b6b438
+				 struct samr_CryptPassword *pwd_buf);
b6b438
 
b6b438
 #endif /* _RPC_CLIENT_INIT_SAMR_H_ */
b6b438
diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c
b6b438
index 8cbf8ab24bd..ccaec1ada40 100644
b6b438
--- a/source3/rpcclient/cmd_samr.c
b6b438
+++ b/source3/rpcclient/cmd_samr.c
b6b438
@@ -3063,7 +3063,10 @@ static NTSTATUS cmd_samr_setuserinfo_int(struct rpc_pipe_client *cli,
b6b438
 		return status;
b6b438
 	}
b6b438
 
b6b438
-	init_samr_CryptPassword(param, &session_key, &pwd_buf);
b6b438
+	status = init_samr_CryptPassword(param, &session_key, &pwd_buf);
b6b438
+	if (!NT_STATUS_IS_OK(status)) {
b6b438
+		return status;
b6b438
+	}
b6b438
 	init_samr_CryptPasswordEx(param, &session_key, &pwd_buf_ex);
b6b438
 	nt_lm_owf_gen(param, nt_hash, lm_hash);
b6b438
 
b6b438
diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c
b6b438
index a56190f7be5..f6fb892a2d9 100644
b6b438
--- a/source3/utils/net_rpc.c
b6b438
+++ b/source3/utils/net_rpc.c
b6b438
@@ -6195,9 +6195,12 @@ static NTSTATUS rpc_trustdom_add_internals(struct net_context *c,
b6b438
 
b6b438
 		ZERO_STRUCT(info.info23);
b6b438
 
b6b438
-		init_samr_CryptPassword(argv[1],
b6b438
-					&session_key,
b6b438
-					&crypt_pwd);
b6b438
+		status = init_samr_CryptPassword(argv[1],
b6b438
+						 &session_key,
b6b438
+						 &crypt_pwd);
b6b438
+		if (!NT_STATUS_IS_OK(status)) {
b6b438
+			goto done;
b6b438
+		}
b6b438
 
b6b438
 		info.info23.info.fields_present = SAMR_FIELD_ACCT_FLAGS |
b6b438
 						  SAMR_FIELD_NT_PASSWORD_PRESENT;
b6b438
-- 
b6b438
2.23.0
b6b438