mirror of
https://github.com/python/cpython.git
synced 2025-10-17 04:08:28 +00:00
Add support for restricting access based on restricted execution mode.
Renamed the 'readonly' field to 'flags' and defined some new flag bits: READ_RESTRICTED and WRITE_RESTRICTED, as well as a shortcut RESTRICTED that means both.
This commit is contained in:
parent
bf80a033ee
commit
c299fc16f2
2 changed files with 22 additions and 7 deletions
|
@ -31,7 +31,7 @@ struct memberlist {
|
||||||
char *name;
|
char *name;
|
||||||
int type;
|
int type;
|
||||||
int offset;
|
int offset;
|
||||||
int readonly;
|
int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Types */
|
/* Types */
|
||||||
|
@ -58,9 +58,13 @@ struct memberlist {
|
||||||
#define T_PSTRING_INPLACE 15
|
#define T_PSTRING_INPLACE 15
|
||||||
#endif /* macintosh */
|
#endif /* macintosh */
|
||||||
|
|
||||||
/* Readonly flag */
|
/* Flags */
|
||||||
#define READONLY 1
|
#define READONLY 1
|
||||||
#define RO READONLY /* Shorthand */
|
#define RO READONLY /* Shorthand */
|
||||||
|
#define READ_RESTRICTED 2
|
||||||
|
#define WRITE_RESTRICTED 4
|
||||||
|
#define RESTRICTED (READ_RESTRICTED | WRITE_RESTRICTED)
|
||||||
|
|
||||||
|
|
||||||
DL_IMPORT(PyObject *) PyMember_Get(char *, struct memberlist *, char *);
|
DL_IMPORT(PyObject *) PyMember_Get(char *, struct memberlist *, char *);
|
||||||
DL_IMPORT(int) PyMember_Set(char *, struct memberlist *, char *, PyObject *);
|
DL_IMPORT(int) PyMember_Set(char *, struct memberlist *, char *, PyObject *);
|
||||||
|
|
|
@ -38,6 +38,12 @@ PyMember_Get(char *addr, struct memberlist *mlist, char *name)
|
||||||
for (l = mlist; l->name != NULL; l++) {
|
for (l = mlist; l->name != NULL; l++) {
|
||||||
if (strcmp(l->name, name) == 0) {
|
if (strcmp(l->name, name) == 0) {
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
|
if ((l->flags & READ_RESTRICTED) &&
|
||||||
|
PyEval_GetRestricted()) {
|
||||||
|
PyErr_SetString(PyExc_RuntimeError,
|
||||||
|
"restricted attribute");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
addr += l->offset;
|
addr += l->offset;
|
||||||
switch (l->type) {
|
switch (l->type) {
|
||||||
case T_BYTE:
|
case T_BYTE:
|
||||||
|
@ -133,17 +139,22 @@ PyMember_Set(char *addr, struct memberlist *mlist, char *name, PyObject *v)
|
||||||
|
|
||||||
for (l = mlist; l->name != NULL; l++) {
|
for (l = mlist; l->name != NULL; l++) {
|
||||||
if (strcmp(l->name, name) == 0) {
|
if (strcmp(l->name, name) == 0) {
|
||||||
|
if ((l->flags & READONLY) || l->type == T_STRING
|
||||||
#ifdef macintosh
|
#ifdef macintosh
|
||||||
if (l->readonly || l->type == T_STRING ||
|
|| l->type == T_PSTRING
|
||||||
l->type == T_PSTRING)
|
#endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
#else
|
|
||||||
if (l->readonly || l->type == T_STRING ) {
|
|
||||||
#endif /* macintosh */
|
|
||||||
PyErr_SetString(PyExc_TypeError,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
"readonly attribute");
|
"readonly attribute");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if ((l->flags & WRITE_RESTRICTED) &&
|
||||||
|
PyEval_GetRestricted()) {
|
||||||
|
PyErr_SetString(PyExc_RuntimeError,
|
||||||
|
"restricted attribute");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (v == NULL && l->type != T_OBJECT) {
|
if (v == NULL && l->type != T_OBJECT) {
|
||||||
PyErr_SetString(PyExc_TypeError,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
"can't delete numeric/char attribute");
|
"can't delete numeric/char attribute");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue