From b226f833d6798940b8961989a2ec5843b08a51d4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 12 Dec 2013 09:37:25 -0800 Subject: [PATCH] s3: smbpasswd - fix crashes on invalid input. get_pass can return NULL on error. Ensure that this is always the case and fix all callers to cope (some already did). Reported by Joonas Kuorilehto BUG: https://bugzilla.samba.org/show_bug.cgi?id=10320 Signed-off-by: Jeremy Allison Reviewed-by: Volker Lendecke Autobuild-User(master): Volker Lendecke Autobuild-Date(master): Mon Dec 16 15:17:58 CET 2013 on sn-devel-104 (cherry picked from commit ef5a3bedab74420baf0c653cf8e304fe6c2a13b4) --- source3/utils/net.c | 5 +++++ source3/utils/passwd_util.c | 14 +++++++++----- source3/utils/smbpasswd.c | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/source3/utils/net.c b/source3/utils/net.c index eccb522..a31214f 100644 --- a/source3/utils/net.c +++ b/source3/utils/net.c @@ -105,6 +105,11 @@ static int net_changesecretpw(struct net_context *c, int argc, } trust_pw = get_pass(_("Enter machine password: "), c->opt_stdin); + if (trust_pw == NULL) { + d_fprintf(stderr, + _("Error in reading machine password\n")); + return 1; + } if (!secrets_store_machine_password(trust_pw, lp_workgroup(), sec_channel_type)) { d_fprintf(stderr, diff --git a/source3/utils/passwd_util.c b/source3/utils/passwd_util.c index 293f163..6bc2d60 100644 --- a/source3/utils/passwd_util.c +++ b/source3/utils/passwd_util.c @@ -42,11 +42,12 @@ char *stdin_new_passwd( void) * the newline that ends the password, then replace the newline with * a null terminator. */ - if ( fgets(new_pw, sizeof(new_pw), stdin) != NULL) { - if ((len = strlen(new_pw)) > 0) { - if(new_pw[len-1] == '\n') - new_pw[len - 1] = 0; - } + if ( fgets(new_pw, sizeof(new_pw), stdin) == NULL) { + return NULL; + } + if ((len = strlen(new_pw)) > 0) { + if(new_pw[len-1] == '\n') + new_pw[len - 1] = 0; } return(new_pw); } @@ -61,6 +62,9 @@ char *get_pass( const char *prompt, bool stdin_get) char *p; if (stdin_get) { p = stdin_new_passwd(); + if (p == NULL) { + return NULL; + } } else { p = getpass( prompt); } diff --git a/source3/utils/smbpasswd.c b/source3/utils/smbpasswd.c index 66c80da..082da93 100644 --- a/source3/utils/smbpasswd.c +++ b/source3/utils/smbpasswd.c @@ -216,11 +216,17 @@ static char *prompt_for_new_password(bool stdin_get) ZERO_ARRAY(new_pw); p = get_pass("New SMB password:", stdin_get); + if (p == NULL) { + return NULL; + } fstrcpy(new_pw, p); SAFE_FREE(p); p = get_pass("Retype new SMB password:", stdin_get); + if (p == NULL) { + return NULL; + } if (strcmp(p, new_pw)) { fprintf(stderr, "Mismatch - password unchanged.\n"); @@ -310,6 +316,10 @@ static int process_root(int local_flags) printf("Setting stored password for \"%s\" in secrets.tdb\n", ldap_admin_dn); if ( ! *ldap_secret ) { new_passwd = prompt_for_new_password(stdin_passwd_get); + if (new_passwd == NULL) { + fprintf(stderr, "Failed to read new password!\n"); + exit(1); + } fstrcpy(ldap_secret, new_passwd); } if (!store_ldap_admin_pw(ldap_secret)) { @@ -537,6 +547,10 @@ static int process_nonroot(int local_flags) if (remote_machine != NULL) { old_pw = get_pass("Old SMB password:",stdin_passwd_get); + if (old_pw == NULL) { + fprintf(stderr, "Unable to get old password.\n"); + exit(1); + } } if (!new_passwd) { -- 1.8.5.1