Like PyUnicode_AsUTF8(), but check for embedded null characters.
extern void _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p);
extern void _PyUnicode_ClearInterned(PyInterpreterState *interp);
+// Like PyUnicode_AsUTF8(), but check for embedded null characters.
+// Export for '_sqlite3' shared extension.
+PyAPI_FUNC(const char *) _PyUnicode_AsUTF8NoNUL(PyObject *);
+
#ifdef __cplusplus
}
return 0;
}
- Py_ssize_t name_length;
- const char *name = PyUnicode_AsUTF8AndSize(errors, &name_length);
+ const char *name = _PyUnicode_AsUTF8NoNUL(errors);
if (name == NULL) {
return -1;
}
- if (strlen(name) != (size_t)name_length) {
- PyErr_SetString(PyExc_ValueError, "embedded null character in errors");
- return -1;
- }
PyObject *handler = PyCodec_LookupError(name);
if (handler != NULL) {
Py_DECREF(handler);
*result = NULL;
}
else if (PyUnicode_Check(str_or_none)) {
- Py_ssize_t sz;
- const char *str = PyUnicode_AsUTF8AndSize(str_or_none, &sz);
+ const char *str = _PyUnicode_AsUTF8NoNUL(str_or_none);
if (str == NULL) {
return 0;
}
- if (strlen(str) != (size_t)sz) {
- PyErr_SetString(PyExc_ValueError, "embedded null character");
- return 0;
- }
-
const char *level = get_isolation_level(str);
if (level == NULL) {
return 0;
return PyUnicode_AsUTF8AndSize(unicode, NULL);
}
+const char *
+_PyUnicode_AsUTF8NoNUL(PyObject *unicode)
+{
+ Py_ssize_t size;
+ const char *s = PyUnicode_AsUTF8AndSize(unicode, &size);
+ if (s && strlen(s) != (size_t)size) {
+ PyErr_SetString(PyExc_ValueError, "embedded null character");
+ return NULL;
+ }
+ return s;
+}
+
/*
PyUnicode_GetSize() has been deprecated since Python 3.3
because it returned length of Py_UNICODE.