[PATCH 1/2] python: disallow python code to instanciate certain types

Sanimir Agovic
2013-08-30T14:40:23Z

I simply followed the pattern used for gdb.Type and assign NULL to tp_new
thus the type cannot be created from python code.

before>
(gdb) python gdb.Frame()
(gdb)

after>
(gdb) python gdb.Frame()
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: cannot create 'gdb.Frame' instances
Error while executing Python code.

2013-08-30 Sanimir Agovic <sanimir.agovic@intel.com>

python/

* py-arch.c (gdbpy_initialize_arch): Set tp_new implicitly to NULL.
* py-block.c (gdbpy_initialize_blocks): Set tp_new implicitly to NULL.
* py-frame.c (gdbpy_initialize_frames): Set tp_new implicitly to NULL.
* py-objfile.c (objfpy_new): Remove function.
(objfile_object_type): Set tp_new to NULL.
* py-progspace.c (pspy_new): Remove function.
(pspace_object_type): Set tp_new to NULL
* py-symtab.c (gdbpy_initialize_symtabs): Set tp_new implicitly to NULL.

Change-Id: Ie9ced3d27f4a0660d160f651391a97ed7af4d1ce
---
gdb/python/py-arch.c | 1 -
gdb/python/py-block.c | 1 -
gdb/python/py-frame.c | 1 -
gdb/python/py-objfile.c | 35 +----------------------------------
gdb/python/py-progspace.c | 35 +----------------------------------
gdb/python/py-symtab.c | 2 --
6 files changed, 2 insertions(+), 73 deletions(-)

diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c
index 7098a8a..464ffb3 100644
--- a/gdb/python/py-arch.c
+++ b/gdb/python/py-arch.c
@@ -235,7 +235,6 @@ int
gdbpy_initialize_arch (void)
{
arch_object_data = gdbarch_data_register_post_init (arch_object_data_init);
- arch_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&arch_object_type) < 0)
return -1;

diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c
index c74ac2c..b7a7264 100644
--- a/gdb/python/py-block.c
+++ b/gdb/python/py-block.c
@@ -428,7 +428,6 @@ del_objfile_blocks (struct objfile *objfile, void *datum)
int
gdbpy_initialize_blocks (void)
{
- block_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&block_object_type) < 0)
return -1;

diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index f960b08..5fd099e 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -620,7 +620,6 @@ frapy_richcompare (PyObject *self, PyObject *other, int op)
int
gdbpy_initialize_frames (void)
{
- frame_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&frame_object_type) < 0)
return -1;

diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c
index a954c9d..ddd6b79 100644
--- a/gdb/python/py-objfile.c
+++ b/gdb/python/py-objfile.c
@@ -69,39 +69,6 @@ objfpy_dealloc (PyObject *o)
Py_TYPE (self)->tp_free (self);
}

-static PyObject *
-objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
-{
- objfile_object *self = (objfile_object *) type->tp_alloc (type, 0);
-
- if (self)
- {
- self->objfile = NULL;
-
- self->printers = PyList_New (0);
- if (!self->printers)
- {
- Py_DECREF (self);
- return NULL;
- }
-
- self->frame_filters = PyDict_New ();
- if (!self->frame_filters)
- {
- Py_DECREF (self);
- return NULL;
- }
-
- self->type_printers = PyList_New (0);
- if (!self->type_printers)
- {
- Py_DECREF (self);
- return NULL;
- }
- }
- return (PyObject *) self;
-}
-
PyObject *
objfpy_get_printers (PyObject *o, void *ignore)
{
@@ -374,5 +341,5 @@ static PyTypeObject objfile_object_type =
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
- objfpy_new, /* tp_new */
+ 0, /* tp_new */
};
diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c
index 98eeecc..6634aae 100644
--- a/gdb/python/py-progspace.c
+++ b/gdb/python/py-progspace.c
@@ -77,39 +77,6 @@ pspy_dealloc (PyObject *self)
Py_TYPE (self)->tp_free (self);
}

-static PyObject *
-pspy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
-{
- pspace_object *self = (pspace_object *) type->tp_alloc (type, 0);
-
- if (self)
- {
- self->pspace = NULL;
-
- self->printers = PyList_New (0);
- if (!self->printers)
- {
- Py_DECREF (self);
- return NULL;
- }
-
- self->frame_filters = PyDict_New ();
- if (!self->frame_filters)
- {
- Py_DECREF (self);
- return NULL;
- }
-
- self->type_printers = PyList_New (0);
- if (!self->type_printers)
- {
- Py_DECREF (self);
- return NULL;
- }
- }
- return (PyObject *) self;
-}
-
PyObject *
pspy_get_printers (PyObject *o, void *ignore)
{
@@ -361,5 +328,5 @@ static PyTypeObject pspace_object_type =
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
- pspy_new, /* tp_new */
+ 0, /* tp_new */
};
diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c
index 006946c..269feb8 100644
--- a/gdb/python/py-symtab.c
+++ b/gdb/python/py-symtab.c
@@ -484,11 +484,9 @@ del_objfile_sal (struct objfile *objfile, void *datum)
int
gdbpy_initialize_symtabs (void)
{
- symtab_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&symtab_object_type) < 0)
return -1;

- sal_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&sal_object_type) < 0)
return -1;

--
1.7.1.1