mirror of https://github.com/python/cpython
Add private _PyUnicode_AsUTF8NoNUL() function (GH-111957)
Like PyUnicode_AsUTF8(), but check for embedded null characters.
This commit is contained in:
parent
3932b0f7b1
commit
771bd3c94a
|
@ -434,6 +434,10 @@ struct _Py_unicode_state {
|
||||||
extern void _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p);
|
extern void _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p);
|
||||||
extern void _PyUnicode_ClearInterned(PyInterpreterState *interp);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -1020,15 +1020,10 @@ io_check_errors(PyObject *errors)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_ssize_t name_length;
|
const char *name = _PyUnicode_AsUTF8NoNUL(errors);
|
||||||
const char *name = PyUnicode_AsUTF8AndSize(errors, &name_length);
|
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
return -1;
|
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);
|
PyObject *handler = PyCodec_LookupError(name);
|
||||||
if (handler != NULL) {
|
if (handler != NULL) {
|
||||||
Py_DECREF(handler);
|
Py_DECREF(handler);
|
||||||
|
|
|
@ -76,16 +76,10 @@ isolation_level_converter(PyObject *str_or_none, const char **result)
|
||||||
*result = NULL;
|
*result = NULL;
|
||||||
}
|
}
|
||||||
else if (PyUnicode_Check(str_or_none)) {
|
else if (PyUnicode_Check(str_or_none)) {
|
||||||
Py_ssize_t sz;
|
const char *str = _PyUnicode_AsUTF8NoNUL(str_or_none);
|
||||||
const char *str = PyUnicode_AsUTF8AndSize(str_or_none, &sz);
|
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (strlen(str) != (size_t)sz) {
|
|
||||||
PyErr_SetString(PyExc_ValueError, "embedded null character");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *level = get_isolation_level(str);
|
const char *level = get_isolation_level(str);
|
||||||
if (level == NULL) {
|
if (level == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -3847,6 +3847,18 @@ PyUnicode_AsUTF8(PyObject *unicode)
|
||||||
return PyUnicode_AsUTF8AndSize(unicode, NULL);
|
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
|
PyUnicode_GetSize() has been deprecated since Python 3.3
|
||||||
because it returned length of Py_UNICODE.
|
because it returned length of Py_UNICODE.
|
||||||
|
|
Loading…
Reference in New Issue