summary refs log tree commit diff
path: root/libnm-core/crypto.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2017-01-17 20:25:09 +0100
committerMichael Biebl <biebl@debian.org>2017-01-17 20:25:09 +0100
commit58f8be580039b0575b197b9573a1c92745d96d30 (patch)
tree2c226233f623a0dcb529be0eb8cdf97e4a2ae0c0 /libnm-core/crypto.c
parent45cb5bb3c0e6edb887cf69b417fcaf7053814a9b (diff)
New upstream version 1.5.90 upstream/1.5.90
Diffstat (limited to 'libnm-core/crypto.c')
-rw-r--r--libnm-core/crypto.c27
1 files changed, 13 insertions, 14 deletions
diff --git a/libnm-core/crypto.c b/libnm-core/crypto.c
index e734f40d..c4e48475 100644
--- a/libnm-core/crypto.c
+++ b/libnm-core/crypto.c
@@ -771,13 +771,12 @@ crypto_md5_hash (const char *salt,
                  gsize buflen)
 {
 	GChecksum *ctx;
-	int nkey = buflen;
 	gsize digest_len;
-	int count = 0;
 	char digest[16];
-	char *p = buffer;
+	gsize bufidx = 0;
+	int i;
 
-	g_assert_cmpint (g_checksum_type_get_length (G_CHECKSUM_MD5), ==, sizeof (digest));
+	nm_assert (g_checksum_type_get_length (G_CHECKSUM_MD5) == sizeof (digest));
 
 	g_return_if_fail (password_len == 0 || password);
 	g_return_if_fail (buffer != NULL);
@@ -791,12 +790,7 @@ crypto_md5_hash (const char *salt,
 	if (password_len < 0)
 		password_len = strlen (password);
 
-	while (nkey > 0) {
-		int i = 0;
-
-		g_checksum_reset (ctx);
-		if (count++)
-			g_checksum_update (ctx, (const guchar *) digest, sizeof (digest));
+	for (;;) {
 		if (password_len > 0)
 			g_checksum_update (ctx, (const guchar *) password, password_len);
 		if (salt_len > 0)
@@ -804,14 +798,19 @@ crypto_md5_hash (const char *salt,
 
 		digest_len = sizeof (digest);
 		g_checksum_get_digest (ctx, (guchar *) digest, &digest_len);
-		g_assert (digest_len == sizeof (digest));
+		nm_assert (digest_len == sizeof (digest));
 
-		while (nkey && (i < sizeof (digest))) {
-			*(p++) = digest[i++];
-			nkey--;
+		for (i = 0; i < sizeof (digest); i++) {
+			if (bufidx >= buflen)
+				goto done;
+			buffer[bufidx++] = digest[i];
 		}
+
+		g_checksum_reset (ctx);
+		g_checksum_update (ctx, (const guchar *) digest, sizeof (digest));
 	}
 
+done:
 	memset (digest, 0, sizeof (digest));
 	g_checksum_free (ctx);
 }