]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s4:librpc: Add functions converting between bytes and UTF‐16 strings
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Wed, 15 Nov 2023 22:20:22 +0000 (11:20 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 16 Nov 2023 06:23:35 +0000 (06:23 +0000)
Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet@samba.org>
Autobuild-Date(master): Thu Nov 16 06:23:35 UTC 2023 on atb-devel-224

source4/librpc/rpc/pyrpc_util.c
source4/librpc/rpc/pyrpc_util.h

index e36a176a37624c8001c6e765fbeee63be47edd71..2d9a4f8ee3728c44ab48c9ca0cae80952a266925 100644 (file)
@@ -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)
 {
index 5a5f14de285d0e90b18a5865572d9c79f932e90e..75b04f1d5fe1e08a1a4feeff5ab4642e8b174c82 100644 (file)
@@ -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,