Skip to content

Commit 329193f

Browse files
committed
Merge branch 'develop'
Merging changes to convertBinData to return typed PyObject.
2 parents e7a574f + 2e7d58f commit 329193f

File tree

1 file changed

+58
-18
lines changed

1 file changed

+58
-18
lines changed

pygetdns_util.c

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,8 @@ priv_getdns_bindata_is_dname(struct getdns_bindata *bindata)
296296
// Convert bindata into a good representational string or
297297
// into a buffer. Handles dname, printable, ".",
298298
// and an ip address if it is under a known key
299-
char*
299+
300+
PyObject *
300301
convertBinData(getdns_bindata* data,
301302
const char* key) {
302303

@@ -316,30 +317,72 @@ convertBinData(getdns_bindata* data,
316317
}
317318
// basic string?
318319
if (printable == 1) {
319-
return (char*) data->data;
320+
PyObject *a_string;
321+
322+
if ((a_string = PyString_FromString((char *)data->data)) == NULL) {
323+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
324+
return NULL;
325+
}
326+
return(a_string);
320327
}
321328

322329
// the root
323330
if (data->size == 1 && data->data[0] == 0) {
324-
return ".";
331+
PyObject *a_string;
332+
333+
if ((a_string = PyString_FromString(".")) == NULL) {
334+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
335+
return NULL;
336+
}
337+
return(a_string);
325338
}
339+
326340
// dname
327341
if (priv_getdns_bindata_is_dname(data)) {
328342
char* dname = NULL;
343+
PyObject *dname_string;
344+
329345
if (getdns_convert_dns_name_to_fqdn(data, &dname)
330346
== GETDNS_RETURN_GOOD) {
331-
return dname;
347+
if ((dname_string = PyString_FromString(dname)) != NULL) {
348+
return(dname_string);
349+
} else {
350+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
351+
return NULL;
352+
}
353+
} else {
354+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
355+
return NULL;
332356
}
333-
// ip address
334357
} else if (key != NULL &&
335358
(strcmp(key, "ipv4_address") == 0 ||
336359
strcmp(key, "ipv6_address") == 0)) {
337360
char* ipStr = getdns_display_ip_address(data);
338361
if (ipStr) {
339-
return ipStr;
362+
PyObject *addr_string;
363+
if ((addr_string = PyString_FromString(ipStr)) == NULL) {
364+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
365+
return NULL;
366+
}
367+
return(addr_string);
368+
}
369+
} else { /* none of the above, treat it like a blob */
370+
#if 0
371+
Py_buffer pybuf;
372+
#endif
373+
uint8_t *blob = (uint8_t *)malloc(data->size);
374+
375+
memcpy(blob, data->data, data->size);
376+
return (PyBuffer_FromMemory(blob, (Py_ssize_t)data->size));
377+
#if 0
378+
if (PyBuffer_FillInfo(&pybuf, 0, blob, data->size, false, PyBUF_CONTIG) < 0) {
379+
PyErr_SetString(getdns_error, "PyBuffer_FillInfo failed\n");
380+
return NULL;
340381
}
382+
return PyMemoryView_FromBuffer(&pybuf);
383+
#endif
341384
}
342-
return (char*)data->data;
385+
return NULL; /* should never get here .. */
343386
}
344387

345388
char*
@@ -382,10 +425,8 @@ convertToDict(struct getdns_dict* dict) {
382425
{
383426
getdns_bindata* data = NULL;
384427
getdns_dict_get_bindata(dict, (char*)nameBin->data, &data);
385-
char* res = convertBinData(data, (char*)nameBin->data);
386-
PyObject *rl1 = Py_BuildValue("s", res);
387-
PyObject *res1 = Py_BuildValue("O", rl1);
388-
PyDict_SetItem(resultsdict1, PyString_FromString((char*) nameBin->data), res1);
428+
PyObject* res = convertBinData(data, (char*)nameBin->data);
429+
PyDict_SetItem(resultsdict1, PyString_FromString((char*) nameBin->data), res);
389430
break;
390431
}
391432
case t_int:
@@ -412,7 +453,8 @@ convertToDict(struct getdns_dict* dict) {
412453
getdns_dict_get_list(dict, (char*)nameBin->data, &list);
413454
PyObject *rl1 = convertToList(list);
414455
PyObject *res1 = Py_BuildValue("O", rl1);
415-
PyDict_SetItem(resultsdict1, PyString_FromString((char*) nameBin->data), res1);
456+
PyObject *key = PyString_FromString((char *)nameBin->data);
457+
PyDict_SetItem(resultsdict1, key, res1);
416458
break;
417459
}
418460
default:
@@ -449,10 +491,9 @@ convertToList(struct getdns_list* list) {
449491
{
450492
getdns_bindata* data = NULL;
451493
getdns_list_get_bindata(list, i, &data);
452-
char* res = convertBinData(data, NULL);
494+
PyObject* res = convertBinData(data, NULL);
453495
if (res) {
454-
PyObject* res1 = Py_BuildValue("s", res);
455-
PyList_Append(resultslist1, res1);
496+
PyList_Append(resultslist1, res);
456497
} else {
457498

458499
PyObject* res1 = Py_BuildValue("s", "empty");
@@ -541,10 +582,9 @@ getFullResponse(struct getdns_dict *dict)
541582
{
542583
getdns_bindata* data = NULL;
543584
getdns_dict_get_bindata(dict, (char*)nameBin->data, &data);
544-
char* res = convertBinData(data, (char*)nameBin->data);
585+
PyObject *res = convertBinData(data, (char*)nameBin->data);
545586
if (res) {
546-
PyObject* res1 = Py_BuildValue("s", convertBinData(data, (char*)nameBin->data));
547-
PyDict_SetItem(resultslist, PyString_FromString((char*)nameBin->data), res1);
587+
PyDict_SetItem(resultslist, PyString_FromString((char*)nameBin->data), res);
548588
} else {
549589
PyObject* res1 = Py_BuildValue("s", "empty");
550590
PyDict_SetItem(resultslist, PyString_FromString((char*)nameBin->data), res1);

0 commit comments

Comments
 (0)