Commit 577c7a76 authored by Skip Montanaro's avatar Skip Montanaro

tighten up string checks

make csv_{get,unregister}_dialect METH_O functions to avoid PyArg_ParseTuple
parent 860fc0b1
...@@ -187,8 +187,12 @@ set_None_as_nullchar(char * addr, PyObject *v) ...@@ -187,8 +187,12 @@ set_None_as_nullchar(char * addr, PyObject *v)
PyErr_BadArgument(); PyErr_BadArgument();
return -1; return -1;
} }
else else {
*addr = PyString_AsString(v)[0]; char *s = PyString_AsString(v);
if (s == NULL)
return -1;
*addr = s[0];
}
return 0; return 0;
} }
...@@ -347,7 +351,10 @@ dialect_init(DialectObj * self, PyObject * args, PyObject * kwargs) ...@@ -347,7 +351,10 @@ dialect_init(DialectObj * self, PyObject * args, PyObject * kwargs)
/* And extract the attributes */ /* And extract the attributes */
for (i = 0; i < PyList_GET_SIZE(dir_list); ++i) { for (i = 0; i < PyList_GET_SIZE(dir_list); ++i) {
name_obj = PyList_GET_ITEM(dir_list, i); name_obj = PyList_GET_ITEM(dir_list, i);
if (PyString_AsString(name_obj)[0] == '_') char *s = PyString_AsString(name_obj);
if (s == NULL)
return -1;
if (s[0] == '_')
continue; continue;
value_obj = PyObject_GetAttr(dialect, name_obj); value_obj = PyObject_GetAttr(dialect, name_obj);
if (value_obj) { if (value_obj) {
...@@ -1010,6 +1017,7 @@ join_append_lineterminator(WriterObj *self) ...@@ -1010,6 +1017,7 @@ join_append_lineterminator(WriterObj *self)
return 0; return 0;
memmove(self->rec + self->rec_len, memmove(self->rec + self->rec_len,
/* should not be NULL */
PyString_AsString(self->dialect->lineterminator), PyString_AsString(self->dialect->lineterminator),
terminator_len); terminator_len);
self->rec_len += terminator_len; self->rec_len += terminator_len;
...@@ -1063,7 +1071,8 @@ csv_writerow(WriterObj *self, PyObject *seq) ...@@ -1063,7 +1071,8 @@ csv_writerow(WriterObj *self, PyObject *seq)
} }
if (PyString_Check(field)) { if (PyString_Check(field)) {
append_ok = join_append(self, PyString_AsString(field), append_ok = join_append(self,
PyString_AS_STRING(field),
&quoted, len == 1); &quoted, len == 1);
Py_DECREF(field); Py_DECREF(field);
} }
...@@ -1079,7 +1088,7 @@ csv_writerow(WriterObj *self, PyObject *seq) ...@@ -1079,7 +1088,7 @@ csv_writerow(WriterObj *self, PyObject *seq)
if (str == NULL) if (str == NULL)
return NULL; return NULL;
append_ok = join_append(self, PyString_AsString(str), append_ok = join_append(self, PyString_AS_STRING(str),
&quoted, len == 1); &quoted, len == 1);
Py_DECREF(str); Py_DECREF(str);
} }
...@@ -1291,12 +1300,8 @@ csv_register_dialect(PyObject *module, PyObject *args) ...@@ -1291,12 +1300,8 @@ csv_register_dialect(PyObject *module, PyObject *args)
} }
static PyObject * static PyObject *
csv_unregister_dialect(PyObject *module, PyObject *args) csv_unregister_dialect(PyObject *module, PyObject *name_obj)
{ {
PyObject *name_obj;
if (!PyArg_ParseTuple(args, "O", &name_obj))
return NULL;
if (PyDict_DelItem(dialects, name_obj) < 0) if (PyDict_DelItem(dialects, name_obj) < 0)
return PyErr_Format(error_obj, "unknown dialect"); return PyErr_Format(error_obj, "unknown dialect");
Py_INCREF(Py_None); Py_INCREF(Py_None);
...@@ -1304,12 +1309,8 @@ csv_unregister_dialect(PyObject *module, PyObject *args) ...@@ -1304,12 +1309,8 @@ csv_unregister_dialect(PyObject *module, PyObject *args)
} }
static PyObject * static PyObject *
csv_get_dialect(PyObject *module, PyObject *args) csv_get_dialect(PyObject *module, PyObject *name_obj)
{ {
PyObject *name_obj;
if (!PyArg_ParseTuple(args, "O", &name_obj))
return NULL;
return get_dialect_from_registry(name_obj); return get_dialect_from_registry(name_obj);
} }
...@@ -1429,9 +1430,9 @@ static struct PyMethodDef csv_methods[] = { ...@@ -1429,9 +1430,9 @@ static struct PyMethodDef csv_methods[] = {
{ "register_dialect", (PyCFunction)csv_register_dialect, { "register_dialect", (PyCFunction)csv_register_dialect,
METH_VARARGS, csv_register_dialect_doc}, METH_VARARGS, csv_register_dialect_doc},
{ "unregister_dialect", (PyCFunction)csv_unregister_dialect, { "unregister_dialect", (PyCFunction)csv_unregister_dialect,
METH_VARARGS, csv_unregister_dialect_doc}, METH_O, csv_unregister_dialect_doc},
{ "get_dialect", (PyCFunction)csv_get_dialect, { "get_dialect", (PyCFunction)csv_get_dialect,
METH_VARARGS, csv_get_dialect_doc}, METH_O, csv_get_dialect_doc},
{ NULL, NULL } { NULL, NULL }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment