s4-libcli: Initialize stack structure variables to zero.
authorAmitay Isaacs <amitay@gmail.com>
Thu, 28 Jul 2011 03:22:01 +0000 (13:22 +1000)
committerAndrew Tridgell <tridge@samba.org>
Thu, 28 Jul 2011 05:20:54 +0000 (15:20 +1000)
Update do_smb_connect function to return NTSTATUS rather than raise
python exception on error. Error checking done in py_smb_new().

Signed-off-by: Andrew Tridgell <tridge@samba.org>
source4/libcli/pysmb.c

index ec952ecf6bf8b4a7e602b8109be365764e097c96..52d0b10f298fa4db43a0930e51ebb0be86288c44 100644 (file)
@@ -59,14 +59,21 @@ static void dos_format(char *s)
 }
 
 
-static struct smbcli_tree *do_smb_connect(TALLOC_CTX *mem_ctx, struct smb_private_data *spdata,
-                       const char *hostname, const char *service)
+/*
+ * Connect to SMB share using smb_composite_connect
+ */
+static NTSTATUS do_smb_connect(TALLOC_CTX *mem_ctx, struct smb_private_data *spdata,
+                       const char *hostname, const char *service, struct smbcli_tree **tree)
 {
        struct smb_composite_connect io;
        NTSTATUS status;
 
        gensec_init();
 
+       *tree = NULL;
+
+       ZERO_STRUCT(io);
+
        io.in.dest_host = hostname;
 
        io.in.dest_ports = lpcfg_smb_ports(spdata->lp_ctx);
@@ -88,12 +95,17 @@ static struct smbcli_tree *do_smb_connect(TALLOC_CTX *mem_ctx, struct smb_privat
        status = smb_composite_connect(&io, mem_ctx,
                                        lpcfg_resolve_context(spdata->lp_ctx),
                                        spdata->ev_ctx);
-       PyErr_NTSTATUS_IS_ERR_RAISE(status);
+       if (NT_STATUS_IS_OK(status)) {
+               *tree = io.out.tree;
+       }
 
-       return io.out.tree;
+       return status;
 }
 
 
+/*
+ * Read SMB file and return the contents of the file as python string
+ */
 static PyObject * py_smb_loadfile(py_talloc_Object *self, PyObject *args)
 {
        struct smb_composite_loadfile io;
@@ -105,6 +117,8 @@ static PyObject * py_smb_loadfile(py_talloc_Object *self, PyObject *args)
                return NULL;
        }
 
+       ZERO_STRUCT(io);
+
        io.in.fname = filename;
 
        spdata = self->ptr;
@@ -114,7 +128,9 @@ static PyObject * py_smb_loadfile(py_talloc_Object *self, PyObject *args)
        return Py_BuildValue("s#", io.out.data, io.out.size);
 }
 
-
+/*
+ * Create a SMB file with given string as the contents
+ */
 static PyObject * py_smb_savefile(py_talloc_Object *self, PyObject *args)
 {
        struct smb_composite_savefile io;
@@ -138,6 +154,10 @@ static PyObject * py_smb_savefile(py_talloc_Object *self, PyObject *args)
        Py_RETURN_NONE;
 }
 
+
+/*
+ * Callback function to accumulate directory contents in a python list
+ */
 static void py_smb_list_callback(struct clilist_file_info *f, const char *mask, void *state)
 {
        PyObject *py_dirlist;
@@ -160,6 +180,9 @@ static void py_smb_list_callback(struct clilist_file_info *f, const char *mask,
 }
 
 
+/*
+ * List the directory contents for specified directory (Ignore '.' and '..' dirs)
+ */
 static PyObject *py_smb_list(py_talloc_Object *self, PyObject *args, PyObject *kwargs)
 {
        struct smb_private_data *spdata;
@@ -167,8 +190,9 @@ static PyObject *py_smb_list(py_talloc_Object *self, PyObject *args, PyObject *k
        const char *kwnames[] = { "directory", "mask", "attribs", NULL };
        char *base_dir;
        char *user_mask = NULL;
-       uint16_t attribute = 0;
        char *mask;
+       uint16_t attribute = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY
+                               | FILE_ATTRIBUTE_ARCHIVE;
 
        if (!PyArg_ParseTupleAndKeywords(args, kwargs, "z|sH",
                                        discard_const_p(char *, kwnames),
@@ -176,12 +200,6 @@ static PyObject *py_smb_list(py_talloc_Object *self, PyObject *args, PyObject *k
                return NULL;
        }
 
-       if (attribute == 0) {
-               attribute = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN |
-                               FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY |
-                               FILE_ATTRIBUTE_ARCHIVE;
-       }
-
        if (user_mask == NULL) {
                mask = talloc_asprintf(self->talloc_ctx, "%s\\*", base_dir);
        } else {
@@ -203,6 +221,10 @@ static PyObject *py_smb_list(py_talloc_Object *self, PyObject *args, PyObject *k
        return py_dirlist;
 }
 
+
+/*
+ * Read ACL on a given file/directory as a security descriptor object
+ */
 static PyObject *py_smb_getacl(py_talloc_Object *self, PyObject *args, PyObject *kwargs)
 {
        NTSTATUS status;
@@ -214,12 +236,14 @@ static PyObject *py_smb_getacl(py_talloc_Object *self, PyObject *args, PyObject
                return NULL;
        }
 
-       spdata = self->ptr;
+       ZERO_STRUCT(io);
 
        io.query_secdesc.level = RAW_FILEINFO_SEC_DESC;
        io.query_secdesc.in.file.path = filename;
        io.query_secdesc.in.secinfo_flags = 0;
 
+       spdata = self->ptr;
+
        status = smb_raw_query_secdesc(spdata->tree, self->talloc_ctx, &io);
        PyErr_NTSTATUS_IS_ERR_RAISE(status);
 
@@ -228,6 +252,9 @@ static PyObject *py_smb_getacl(py_talloc_Object *self, PyObject *args, PyObject
 }
 
 
+/*
+ * Set ACL on file/directory using given security descriptor object
+ */
 static PyObject *py_smb_setacl(py_talloc_Object *self, PyObject *args, PyObject *kwargs)
 {
        NTSTATUS status;
@@ -250,6 +277,8 @@ static PyObject *py_smb_setacl(py_talloc_Object *self, PyObject *args, PyObject
                return NULL;
        }
 
+       ZERO_STRUCT(io);
+
        io.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
        io.set_secdesc.in.file.path = filename;
        io.set_secdesc.in.secinfo_flags = 0;
@@ -286,6 +315,7 @@ static PyObject *py_smb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs
        const char *service = NULL;
        py_talloc_Object *smb;
        struct smb_private_data *spdata;
+       NTSTATUS status;
 
        if (!PyArg_ParseTupleAndKeywords(args, kwargs, "zz|OO",
                                        discard_const_p(char *, kwnames),
@@ -324,7 +354,8 @@ static PyObject *py_smb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs
                return NULL;
        }
 
-       spdata->tree = do_smb_connect(smb->talloc_ctx, spdata, hostname, service);
+       status = do_smb_connect(smb->talloc_ctx, spdata, hostname, service, &spdata->tree);
+       PyErr_NTSTATUS_IS_ERR_RAISE(status);
        if (spdata->tree == NULL) {
                Py_DECREF(smb);
                return NULL;