app_voicemail: vm_authenticate accesses uninitialized memory
authorSean Bright <sean.bright@gmail.com>
Mon, 20 Feb 2017 12:28:23 +0000 (07:28 -0500)
committerSean Bright <sean.bright@gmail.com>
Mon, 20 Feb 2017 21:09:35 +0000 (15:09 -0600)
vm_authenticate doesn't always set the passed ast_vm_user argument, so
we initialize to 0 before passing it in.

ASTERISK-25893 #close
Reported by: Filip Jenicek

Change-Id: Ia3cc0128f93d352ed9add8d5c2f0f7232c2cbe4a

apps/app_voicemail.c

index 91e8104..1d7ffc0 100644 (file)
@@ -11190,7 +11190,7 @@ static int vm_authenticate(struct ast_channel *chan, char *mailbox, int mailbox_
                return -1;
        }
        if (vmu && !skipuser) {
-               memcpy(res_vmu, vmu, sizeof(struct ast_vm_user));
+               *res_vmu = *vmu;
        }
        return 0;
 }
@@ -11352,8 +11352,8 @@ static int vm_execmain(struct ast_channel *chan, const char *data)
        int box;
        int useadsi = 0;
        int skipuser = 0;
-       struct vm_state vms;
-       struct ast_vm_user *vmu = NULL, vmus;
+       struct vm_state vms = {{0}};
+       struct ast_vm_user *vmu = NULL, vmus = {{0}};
        char *context = NULL;
        int silentexit = 0;
        struct ast_flags flags = { 0 };
@@ -11366,12 +11366,8 @@ static int vm_execmain(struct ast_channel *chan, const char *data)
 #endif
 
        /* Add the vm_state to the active list and keep it active */
-       memset(&vms, 0, sizeof(vms));
-
        vms.lastmsg = -1;
 
-       memset(&vmus, 0, sizeof(vmus));
-
        ast_test_suite_event_notify("START", "Message: vm_execmain started");
        if (ast_channel_state(chan) != AST_STATE_UP) {
                ast_debug(1, "Before ast_answer\n");
@@ -12664,7 +12660,7 @@ static struct ast_custom_function vm_info_acf = {
 static int vmauthenticate(struct ast_channel *chan, const char *data)
 {
        char *s, *user = NULL, *context = NULL, mailbox[AST_MAX_EXTENSION] = "";
-       struct ast_vm_user vmus;
+       struct ast_vm_user vmus = {{0}};
        char *options = NULL;
        int silent = 0, skipuser = 0;
        int res = -1;