Commit d9638802e6c0f3353f3430e561b97485863c82de
1 parent
20b6613c
Exists in
master
Fixing segfault when the action create method fails.
Showing
2 changed files
with
24 additions
and
7 deletions
Show diff stats
src/action/new.cc
@@ -42,13 +42,27 @@ | @@ -42,13 +42,27 @@ | ||
42 | DLL_PRIVATE PyObject * py3270_action_new_from_session(PyObject *session, void *action) { | 42 | DLL_PRIVATE PyObject * py3270_action_new_from_session(PyObject *session, void *action) { |
43 | 43 | ||
44 | pyAction * pObj = (pyAction *) _PyObject_New(&py3270_action_type); | 44 | pyAction * pObj = (pyAction *) _PyObject_New(&py3270_action_type); |
45 | - | 45 | + pObj->action = nullptr; |
46 | pObj->session = (pySession *) session; | 46 | pObj->session = (pySession *) session; |
47 | - pObj->action = pObj->session->host->getAction((const LIB3270_ACTION *) action); | 47 | + Py_INCREF(pObj->session); |
48 | 48 | ||
49 | - debug("%s: ob_refcnt@%p=%ld",__FUNCTION__,pObj,((PyObject *) pObj)->ob_refcnt); | 49 | + try { |
50 | 50 | ||
51 | - Py_INCREF(pObj->session); | 51 | + pObj->action = pObj->session->host->getAction((const LIB3270_ACTION *) action); |
52 | + | ||
53 | + } catch(const std::exception &e) { | ||
54 | + | ||
55 | + Py_DECREF((PyObject *) pObj); | ||
56 | + PyErr_SetString(PyExc_RuntimeError, e.what()); | ||
57 | + return NULL; | ||
58 | + | ||
59 | + } catch(...) { | ||
60 | + | ||
61 | + Py_DECREF((PyObject *) pObj); | ||
62 | + PyErr_SetString(PyExc_RuntimeError, "Unexpected error creating action object"); | ||
63 | + return NULL; | ||
64 | + | ||
65 | + } | ||
52 | 66 | ||
53 | return (PyObject *) pObj; | 67 | return (PyObject *) pObj; |
54 | 68 | ||
@@ -62,7 +76,9 @@ void py3270_action_dealloc(PyObject * self) { | @@ -62,7 +76,9 @@ void py3270_action_dealloc(PyObject * self) { | ||
62 | 76 | ||
63 | Py_DECREF(pObj->session); | 77 | Py_DECREF(pObj->session); |
64 | 78 | ||
65 | - delete pObj->action; | 79 | + if(pObj->action) |
80 | + delete pObj->action; | ||
81 | + | ||
66 | pObj->action = nullptr; | 82 | pObj->action = nullptr; |
67 | 83 | ||
68 | } | 84 | } |
testprograms/sample.py
@@ -7,7 +7,7 @@ import tn3270 | @@ -7,7 +7,7 @@ import tn3270 | ||
7 | print("Using TN3270 Version " + tn3270.version()) | 7 | print("Using TN3270 Version " + tn3270.version()) |
8 | print(tn3270.revision()) | 8 | print(tn3270.revision()) |
9 | 9 | ||
10 | -session = tn3270.Session("") | 10 | +session = tn3270.Session(":a") |
11 | 11 | ||
12 | print("Using tn3270 version " + session.version + " revision " + session.revision) | 12 | print("Using tn3270 version " + session.version + " revision " + session.revision) |
13 | 13 | ||
@@ -16,6 +16,8 @@ print("Using tn3270 version " + session.version + " revision " + session.revisio | @@ -16,6 +16,8 @@ print("Using tn3270 version " + session.version + " revision " + session.revisio | ||
16 | #print(session.connected) | 16 | #print(session.connected) |
17 | #print(session.url) | 17 | #print(session.url) |
18 | 18 | ||
19 | +print(session.reconnect) | ||
20 | + | ||
19 | # | 21 | # |
20 | # Can reconnect? If yes do it! | 22 | # Can reconnect? If yes do it! |
21 | # | 23 | # |
@@ -23,7 +25,6 @@ if session.reconnect.activatable: | @@ -23,7 +25,6 @@ if session.reconnect.activatable: | ||
23 | print("Reconnecting...") | 25 | print("Reconnecting...") |
24 | session.reconnect().wait(10) | 26 | session.reconnect().wait(10) |
25 | 27 | ||
26 | -print(session.reconnect) | ||
27 | print(session.connected) | 28 | print(session.connected) |
28 | 29 | ||
29 | #print('----------------------') | 30 | #print('----------------------') |