Skip to content

Commit 41edc98

Browse files
committed
Converted PyString_FromString on bindatas to PyString_FromStringAndSize
1 parent 330cb5b commit 41edc98

File tree

3 files changed

+50
-112
lines changed

3 files changed

+50
-112
lines changed

context.c

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <arpa/inet.h>
3131
#include <event2/event.h>
3232
#include <getdns/getdns_ext_libevent.h>
33+
#include <sys/wait.h>
3334
#include "pygetdns.h"
3435

3536
int
@@ -68,16 +69,17 @@ void
6869
context_dealloc(getdns_ContextObject *self)
6970
{
7071
getdns_context *context;
72+
int status;
7173

7274
if ((context = PyCapsule_GetPointer(self->py_context, "context")) == NULL) {
73-
PyErr_Clear();
74-
PyErr_SetString(getdns_error, GETDNS_RETURN_BAD_CONTEXT_TEXT);
7575
return;
7676
}
77-
if (self->event_base)
78-
event_base_free(self->event_base);
7977
Py_XDECREF(self->py_context);
8078
getdns_context_destroy(context);
79+
(void)wait(&status); /* reap the process spun off by unbound */
80+
/* TODO: this has just been fixed in unbound and */
81+
/* this wait() should be removed once the new */
82+
/* libunbound is distributed */
8183
return;
8284
}
8385

@@ -834,9 +836,11 @@ context_getattro(PyObject *self, PyObject *nameobj)
834836
return NULL;
835837
}
836838
#if PY_MAJOR_VERSION >= 3
837-
return PyUnicode_FromString((char *)implementation_string->data);
839+
return PyUnicode_FromStringAndSize((char *)implementation_string->data,
840+
(Py_ssize_t)implementation_string->size);
838841
#else
839-
return PyString_FromString((char *)implementation_string->data);
842+
return PyString_FromStringAndSize((char *)implementation_string->data,
843+
(Py_ssize_t)implementation_string->size);
840844
#endif
841845
}
842846
if (!strncmp(attrname, "version_string", strlen("version_string"))) {
@@ -846,9 +850,11 @@ context_getattro(PyObject *self, PyObject *nameobj)
846850
return NULL;
847851
}
848852
#if PY_MAJOR_VERSION >= 3
849-
return PyUnicode_FromString((char *)version_string->data);
853+
return PyUnicode_FromStringAndSize((char *)version_string->data,
854+
(Py_ssize_t)version_string->size);
850855
#else
851-
return PyString_FromString((char *)version_string->data);
856+
return PyString_FromStringAndSize((char *)version_string->data,
857+
(Py_ssize_t)version_string->size);
852858
#endif
853859
}
854860

