]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libsmb: Use reparse_data_buffer_marshall() in py_reparse_symlink_put()
authorVolker Lendecke <vl@samba.org>
Thu, 21 Sep 2023 13:45:49 +0000 (06:45 -0700)
committerJeremy Allison <jra@samba.org>
Mon, 25 Sep 2023 17:09:37 +0000 (17:09 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
libcli/smb/py_reparse_symlink.c

index 7aecc4fd38a2075b3dd5d261669e9c770c425b86..d25ebb72568dfa2f05f4f1628154696e505eed35 100644 (file)
@@ -71,35 +71,47 @@ static PyObject *py_reparse_put(PyObject *module, PyObject *args)
 
 static PyObject *py_reparse_symlink_put(PyObject *module, PyObject *args)
 {
-       char *substitute = NULL;
-       char *printname = NULL;
        int unparsed = 0;
        int flags = 0;
-       uint8_t *buf = NULL;
-       size_t buflen;
+       struct reparse_data_buffer reparse = {
+               .tag = IO_REPARSE_TAG_SYMLINK,
+       };
+       struct symlink_reparse_struct *lnk = &reparse.parsed.lnk;
+       uint8_t stackbuf[1024];
+       uint8_t *buf = stackbuf;
+       ssize_t buflen = sizeof(stackbuf);
        PyObject *result = NULL;
        bool ok;
 
-       ok = PyArg_ParseTuple(
-               args,
-               "ssii:symlink_put",
-               &substitute,
-               &printname,
-               &unparsed,
-               &flags);
+       ok = PyArg_ParseTuple(args,
+                             "ssii:symlink_put",
+                             &lnk->substitute_name,
+                             &lnk->print_name,
+                             &unparsed,
+                             &flags);
        if (!ok) {
                return NULL;
        }
+       lnk->unparsed_path_length = unparsed;
+       lnk->flags = flags;
 
-       ok = symlink_reparse_buffer_marshall(
-               substitute, printname, unparsed, flags, NULL, &buf, &buflen);
-       if (!ok) {
+       buflen = reparse_data_buffer_marshall(&reparse, buf, buflen);
+
+       if ((buflen > 0) && ((size_t)buflen > sizeof(stackbuf))) {
+               buf = malloc(buflen);
+               buflen = reparse_data_buffer_marshall(&reparse, buf, buflen);
+       }
+
+       if (buflen == -1) {
                PyErr_NoMemory();
-               return false;
+       } else {
+               result = PyBytes_FromStringAndSize((char *)buf, buflen);
+       }
+
+       if (buf != stackbuf) {
+               free(buf);
        }
 
-       result = PyBytes_FromStringAndSize((char *)buf, buflen);
-       TALLOC_FREE(buf);
        return result;
 }