From 6d1b10b9e516bd88fa34392395b0a7c6e6f54fd7 Mon Sep 17 00:00:00 2001
From: juyin <zhuyan34@huawei.com>
Date: Thu, 31 Mar 2022 16:45:19 +0800
Subject: [PATCH] chpasswd: add get_salt for generating salt value
 
The function that generates the salt value is extracted separately, and it is more convenient to modify it later.
 
Reference: https://github.com/shadow-maint/shadow/commit/a026154c6fca7c7e5d6d0723e0cc29d6cd9fa00a
Conflict: The EulerOS supports SM3. As a result, the patch is different.
---
 src/chpasswd.c | 73 +++++++++++++++++++++++++++-----------------------
 1 file changed, 39 insertions(+), 34 deletions(-)
 
diff --git a/src/chpasswd.c b/src/chpasswd.c
index 5dfb995..708f973 100644
--- a/src/chpasswd.c
+++ b/src/chpasswd.c
@@ -430,12 +430,54 @@ static void close_files (void)
 	pw_locked = false;
 }
 
+static const char *get_salt(void)
+{
+	if (   !eflg
+		&& (   (NULL == crypt_method)
+			|| (0 != strcmp (crypt_method, "NONE")))) {
+		void *arg = NULL;
+
+		if (md5flg) {
+			crypt_method = "MD5";
+		}
+#if defined(USE_SHA_CRYPT) || defined(USE_BCRYPT) || defined(USE_YESCRYPT)
+		if (sflg) {
+#if defined(USE_SHA_CRYPT)
+			if (   (0 == strcmp (crypt_method, "SHA256"))
+				|| (0 == strcmp (crypt_method, "SHA512"))) {
+				arg = &sha_rounds;
+			}
+#endif				/* USE_SHA_CRYPT */
+#if defined(USE_BCRYPT)
+			if (0 == strcmp (crypt_method, "BCRYPT")) {
+				arg = &bcrypt_rounds;
+			}
+#endif				/* USE_BCRYPT */
+#if defined(USE_YESCRYPT)
+			if (0 == strcmp (crypt_method, "YESCRYPT")) {
+				arg = &yescrypt_cost;
+			}
+#endif				/* USE_YESCRYPT */
+#if defined(USE_SM3_CRYPT)
+			if (0 == strcmp (crypt_method, "SM3")) {
+				arg = &sm3_rounds;
+			}
+#endif				/* USE_SM3_CRYPT */
+		}
+#endif
+		return crypt_make_salt (crypt_method, arg);
+	}
+
+	return NULL;
+}
+
 int main (int argc, char **argv)
 {
 	char buf[BUFSIZ];
 	char *name;
 	char *newpwd;
 	char *cp;
+	const char *salt;
 
 #ifdef USE_PAM
 	bool use_pam = true;
@@ -545,40 +587,8 @@ int main (int argc, char **argv)
 		const struct passwd *pw;
 		struct passwd newpw;
 
-		if (   !eflg
-		    && (   (NULL == crypt_method)
-		        || (0 != strcmp (crypt_method, "NONE")))) {
-			void *arg = NULL;
-			const char *salt;
-			if (md5flg) {
-				crypt_method = "MD5";
-			}
-#if defined(USE_SHA_CRYPT) || defined(USE_BCRYPT) || defined(USE_YESCRYPT)
-			if (sflg) {
-#if defined(USE_SHA_CRYPT)
-				if (   (0 == strcmp (crypt_method, "SHA256"))
-					|| (0 == strcmp (crypt_method, "SHA512"))) {
-					arg = &sha_rounds;
-				}
-#endif				/* USE_SHA_CRYPT */
-#if defined(USE_BCRYPT)
-				if (0 == strcmp (crypt_method, "BCRYPT")) {
-					arg = &bcrypt_rounds;
-				}
-#endif				/* USE_BCRYPT */
-#if defined(USE_YESCRYPT)
-				if (0 == strcmp (crypt_method, "YESCRYPT")) {
-					arg = &yescrypt_cost;
-				}
-#endif				/* USE_YESCRYPT */
-#if defined(USE_SM3_CRYPT)
-				if (0 == strcmp (crypt_method, "SM3")) {
-					arg = &sm3_rounds;
-				}
-#endif				/* USE_SM3_CRYPT */
-			}
-#endif
-			salt = crypt_make_salt (crypt_method, arg);
+		salt = get_salt();
+		if (salt) {
 			cp = pw_encrypt (newpwd, salt);
 			if (NULL == cp) {
 				fprintf (stderr,
-- 
2.33.0
