Skip to content

Commit 0eed9a6

Browse files
committed
Fixed reference count bug causing heap corruption.
1 parent a829024 commit 0eed9a6

File tree

3 files changed

+51
-15
lines changed

3 files changed

+51
-15
lines changed

keamodule/capsule.cc

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ Logger_debug(LoggerObject *self, PyObject *args) {
4343
if (!PyArg_ParseTuple(args, "s", &msg)) {
4444
return (0);
4545
}
46-
LOG_DEBUG(*kea_logger, DBGLVL_TRACE_BASIC, *kea_message_id).arg(string(msg));
46+
try {
47+
LOG_DEBUG(*kea_logger, DBGLVL_TRACE_BASIC, *kea_message_id).arg(string(msg));
48+
}
49+
catch (const exception &e) {
50+
PyErr_SetString(PyExc_TypeError, e.what());
51+
return (0);
52+
}
4753

4854
Py_RETURN_NONE;
4955
}
@@ -55,7 +61,13 @@ Logger_info(LoggerObject *self, PyObject *args) {
5561
if (!PyArg_ParseTuple(args, "s", &msg)) {
5662
return (0);
5763
}
58-
LOG_INFO(*kea_logger, *kea_message_id).arg(string(msg));
64+
try {
65+
LOG_INFO(*kea_logger, *kea_message_id).arg(string(msg));
66+
}
67+
catch (const exception &e) {
68+
PyErr_SetString(PyExc_TypeError, e.what());
69+
return (0);
70+
}
5971

6072
Py_RETURN_NONE;
6173
}
@@ -67,7 +79,13 @@ Logger_warn(LoggerObject *self, PyObject *args) {
6779
if (!PyArg_ParseTuple(args, "s", &msg)) {
6880
return (0);
6981
}
70-
LOG_WARN(*kea_logger, *kea_message_id).arg(string(msg));
82+
try {
83+
LOG_WARN(*kea_logger, *kea_message_id).arg(string(msg));
84+
}
85+
catch (const exception &e) {
86+
PyErr_SetString(PyExc_TypeError, e.what());
87+
return (0);
88+
}
7189

7290
Py_RETURN_NONE;
7391
}
@@ -80,7 +98,13 @@ Logger_error(LoggerObject *self, PyObject *args) {
8098
if (!PyArg_ParseTuple(args, "s", &msg)) {
8199
return (0);
82100
}
83-
LOG_ERROR(*kea_logger, *kea_message_id).arg(string(msg));
101+
try {
102+
LOG_ERROR(*kea_logger, *kea_message_id).arg(string(msg));
103+
}
104+
catch (const exception &e) {
105+
PyErr_SetString(PyExc_TypeError, e.what());
106+
return (0);
107+
}
84108

85109
Py_RETURN_NONE;
86110
}
@@ -92,7 +116,13 @@ Logger_fatal(LoggerObject *self, PyObject *args) {
92116
if (!PyArg_ParseTuple(args, "s", &msg)) {
93117
return (0);
94118
}
95-
LOG_FATAL(*kea_logger, *kea_message_id).arg(string(msg));
119+
try {
120+
LOG_FATAL(*kea_logger, *kea_message_id).arg(string(msg));
121+
}
122+
catch (const exception &e) {
123+
PyErr_SetString(PyExc_TypeError, e.what());
124+
return (0);
125+
}
96126

97127
Py_RETURN_NONE;
98128
}
@@ -105,22 +135,26 @@ Logger_exception(LoggerObject *self, PyObject *args) {
105135
return (0);
106136
}
107137
PyObject *exc_type, *exc_value, *exc_traceback;
108-
string traceback;
109138
PyErr_GetExcInfo(&exc_type, &exc_value, &exc_traceback);
110-
if (!format_python_traceback(exc_type, exc_value, exc_traceback, traceback)) {
111-
if (strlen(msg) == 0) {
112-
LOG_ERROR(*kea_logger, *kea_message_id).arg(traceback);
139+
try {
140+
string traceback;
141+
// steals reference to exc_* objects
142+
if (!format_python_traceback(exc_type, exc_value, exc_traceback, traceback)) {
143+
if (strlen(msg) == 0) {
144+
LOG_ERROR(*kea_logger, *kea_message_id).arg(traceback);
145+
}
146+
else {
147+
LOG_ERROR(*kea_logger, *kea_message_id).arg(string(msg) + "\n" + traceback);
148+
}
113149
}
114150
else {
115-
LOG_ERROR(*kea_logger, *kea_message_id).arg(string(msg) + "\n" + traceback);
151+
LOG_ERROR(*kea_logger, *kea_message_id).arg(string(msg));
116152
}
117153
}
118-
else {
119-
LOG_ERROR(*kea_logger, *kea_message_id).arg(string(msg));
154+
catch (const exception &e) {
155+
PyErr_SetString(PyExc_TypeError, e.what());
156+
return (0);
120157
}
121-
Py_XDECREF(exc_type);
122-
Py_XDECREF(exc_value);
123-
Py_XDECREF(exc_traceback);
124158

125159
Py_RETURN_NONE;
126160
}

keamodule/errors.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ log_python_traceback() {
103103
string traceback;
104104

105105
PyErr_Fetch(&exc_type, &exc_value, &exc_traceback);
106+
// steals reference to exc_* objects
106107
if (!format_python_traceback(exc_type, exc_value, exc_traceback, traceback)) {
107108
log_error(traceback);
108109
return (0);

keamodule/keamodule.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ extern PyObject *kea_module;
2020
// errors.cc
2121
extern int Errors_initialize();
2222
extern int Errors_finalize();
23+
// steals reference to exc_* objects
2324
extern int format_python_traceback(PyObject *exc_type, PyObject *exc_value, PyObject *exc_traceback, std::string &traceback);
2425
extern int log_python_traceback();
2526

0 commit comments

Comments
 (0)