From a5d8be91b53b0c955fbed51ff4ff6cdf20f0c4fe Mon Sep 17 00:00:00 2001 From: Micha Mutschler Date: Sun, 30 Jun 2013 22:18:31 +0200 Subject: Fix memory leaks, security issues and compiler warnings - free unused memory buffers if not needed any more - the password should be cleared from memory asap - the return value of scanf should be processed Signed-off-by: Micha Mutschler Acked-by: Andi Shyti --- accman.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'accman.c') diff --git a/accman.c b/accman.c index d12ce2a..5b0f2ef 100644 --- a/accman.c +++ b/accman.c @@ -12,7 +12,11 @@ char *get_name(void) char name[32]; char *usr_n; - scanf("%s", name); + int got = scanf("%s", name); + if(got != 1) { + fprintf(stderr, "failed to read name...\n"); + exit(EXIT_FAILURE); + } usr_n = (char *) malloc(sizeof(name) + DIM_MDOM + 1); if (!usr_n) { printf("No free memory available\n"); @@ -55,19 +59,33 @@ char *get_password(void) fprintf(stderr, "Password must be between %d and %d characters\n", MIN_PASSWD_LEN, MAX_PASSWD_LEN); + memset(tmp, 0, len); exit(EXIT_FAILURE); } p = (char*) malloc (len + 1); strcpy(p, tmp); + /* clear password from memory */ + memset(tmp, 0, len); + tmp = getpass("Re-type password: "); - if (strcmp(p, tmp)) { + + int scmp = strcmp(p, tmp); + memset(tmp, 0, len); + + if (scmp) { fprintf(stderr, "The passwords don't match, operation aborted\n"); + /* clear passwd */ + memset(p, 0, len); exit(EXIT_FAILURE); } - return get_crypt_sha256(p); + tmp = get_crypt_sha256(p); + memset(p, 0, len); + free(p); + + return tmp; } int main (void) -- cgit v1.2.3