@@ -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 *
300301convertBinData (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
345388char *
@@ -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