libgpo: Setup the stack frame in ads_connect
authorDavid Mulder <dmulder@suse.com>
Tue, 7 Nov 2017 17:41:05 +0000 (10:41 -0700)
committerGarming Sam <garming@samba.org>
Mon, 20 Nov 2017 20:41:15 +0000 (21:41 +0100)
Signed-off-by: David Mulder <dmulder@suse.com>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
libgpo/pygpo.c

index 28f41f7..aaa7429 100644 (file)
@@ -241,6 +241,7 @@ static int py_ads_init(ADS *self, PyObject *args, PyObject *kwds)
 static PyObject* py_ads_connect(ADS *self)
 {
        ADS_STATUS status;
+       TALLOC_CTX *frame = talloc_stackframe();
        if (self->cli_creds) {
                self->ads_ptr->auth.user_name = SMB_STRDUP(cli_credentials_get_username(self->cli_creds));
 self->ads_ptr->auth.flags |= ADS_AUTH_USER_CREDS;
@@ -250,6 +251,7 @@ self->ads_ptr->auth.flags |= ADS_AUTH_USER_CREDS;
                status = ads_connect_user_creds(self->ads_ptr);
                if (!ADS_ERR_OK(status)) {
                        PyErr_SetString(PyExc_SystemError, "ads_connect() failed");
+                       TALLOC_FREE(frame);
                        Py_RETURN_FALSE;
                }
        } else {
@@ -257,31 +259,38 @@ self->ads_ptr->auth.flags |= ADS_AUTH_USER_CREDS;
 
                if (asprintf(&(self->ads_ptr->auth.user_name), "%s$", lp_netbios_name()) == -1) {
                        PyErr_SetString(PyExc_SystemError, "Failed to asprintf");
+                       TALLOC_FREE(frame);
                        Py_RETURN_FALSE;
                } else
                        self->ads_ptr->auth.flags |= ADS_AUTH_USER_CREDS;
                if (!secrets_init()) {
                        PyErr_SetString(PyExc_SystemError, "secrets_init() failed");
+                       TALLOC_FREE(frame);
                        Py_RETURN_FALSE;
                }
+
                if (!(passwd = secrets_fetch_machine_password(self->ads_ptr->server.workgroup, NULL, NULL))) {
                        PyErr_SetString(PyExc_SystemError, "Failed to fetch the machine account password");
+                       TALLOC_FREE(frame);
                        Py_RETURN_FALSE;
                }
                self->ads_ptr->auth.password = smb_xstrdup(passwd);
                self->ads_ptr->auth.realm = smb_xstrdup(self->ads_ptr->server.realm);
                if (!strupper_m(self->ads_ptr->auth.realm)) {
                        PyErr_SetString(PyExc_SystemError, "Failed to strdup");
+                       TALLOC_FREE(frame);
                        Py_RETURN_FALSE;
                }
 
                status = ads_connect(self->ads_ptr);
                if (!ADS_ERR_OK(status)) {
                        PyErr_SetString(PyExc_SystemError, "ads_connect() failed");
+                       TALLOC_FREE(frame);
                        Py_RETURN_FALSE;
                }
        }
 
+       TALLOC_FREE(frame);
        Py_RETURN_TRUE;
 }