From: Joseph Sutton Date: Wed, 15 Nov 2023 22:20:22 +0000 (+1300) Subject: s4:librpc: Add functions converting between bytes and UTF‐16 strings X-Git-Tag: talloc-2.4.2~654 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe1d45cf1e90e9d75f3a47d65b920e2a7e472c97;p=thirdparty%2Fsamba.git s4:librpc: Add functions converting between bytes and UTF‐16 strings Signed-off-by: Joseph Sutton Reviewed-by: Andrew Bartlett Autobuild-User(master): Andrew Bartlett Autobuild-Date(master): Thu Nov 16 06:23:35 UTC 2023 on atb-devel-224 --- diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c index e36a176a376..2d9a4f8ee37 100644 --- a/source4/librpc/rpc/pyrpc_util.c +++ b/source4/librpc/rpc/pyrpc_util.c @@ -419,6 +419,51 @@ PyObject *PyString_FromStringOrNULL(const char *str) return PyUnicode_FromString(str); } +PyObject *PyBytes_FromUtf16StringOrNULL(const uint16_t *str) +{ + size_t len; + + if (str == NULL) { + Py_RETURN_NONE; + } + + len = utf16_len(str); + return PyBytes_FromStringAndSize((const char *)str, len); +} + +uint16_t *PyUtf16String_FromBytes(TALLOC_CTX *mem_ctx, PyObject *value) +{ + char *bytes = NULL; + Py_ssize_t len = 0; + uint16_t *utf16_string = NULL; + int ret; + + ret = PyBytes_AsStringAndSize(value, &bytes, &len); + if (ret) { + return NULL; + } + + if (len < 0) { + PyErr_SetString(PyExc_ValueError, "bytes length is negative"); + return NULL; + } + + /* Ensure that the bytes object contains no embedded null terminator. */ + if ((size_t)len != utf16_len_n(bytes, len)) { + PyErr_SetString(PyExc_ValueError, + "value contains an embedded null terminator"); + return NULL; + } + + utf16_string = talloc_utf16_strlendup(mem_ctx, bytes, len); + if (utf16_string == NULL) { + PyErr_NoMemory(); + return NULL; + } + + return utf16_string; +} + PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level, const void *in, const char *typename) { diff --git a/source4/librpc/rpc/pyrpc_util.h b/source4/librpc/rpc/pyrpc_util.h index 5a5f14de285..75b04f1d5fe 100644 --- a/source4/librpc/rpc/pyrpc_util.h +++ b/source4/librpc/rpc/pyrpc_util.h @@ -59,6 +59,10 @@ PyObject *py_return_ndr_struct(const char *module_name, const char *type_name, PyObject *PyString_FromStringOrNULL(const char *str); +PyObject *PyBytes_FromUtf16StringOrNULL(const uint16_t *str); + +uint16_t *PyUtf16String_FromBytes(TALLOC_CTX *mem_ctx, PyObject *value); + PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level, const void *in, const char *typename); void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,