From: Volker Lendecke Date: Thu, 21 Sep 2023 13:45:49 +0000 (-0700) Subject: libsmb: Use reparse_data_buffer_marshall() in py_reparse_symlink_put() X-Git-Tag: tevent-0.16.0~521 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=41274da949ee07464d7a95a386d2f084ec8e796a;p=thirdparty%2Fsamba.git libsmb: Use reparse_data_buffer_marshall() in py_reparse_symlink_put() Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/libcli/smb/py_reparse_symlink.c b/libcli/smb/py_reparse_symlink.c index 7aecc4fd38a..d25ebb72568 100644 --- a/libcli/smb/py_reparse_symlink.c +++ b/libcli/smb/py_reparse_symlink.c @@ -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; }