Skip to content

Commit b2f6e88

Browse files
committed
Fixed userarg bug
1 parent 5c7f132 commit b2f6e88

File tree

2 files changed

+25
-20
lines changed

2 files changed

+25
-20
lines changed

getdns.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,11 @@ callback_shim(getdns_context *context, getdns_callback_type_t type, getdns_dict
173173
return;
174174
/* need to throw exceptiion XXX */
175175
}
176-
177176
/* Python callback prototype: */
178177
/* callback(context, callback_type, response, userarg, tid) */
179178
state = PyGILState_Ensure();
180-
PyObject_CallFunction(getdns_runner, "OHOsl", context, type, response,
181-
callback_data->userarg, tid);
179+
PyObject_CallFunction(getdns_runner, "OHOsi", context, type, response,
180+
callback_data->userarg, (int)tid);
182181
PyGILState_Release(state);
183182
}
184183

@@ -255,7 +254,7 @@ dispatch_query(PyObject *context_capsule,
255254
uint16_t request_type,
256255
PyDictObject *extensions_obj,
257256
void *userarg,
258-
long tid,
257+
int tid,
259258
char *callback)
260259

261260
{
@@ -346,7 +345,6 @@ dispatch_query(PyObject *context_capsule,
346345
return NULL;
347346
}
348347

349-
callback_data->userarg = userarg;
350348
if ((ret = getdns_extension_set_libevent_base(context, gen_event_base)) != GETDNS_RETURN_GOOD) {
351349
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
352350
return NULL;
@@ -409,6 +407,7 @@ do_query(PyObject *context_capsule,
409407
PyObject *getdns_runner;
410408
pthread_t runner_thread;
411409
pygetdns_async_args_blob *async_blob;
410+
char *u;
412411

413412
if ((main_module = PyImport_AddModule("__main__")) == 0) {
414413
PyErr_SetString(getdns_error, "No __main__");
@@ -423,16 +422,18 @@ do_query(PyObject *context_capsule,
423422
async_blob = (pygetdns_async_args_blob *)malloc(sizeof(pygetdns_async_args_blob));
424423
async_blob->context_capsule = context_capsule;
425424
async_blob->name = malloc(256); /* XXX magic number */
426-
strncpy(async_blob->name, name, strlen(name));
425+
strncpy(async_blob->name, name, strlen(name)+1);
427426
async_blob->type = request_type;
428427
async_blob->extensions = extensions_obj;
429-
async_blob->userarg = userarg;
428+
async_blob->userarg = (pygetdns_libevent_callback_data *)malloc(sizeof(pygetdns_libevent_callback_data));
429+
u = malloc(1024);
430+
strncpy(u, userarg, strlen(userarg)+1);
431+
async_blob->userarg->userarg = u;
430432
async_blob->tid = tid;
431433
async_blob->callback = malloc(256); /* XXX magic number */
432434
strncpy(async_blob->callback, callback, strlen(callback));
433435
async_blob->runner = getdns_runner;
434436
async_blob->userarg->callback_func = getdns_runner;
435-
436437
Py_BEGIN_ALLOW_THREADS;
437438
pthread_create(&runner_thread, NULL, (void *)marshall_query, (void *)async_blob);
438439
pthread_detach(runner_thread);

pygetdns.h

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ typedef struct pygetdns_libevent_callback_data {
4545
} pygetdns_libevent_callback_data;
4646

4747

48+
typedef struct pygetdns_async_args_blob {
49+
PyObject *context_capsule;
50+
PyObject *runner;
51+
uint16_t type;
52+
PyDictObject *extensions;
53+
getdns_transaction_t tid;
54+
char *callback;
55+
pygetdns_libevent_callback_data *userarg;
56+
char *name;
57+
} pygetdns_async_args_blob;
58+
59+
4860
typedef struct {
4961
PyObject_HEAD
5062
PyObject *py_context; /* Python capsule containing getdns_context */
@@ -68,17 +80,6 @@ typedef struct {
6880
char *version_string;
6981
} getdns_ContextObject;
7082

71-
typedef struct pygetdns_async_args_blob {
72-
PyObject *context_capsule;
73-
PyObject *runner;
74-
char *name;
75-
uint16_t type;
76-
PyDictObject *extensions;
77-
pygetdns_libevent_callback_data *userarg;
78-
getdns_transaction_t tid;
79-
char *callback;
80-
} pygetdns_async_args_blob;
81-
8283

8384
int context_init(getdns_ContextObject *self, PyObject *args, PyObject *keywds);
8485
PyObject *context_getattro(PyObject *self, PyObject *nameobj);
@@ -123,6 +124,9 @@ PyObject *context_process_async(PyObject *self, PyObject *args, PyObject *keywds
123124
getdns_dict *getdnsify_addressdict(PyObject *pydict);
124125
void context_dealloc(getdns_ContextObject *self);
125126
void marshall_query(pygetdns_async_args_blob *blog);
127+
PyObject *dispatch_query(PyObject *context_capsule, void *name, uint16_t request_type,
128+
PyDictObject *extensions_obj, void *userarg, int tid, char *callback);
129+
#if 0
126130
PyObject *dispatch_query(PyObject *context_capsule, void *name, uint16_t request_type,
127131
PyDictObject *extensions_obj, void *userarg, long tid, char *callback);
128-
132+
#endif

0 commit comments

Comments
 (0)