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;
}