@@ -1622,9 +1628,13 @@ context_get_api_information(getdns_ContextObject *self, PyObject *unused)
16221628
return NULL;
16231629
}
16241630
#if PY_MAJOR_VERSION >= 3
1625-
if (PyDict_SetItemString(py_api, "version_string", PyUnicode_FromString((char *)version_string->data))) {
1631+
if (PyDict_SetItemString(py_api, "version_string",
1632+
PyUnicode_FromStringAndSize((char *)version_string->data,
1633+
(Py_ssize_t)version_string->size))) {
16261634
#else
1627-
if (PyDict_SetItemString(py_api, "version_string", PyString_FromString((char *)version_string->data))) {
1635+
if (PyDict_SetItemString(py_api, "version_string",
1636+
PyString_FromStringAndSize((char *)version_string->data,
1637+
(Py_ssize_t)version_string->size))) {
16281638
#endif
16291639
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
16301640
return NULL;
@@ -1634,9 +1644,13 @@ context_get_api_information(getdns_ContextObject *self, PyObject *unused)
16341644
return NULL;
16351645
}
16361646
#if PY_MAJOR_VERSION >= 3
1637-
if (PyDict_SetItemString(py_api, "implementation_string", PyUnicode_FromString((char *)imp_string->data))) {
1647+
if (PyDict_SetItemString(py_api, "implementation_string",
1648+
PyUnicode_FromStringAndSize((char *)imp_string->data,
1649+
(Py_ssize_t)imp_string->size))) {
16381650
#else
1639-
if (PyDict_SetItemString(py_api, "implementation_string", PyString_FromString((char *)imp_string->data))) {
1651+
if (PyDict_SetItemString(py_api, "implementation_string",
1652+
PyString_FromStringAndSize((char *)imp_string->data,
1653+
(Py_ssize_t)imp_string->size))) {
16401654
#endif
16411655
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
16421656
return NULL;

pygetdns_util.c

Lines changed: 23 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -766,9 +766,10 @@ convertBinData(getdns_bindata* data,
766766
PyObject *a_string;
767767

768768
#if PY_MAJOR_VERSION >= 3
769-
if ((a_string = PyUnicode_FromString((char *)data->data)) == NULL) {
769+
if ((a_string = PyUnicode_FromStringAndSize((char *)data->data), (Py_ssize_t)data->size) == NULL) {
770770
#else
771-
if ((a_string = PyString_FromString((char *)data->data)) == NULL) {
771+
772+
if ((a_string = PyString_FromStringAndSize((char *)data->data, (Py_ssize_t)data->size)) == NULL) {
772773
#endif
773774
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
774775
return NULL;
@@ -870,9 +871,11 @@ convertToDict(struct getdns_dict* dict) {
870871
getdns_dict_get_bindata(dict, (char*)nameBin->data, &data);
871872
PyObject* res = convertBinData(data, (char*)nameBin->data);
872873
#if PY_MAJOR_VERSION >= 3
873-
PyDict_SetItem(resultsdict1, PyUnicode_FromString((char*) nameBin->data), res);
874+
PyDict_SetItem(resultsdict1, PyUnicode_FromStringAndSize((char *)nameBin->data,
875+
(Py_ssize_t)nameBin->size), res);
874876
#else
875-
PyDict_SetItem(resultsdict1, PyString_FromString((char*) nameBin->data), res);
877+
PyDict_SetItem(resultsdict1, PyString_FromStringAndSize((char *)nameBin->data,
878+
(Py_ssize_t)nameBin->size), res);
876879
#endif
877880
break;
878881
}
@@ -883,9 +886,11 @@ convertToDict(struct getdns_dict* dict) {
883886
PyObject* rl1 = Py_BuildValue("i", res);
884887
PyObject *res1 = Py_BuildValue("O", rl1);
885888
#if PY_MAJOR_VERSION >= 3
886-
PyDict_SetItem(resultsdict1, PyUnicode_FromString((char*) nameBin->data), res1);
889+
PyDict_SetItem(resultsdict1, PyUnicode_FromStringAndSize((char *)nameBin->data,
890+
(Py_ssize_t)nameBin->size), res1);
887891
#else
888-
PyDict_SetItem(resultsdict1, PyString_FromString((char*) nameBin->data), res1);
892+
PyDict_SetItem(resultsdict1, PyString_FromStringAndSize((char *)nameBin->data,
893+
(Py_ssize_t)nameBin->size), res1);
889894
#endif
890895
break;
891896
}
@@ -896,9 +901,11 @@ convertToDict(struct getdns_dict* dict) {
896901
PyObject *rl1 = convertToDict(subdict);
897902
PyObject *res1 = Py_BuildValue("O", rl1);
898903
#if PY_MAJOR_VERSION >= 3
899-
PyDict_SetItem(resultsdict1, PyUnicode_FromString((char*) nameBin->data), res1);
904+
PyDict_SetItem(resultsdict1, PyUnicode_FromStringAndSize((char *)nameBin->data,
905+
(Py_ssize_t)nameBin->size), res1);
900906
#else
901-
PyDict_SetItem(resultsdict1, PyString_FromString((char*) nameBin->data), res1);
907+
PyDict_SetItem(resultsdict1, PyString_FromStringAndSize((char *)nameBin->data,
908+
(Py_ssize_t)nameBin->size), res1);
902909
#endif
903910
break;
904911
}
@@ -909,9 +916,11 @@ convertToDict(struct getdns_dict* dict) {
909916
PyObject *rl1 = convertToList(list);
910917
PyObject *res1 = Py_BuildValue("O", rl1);
911918
#if PY_MAJOR_VERSION >= 3
912-
PyObject *key = PyUnicode_FromString((char *)nameBin->data);
919+
PyObject *key = PyUnicode_FromStringAndSize((char *)nameBin->data,
920+
(Py_ssize_t)nameBin->size);
913921
#else
914-
PyObject *key = PyString_FromString((char *)nameBin->data);
922+
PyObject *key = PyString_FromStringAndSize((char *)nameBin->data,
923+
(Py_ssize_t)nameBin->size);
915924
#endif
916925
PyDict_SetItem(resultsdict1, key, res1);
917926
break;
@@ -1024,9 +1033,11 @@ getdns_dict_to_ip_string(getdns_dict* dict) {
10241033
return NULL;
10251034
}
10261035
#if PY_MAJOR_VERSION >= 3
1027-
if (PyDict_SetItemString(addr_dict, "address_type", PyUnicode_FromString((char *)type->data)) != 0) {
1036+
if (PyDict_SetItemString(addr_dict, "address_type", PyUnicode_FromStringAndSize((char *)type->data,
1037+
(Py_ssize_t)type->size)) != 0) {
10281038
#else
1029-
if (PyDict_SetItemString(addr_dict, "address_type", PyString_FromString((char *)type->data)) != 0) {
1039+
if (PyDict_SetItemString(addr_dict, "address_type", PyString_FromStringAndSize((char *)type->data,
1040+
(Py_ssize_t)type->size)) != 0) {
10301041
#endif
10311042
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
10321043
return NULL;
@@ -1048,91 +1059,4 @@ getdns_dict_to_ip_string(getdns_dict* dict) {
10481059
return NULL;
10491060
}
10501061

1051-
PyObject*
1052-
getFullResponse(struct getdns_dict *dict)
1053-
{
1054-
1055-
PyObject* resultslist;
1056-
if ((resultslist = PyDict_New()) == NULL) {
1057-
error_exit("Unable to allocate response list", 0);
1058-
return NULL;
1059-
}
1060-
1061-
getdns_list* names;
1062-
getdns_dict_get_names(dict, &names);
1063-
size_t len = 0, i = 0;
1064-
getdns_list_get_length(names, &len);
1065-
for (i = 0; i < len; ++i) {
1066-
getdns_bindata* nameBin;
1067-
getdns_list_get_bindata(names, i, &nameBin);
1068-
getdns_data_type type;
1069-
getdns_dict_get_data_type(dict, (char*)nameBin->data, &type);
1070-
switch (type) {
1071-
case t_bindata:
1072-
{
1073-
getdns_bindata* data = NULL;
1074-
getdns_dict_get_bindata(dict, (char*)nameBin->data, &data);
1075-
PyObject *res = convertBinData(data, (char*)nameBin->data);
1076-
if (res) {
1077-
#if PY_MAJOR_VERSION >= 3
1078-
PyDict_SetItem(resultslist, PyUnicode_FromString((char*)nameBin->data), res);
1079-
#else
1080-
PyDict_SetItem(resultslist, PyString_FromString((char*)nameBin->data), res);
1081-
#endif
1082-
} else {
1083-
PyObject* res1 = Py_BuildValue("s", "empty");
1084-
#if PY_MAJOR_VERSION >= 3
1085-
PyDict_SetItem(resultslist, PyUnicode_FromString((char*)nameBin->data), res1);
1086-
#else
1087-
PyDict_SetItem(resultslist, PyString_FromString((char*)nameBin->data), res1);
1088-
#endif
1089-
}
1090-
break;
1091-
}
1092-
case t_int:
1093-
{
1094-
uint32_t res = 0;
1095-
getdns_dict_get_int(dict, (char*)nameBin->data, &res);
1096-
PyObject* res1 = Py_BuildValue("i", res);
1097-
#if PY_MAJOR_VERSION >= 3
1098-
PyDict_SetItem(resultslist, PyUnicode_FromString((char*)nameBin->data), res1);
1099-
#else
1100-
PyDict_SetItem(resultslist, PyString_FromString((char*)nameBin->data), res1);
1101-
#endif
1102-
break;
1103-
}
1104-
case t_dict:
1105-
{
1106-
getdns_dict* subdict = NULL;
1107-
getdns_dict_get_dict(dict, (char*)nameBin->data, &subdict);
1108-
PyObject* rl1 = convertToDict(subdict);
1109-
PyObject *res1 = Py_BuildValue("O", rl1);
1110-
#if PY_MAJOR_VERSION >= 3
1111-
PyDict_SetItem(resultslist, PyUnicode_FromString((char*)nameBin->data), res1);
1112-
#else
1113-
PyDict_SetItem(resultslist, PyString_FromString((char*)nameBin->data), res1);
1114-
#endif
1115-
break;
1116-
}
1117-
case t_list:
1118-
{
1119-
getdns_list* list = NULL;
1120-
getdns_dict_get_list(dict, (char*)nameBin->data, &list);
1121-
PyObject* rl1 = convertToList(list);
1122-
#if PY_MAJOR_VERSION >= 3
1123-
PyDict_SetItem(resultslist, PyUnicode_FromString((char*)nameBin->data), rl1);
1124-
#else
1125-
PyDict_SetItem(resultslist, PyString_FromString((char*)nameBin->data), rl1);
1126-
#endif
1127-
break;
1128-
}
1129-
default:
1130-
break;
1131-
}
1132-
}
1133-
1134-
getdns_list_destroy(names);
1135-
1136-
return resultslist;
1137-
}
11381062

result.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ result_init(getdns_ResultObject *self, PyObject *args, PyObject *keywds)
6161
Py_DECREF(self);
6262
return -1;
6363
}
64-
if ((self->replies_full = getFullResponse(result_dict)) == NULL) {
64+
if ((self->replies_full = gdict_to_pdict(result_dict)) == NULL) {
6565
Py_DECREF(self);
6666
return -1;
6767
}

0 commit comments

Comments
 (0)