Allocate zereod memory for struct python_callbacks

Otherwise Py_XDECREF() would randomly segfault trying to use
uninitialized memory that by chance is not zeroed.
pull/1836/head
Daniele Forsi IU5HKX 2025-08-08 23:36:38 +02:00
rodzic 3bc1cc8744
commit 9e1c7b5ec1
3 zmienionych plików z 51 dodań i 32 usunięć

Wyświetl plik

@ -68,7 +68,6 @@
%rename("%s", regexmatch$name="^RIG_VFO_") "";
%ignore RIG_EK; // an internal macro
%ignore RIG_ELAD; // an internal macro
%rename("$ignore", regexmatch$name="python_callbacks$") ""; // internal structs and methods used by bindings
// Rotators
@ -112,6 +111,8 @@
%ignore PRIfreq;
%ignore SCNfreq;
%rename("$ignore", regexmatch$name="python_callbacks") ""; // internal structs and methods used by bindings
#ifdef SWIGLUA
%ignore Rig::set_level(setting_t,int,vfo_t);
%ignore Rig::set_ext_level(setting_t,value_t,vfo_t);

Wyświetl plik

@ -122,13 +122,13 @@ void set_ ## event_name ## _callback(PyObject *cb, PyObject *arg=NULL)
};
Py_XINCREF(cb);
Py_XDECREF(self->python_callbacks. ## event_name ## _event);
Py_XDECREF(self->python_callbacks-> ## event_name ## _event);
Py_XINCREF(arg);
Py_XDECREF(self->python_callbacks. ## event_name ## _arg);
Py_XDECREF(self->python_callbacks-> ## event_name ## _arg);
self->python_callbacks. ## event_name ## _event = cb;
self->python_callbacks. ## event_name ## _arg = arg;
self->python_callbacks-> ## event_name ## _event = cb;
self->python_callbacks-> ## event_name ## _arg = arg;
self->error_status = function_prefix ## set_ ## event_name ## _callback(class_pointer, callback, self);
return;

Wyświetl plik

@ -45,16 +45,9 @@
#pragma SWIG nowarn=451
typedef struct Rig {
RIG *rig;
struct rig_caps *caps; /* shortcut to RIG->caps */
struct rig_state *state; /* shortcut to RIG->state */
int error_status;
int do_exception;
// Handling of event callbacks
#ifdef SWIGPYTHON
// This mirrors "struct rig_callbacks" from rig.h using Python types
struct {
typedef struct {
PyObject *freq_event; /*!< Frequency change event */
PyObject *freq_arg; /*!< Frequency change argument */
PyObject *mode_event; /*!< Mode change event */
@ -70,7 +63,17 @@ typedef struct Rig {
PyObject *spectrum_event; /*!< Spectrum line reception event */
PyObject *spectrum_arg; /*!< Spectrum line reception argument */
/* etc.. */
} python_callbacks;
} python_callbacks_t;
#endif
typedef struct Rig {
RIG *rig;
struct rig_caps *caps; /* shortcut to RIG->caps */
struct rig_state *state; /* shortcut to RIG->state */
int error_status;
int do_exception;
#ifdef SWIGPYTHON
python_callbacks_t *python_callbacks;
#endif
} Rig;
@ -87,10 +90,10 @@ int *rig_freq_cb_python(RIG *rig, vfo_t vfo, freq_t freq, rig_ptr_t arg)
python_arguments = PyTuple_Pack(3,
PyLong_FromLong(vfo),
PyFloat_FromDouble(freq),
self->python_callbacks.freq_arg
self->python_callbacks->freq_arg
);
PyObject_CallObject(self->python_callbacks.freq_event, python_arguments);
PyObject_CallObject(self->python_callbacks->freq_event, python_arguments);
Py_XDECREF(python_arguments);
return RIG_OK;
@ -105,10 +108,10 @@ int *rig_mode_cb_python(RIG *rig, vfo_t vfo, rmode_t rmode, pbwidth_t pbwidth, r
PyLong_FromLong(vfo),
PyLong_FromLong(rmode),
PyLong_FromLong(pbwidth),
self->python_callbacks.mode_arg
self->python_callbacks->mode_arg
);
PyObject_CallObject(self->python_callbacks.mode_event, python_arguments);
PyObject_CallObject(self->python_callbacks->mode_event, python_arguments);
Py_XDECREF(python_arguments);
@ -120,11 +123,12 @@ int *rig_vfo_cb_python(RIG *rig, vfo_t vfo, rig_ptr_t arg)
Rig *self = arg;
PyObject *python_arguments;
python_arguments = PyTuple_Pack(1,
self->python_callbacks.vfo_arg
python_arguments = PyTuple_Pack(2,
PyLong_FromLong(vfo),
self->python_callbacks->vfo_arg
);
PyObject_CallObject(self->python_callbacks.vfo_event, python_arguments);
PyObject_CallObject(self->python_callbacks->vfo_event, python_arguments);
Py_XDECREF(python_arguments);
@ -136,27 +140,31 @@ int *rig_ptt_cb_python(RIG *rig, vfo_t vfo, ptt_t ptt, rig_ptr_t arg)
Rig *self = arg;
PyObject *python_arguments;
python_arguments = PyTuple_Pack(1,
self->python_callbacks.ptt_arg
python_arguments = PyTuple_Pack(3,
PyLong_FromLong(vfo),
PyLong_FromLong(ptt),
self->python_callbacks->ptt_arg
);
PyObject_CallObject(self->python_callbacks.ptt_event, python_arguments);
PyObject_CallObject(self->python_callbacks->ptt_event, python_arguments);
Py_XDECREF(python_arguments);
return RIG_OK;
}
int *rig_dcd_cb_python(RIG *rig, vfo_t vfo, dcd_t, rig_ptr_t arg)
int *rig_dcd_cb_python(RIG *rig, vfo_t vfo, dcd_t dcd, rig_ptr_t arg)
{
Rig *self = arg;
PyObject *python_arguments;
python_arguments = PyTuple_Pack(1,
self->python_callbacks.dcd_arg
python_arguments = PyTuple_Pack(3,
PyLong_FromLong(vfo),
PyLong_FromLong(dcd),
self->python_callbacks->dcd_arg
);
PyObject_CallObject(self->python_callbacks.dcd_event, python_arguments);
PyObject_CallObject(self->python_callbacks->dcd_event, python_arguments);
Py_XDECREF(python_arguments);
@ -169,10 +177,10 @@ int *rig_pltune_cb_python(RIG *rig, vfo_t vfo, freq_t *freq, rmode_t *rmode, pbw
PyObject *python_arguments;
python_arguments = PyTuple_Pack(1,
self->python_callbacks.pltune_arg
self->python_callbacks->pltune_arg
);
PyObject_CallObject(self->python_callbacks.pltune_event, python_arguments);
PyObject_CallObject(self->python_callbacks->pltune_event, python_arguments);
Py_XDECREF(python_arguments);
@ -185,10 +193,10 @@ int *rig_spectrum_cb_python(RIG *rig, struct rig_spectrum_line *rig_spectrum_lin
PyObject *python_arguments;
python_arguments = PyTuple_Pack(1,
self->python_callbacks.spectrum_arg
self->python_callbacks->spectrum_arg
);
PyObject_CallObject(self->python_callbacks.spectrum_event, python_arguments);
PyObject_CallObject(self->python_callbacks->spectrum_event, python_arguments);
Py_XDECREF(python_arguments);
@ -468,6 +476,13 @@ int *rig_spectrum_cb_python(RIG *rig, struct rig_spectrum_line *rig_spectrum_lin
free(r);
return NULL;
}
#ifdef SWIGPYTHON
r->python_callbacks = calloc(1, sizeof(python_callbacks_t));
if (!r->python_callbacks) {
free(r);
return NULL;
}
#endif
/* install shortcuts */
r->caps = r->rig->caps;
r->state = &r->rig->state;
@ -478,6 +493,9 @@ int *rig_spectrum_cb_python(RIG *rig, struct rig_spectrum_line *rig_spectrum_lin
}
~Rig () {
rig_cleanup(self->rig);
#ifdef SWIGPYTHON
free(self->python_callbacks);
#endif
free(self);
}