Hi, When openssl(1) passwd is invoked without passing in the `password' as argument , meaning interactively, and if the password is 10 or more characters it will show the following memory corruption error, and using -crypt which is the default:
openssl(43025) in free(): chunck canary corrupted 0x13a8dc4a1bb0 0xa@0xa pw_len is set to 8, then passwd_malloc_size is set to pw_len + 2 in order to be able to warn the user that the password will be truncated then it calls EVP_read_pw_string(3) which allocates the space size of the input buffer, in this case password_malloc_size plus 1 for the NUL-termination character through strlcpy(3). When we finally call free(password_malloc) the sizes will differ and the memory will be corrupted, in order to solve this when we allocate memory for the input buffer we need to add plus 1 for the NUL-termination character. Comments? OK? Index: passwd.c =================================================================== RCS file: /cvs/src/usr.bin/openssl/passwd.c,v retrieving revision 1.9 diff -u -p -u -r1.9 passwd.c --- passwd.c 7 Feb 2018 05:47:55 -0000 1.9 +++ passwd.c 8 Aug 2018 13:00:40 -0000 @@ -213,7 +213,7 @@ passwd_main(int argc, char **argv) passwd_malloc_size = pw_maxlen + 2; /* longer than necessary so that we can warn about truncation */ - passwd = passwd_malloc = malloc(passwd_malloc_size); + passwd = passwd_malloc = malloc(passwd_malloc_size + 1); if (passwd_malloc == NULL) goto err; }