aboutsummaryrefslogtreecommitdiff
path: root/modules/pam_unix/md5_crypt.c
diff options
context:
space:
mode:
authorTobias Stoeckmann <tobias@stoeckmann.org>2023-12-15 10:14:11 +0100
committerDmitry V. Levin <ldv@strace.io>2023-12-19 12:22:59 +0000
commit2e375aad04d047e12468f93300ad7e42a8a03ff3 (patch)
tree29f31fa0bf4700476eccd4a307ef6638d9707851 /modules/pam_unix/md5_crypt.c
parentc2fafe1be0fb72aa1bd521efe2f524074bf143c7 (diff)
downloadpam-2e375aad04d047e12468f93300ad7e42a8a03ff3.tar.gz
pam-2e375aad04d047e12468f93300ad7e42a8a03ff3.tar.bz2
pam-2e375aad04d047e12468f93300ad7e42a8a03ff3.zip
treewide: use asprintf to construct strings
The asprintf function is considered as given for current code already. Use it instead of calling malloc + strcpy + strcat manually. Reported-by: Benny Baumann <BenBE@geshi.org> Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
Diffstat (limited to 'modules/pam_unix/md5_crypt.c')
-rw-r--r--modules/pam_unix/md5_crypt.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/modules/pam_unix/md5_crypt.c b/modules/pam_unix/md5_crypt.c
index c3e77c9d..a5720999 100644
--- a/modules/pam_unix/md5_crypt.c
+++ b/modules/pam_unix/md5_crypt.c
@@ -13,6 +13,7 @@
*/
#include <string.h>
+#include <stdio.h>
#include <stdlib.h>
#include "md5.h"
#include "pam_inline.h"
@@ -41,6 +42,7 @@ char *MD5Name(crypt_md5)(const char *pw, const char *salt)
* it this way, we can get better later on */
char *passwd, *p;
const char *sp, *ep;
+ char buf[23];
unsigned char final[16];
int sl, pl, i, j;
MD5_CTX ctx, ctx1;
@@ -49,12 +51,6 @@ char *MD5Name(crypt_md5)(const char *pw, const char *salt)
/* Refine the Salt first */
sp = salt;
- /* TODO: now that we're using malloc'ed memory, get rid of the
- strange constant buffer size. */
- passwd = malloc(120);
- if (passwd == NULL)
- return NULL;
-
/* If it starts with the magic string, then skip that */
if ((ep = pam_str_skip_prefix_len(sp, magic, strlen(magic))) != NULL)
sp = ep;
@@ -96,11 +92,6 @@ char *MD5Name(crypt_md5)(const char *pw, const char *salt)
else
MD5Name(MD5Update)(&ctx, (unsigned const char *)pw+j, 1);
- /* Now make the output string */
- strcpy(passwd, magic);
- strncat(passwd, sp, sl);
- strcat(passwd, "$");
-
MD5Name(MD5Final)(final,&ctx);
/*
@@ -128,7 +119,7 @@ char *MD5Name(crypt_md5)(const char *pw, const char *salt)
MD5Name(MD5Final)(final,&ctx1);
}
- p = passwd + strlen(passwd);
+ p = buf;
l = (final[0] << 16) | (final[6] << 8) | final[12];
to64(p, l, 4);
@@ -150,7 +141,12 @@ char *MD5Name(crypt_md5)(const char *pw, const char *salt)
p += 2;
*p = '\0';
+ /* Now make the output string */
+ if (asprintf(&passwd, "%s%.*s$%s", magic, sl, sp, buf) < 0)
+ passwd = NULL;
+
/* Don't leave anything around in vm they could use. */
+ pam_overwrite_array(buf);
pam_overwrite_array(final);
return passwd;