Commit 78eed2a48453c66c34336fc33a13fb9de91e8241
1 parent
3af05c1f
Exists in
master
Fixing segfaults on session creation error.
Showing
5 changed files
with
156 additions
and
44 deletions
Show diff stats
src/native/get.cc
... | ... | @@ -37,6 +37,11 @@ |
37 | 37 | * |
38 | 38 | */ |
39 | 39 | int tn3270_get_version(h3270::session *ses, char* str, int strlen) { |
40 | + | |
41 | + if(!ses) { | |
42 | + return -1; | |
43 | + } | |
44 | + | |
40 | 45 | try { |
41 | 46 | strncpy(str,ses->get_version().c_str(),strlen); |
42 | 47 | } catch(std::exception &e) { |
... | ... | @@ -52,6 +57,10 @@ |
52 | 57 | */ |
53 | 58 | int tn3270_get_revision(h3270::session *ses, char* str, int strlen) { |
54 | 59 | |
60 | + if(!ses) { | |
61 | + return -1; | |
62 | + } | |
63 | + | |
55 | 64 | try { |
56 | 65 | strncpy(str,ses->get_revision().c_str(),strlen); |
57 | 66 | } catch(std::exception &e) { |
... | ... | @@ -63,6 +72,10 @@ |
63 | 72 | |
64 | 73 | int tn3270_get_cstate(h3270::session *ses) { |
65 | 74 | |
75 | + if(!ses) { | |
76 | + return -1; | |
77 | + } | |
78 | + | |
66 | 79 | trace_to_file("%s: %d",__FUNCTION__,(int) ses->get_cstate()); |
67 | 80 | |
68 | 81 | try { |
... | ... | @@ -76,6 +89,10 @@ |
76 | 89 | |
77 | 90 | int tn3270_get_program_message(h3270::session *ses) { |
78 | 91 | |
92 | + if(!ses) { | |
93 | + return -1; | |
94 | + } | |
95 | + | |
79 | 96 | try { |
80 | 97 | return (int) ses->get_program_message(); |
81 | 98 | } catch(std::exception &e) { |
... | ... | @@ -86,6 +103,11 @@ |
86 | 103 | } |
87 | 104 | |
88 | 105 | int tn3270_get_secure(h3270::session *ses) { |
106 | + | |
107 | + if(!ses) { | |
108 | + return -1; | |
109 | + } | |
110 | + | |
89 | 111 | try { |
90 | 112 | return (int) ses->get_secure(); |
91 | 113 | } catch(std::exception &e) { |
... | ... | @@ -97,6 +119,10 @@ |
97 | 119 | |
98 | 120 | int tn3270_get_width(h3270::session *ses) { |
99 | 121 | |
122 | + if(!ses) { | |
123 | + return 0; | |
124 | + } | |
125 | + | |
100 | 126 | try { |
101 | 127 | return (int) ses->get_width(); |
102 | 128 | } catch(std::exception &e) { |
... | ... | @@ -108,6 +134,10 @@ |
108 | 134 | |
109 | 135 | int tn3270_get_height(h3270::session *ses) { |
110 | 136 | |
137 | + if(!ses) { | |
138 | + return 0; | |
139 | + } | |
140 | + | |
111 | 141 | try { |
112 | 142 | return (int) ses->get_height(); |
113 | 143 | } catch(std::exception &e) { |
... | ... | @@ -119,6 +149,10 @@ |
119 | 149 | |
120 | 150 | int tn3270_get_length(h3270::session *ses) { |
121 | 151 | |
152 | + if(!ses) { | |
153 | + return 0; | |
154 | + } | |
155 | + | |
122 | 156 | try { |
123 | 157 | return (int) ses->get_length(); |
124 | 158 | } catch(std::exception &e) { |
... | ... | @@ -130,25 +164,33 @@ |
130 | 164 | |
131 | 165 | int tn3270_get_cursor_addr(h3270::session *ses) { |
132 | 166 | |
133 | - try { | |
134 | - return (int) ses->get_cursor_addr(); | |
135 | - } catch(std::exception &e) { | |
136 | - tn3270_lasterror = e.what(); | |
137 | - } | |
167 | + if(ses) { | |
168 | + | |
169 | + try { | |
170 | + return (int) ses->get_cursor_addr(); | |
171 | + } catch(std::exception &e) { | |
172 | + tn3270_lasterror = e.what(); | |
173 | + } | |
174 | + | |
175 | + } | |
138 | 176 | return -1; |
139 | 177 | |
140 | 178 | } |
141 | 179 | |
142 | 180 | int tn3270_get_url(h3270::session *ses, char* str, int strlen) { |
143 | 181 | |
144 | - try { | |
182 | + if(ses) { | |
145 | 183 | |
146 | - strncpy(str,ses->get_url().c_str(),strlen); | |
147 | - return 0; | |
184 | + try { | |
148 | 185 | |
149 | - } catch(std::exception &e) { | |
150 | - tn3270_lasterror = e.what(); | |
151 | - } | |
186 | + strncpy(str,ses->get_url().c_str(),strlen); | |
187 | + return 0; | |
188 | + | |
189 | + } catch(std::exception &e) { | |
190 | + tn3270_lasterror = e.what(); | |
191 | + } | |
192 | + | |
193 | + } | |
152 | 194 | return -1; |
153 | 195 | |
154 | 196 | } | ... | ... |
src/native/init.cc
src/native/network.cc
... | ... | @@ -32,57 +32,91 @@ |
32 | 32 | /*---[ Implement ]----------------------------------------------------------------------------------*/ |
33 | 33 | |
34 | 34 | int tn3270_connect(h3270::session *ses, const char *host, time_t wait) { |
35 | - try { | |
36 | - debug("%s(%s,%d)",__FUNCTION__,host,(int) wait); | |
37 | - return ses->connect(host,wait); | |
38 | - } catch(std::exception &e) { | |
39 | - tn3270_lasterror = e.what(); | |
35 | + | |
36 | + if(ses) { | |
37 | + | |
38 | + try { | |
39 | + debug("%s(%s,%d)",__FUNCTION__,host,(int) wait); | |
40 | + return ses->connect(host,wait); | |
41 | + } catch(std::exception &e) { | |
42 | + tn3270_lasterror = e.what(); | |
43 | + } | |
44 | + | |
40 | 45 | } |
46 | + | |
41 | 47 | return -1; |
42 | 48 | } |
43 | 49 | |
44 | 50 | int tn3270_disconnect(h3270::session *ses) { |
45 | - try { | |
46 | - return ses->disconnect(); | |
47 | - } catch(std::exception &e) { | |
48 | - tn3270_lasterror = e.what(); | |
51 | + | |
52 | + if(ses) { | |
53 | + | |
54 | + try { | |
55 | + return ses->disconnect(); | |
56 | + } catch(std::exception &e) { | |
57 | + tn3270_lasterror = e.what(); | |
58 | + } | |
59 | + | |
49 | 60 | } |
61 | + | |
50 | 62 | return -1; |
51 | 63 | } |
52 | 64 | |
53 | 65 | int tn3270_is_connected(h3270::session *ses) { |
54 | - try { | |
55 | - return (int) ses->is_connected(); | |
56 | - } catch(std::exception &e) { | |
57 | - tn3270_lasterror = e.what(); | |
66 | + | |
67 | + if(ses) { | |
68 | + | |
69 | + try { | |
70 | + return (int) ses->is_connected(); | |
71 | + } catch(std::exception &e) { | |
72 | + tn3270_lasterror = e.what(); | |
73 | + } | |
74 | + | |
58 | 75 | } |
76 | + | |
59 | 77 | return -1; |
60 | 78 | } |
61 | 79 | |
62 | 80 | int tn3270_is_ready(h3270::session *ses) { |
63 | - try { | |
64 | - return (int) ses->is_ready(); | |
65 | - } catch(std::exception &e) { | |
66 | - tn3270_lasterror = e.what(); | |
81 | + | |
82 | + if(ses) { | |
83 | + | |
84 | + try { | |
85 | + return (int) ses->is_ready(); | |
86 | + } catch(std::exception &e) { | |
87 | + tn3270_lasterror = e.what(); | |
88 | + } | |
89 | + | |
67 | 90 | } |
91 | + | |
68 | 92 | return -1; |
69 | 93 | } |
70 | 94 | |
71 | 95 | int tn3270_wait_for_ready(h3270::session *ses, int seconds) { |
72 | - try { | |
73 | - return (int) ses->wait_for_ready(seconds); | |
74 | - } catch(std::exception &e) { | |
75 | - tn3270_lasterror = e.what(); | |
96 | + | |
97 | + if(ses) { | |
98 | + | |
99 | + try { | |
100 | + return (int) ses->wait_for_ready(seconds); | |
101 | + } catch(std::exception &e) { | |
102 | + tn3270_lasterror = e.what(); | |
103 | + } | |
104 | + | |
76 | 105 | } |
77 | 106 | return -1; |
78 | 107 | |
79 | 108 | } |
80 | 109 | |
81 | 110 | int tn3270_wait(h3270::session *ses, int seconds) { |
82 | - try { | |
83 | - return (int) ses->wait(seconds); | |
84 | - } catch(std::exception &e) { | |
85 | - tn3270_lasterror = e.what(); | |
111 | + | |
112 | + if(ses) { | |
113 | + | |
114 | + try { | |
115 | + return (int) ses->wait(seconds); | |
116 | + } catch(std::exception &e) { | |
117 | + tn3270_lasterror = e.what(); | |
118 | + } | |
119 | + | |
86 | 120 | } |
87 | 121 | return -1; |
88 | 122 | } | ... | ... |
src/native/screen.cc
... | ... | @@ -33,6 +33,10 @@ |
33 | 33 | |
34 | 34 | int tn3270_get_contents(h3270::session *ses, char* str, int sz) { |
35 | 35 | |
36 | + if(!ses) { | |
37 | + return -1; | |
38 | + } | |
39 | + | |
36 | 40 | try { |
37 | 41 | |
38 | 42 | std::string contents = ses->get_contents(); |
... | ... | @@ -55,6 +59,10 @@ int tn3270_get_contents(h3270::session *ses, char* str, int sz) { |
55 | 59 | |
56 | 60 | int tn3270_get_string(h3270::session *ses, int addr, char* str, int strlen) { |
57 | 61 | |
62 | + if(!ses) { | |
63 | + return -1; | |
64 | + } | |
65 | + | |
58 | 66 | try { |
59 | 67 | memset(str,0,strlen); |
60 | 68 | strncpy(str,ses->get_string(addr,strlen).c_str(),strlen); |
... | ... | @@ -67,6 +75,11 @@ int tn3270_get_string(h3270::session *ses, int addr, char* str, int strlen) { |
67 | 75 | } |
68 | 76 | |
69 | 77 | int tn3270_get_string_at(h3270::session *ses, int row, int col, char* str, int sz) { |
78 | + | |
79 | + if(!ses) { | |
80 | + return -1; | |
81 | + } | |
82 | + | |
70 | 83 | try { |
71 | 84 | memset(str,0,sz+1); |
72 | 85 | strncpy(str,ses->get_string_at(row,col,sz).c_str(),sz); |
... | ... | @@ -79,6 +92,11 @@ int tn3270_get_string_at(h3270::session *ses, int row, int col, char* str, int s |
79 | 92 | } |
80 | 93 | |
81 | 94 | int tn3270_set_string_at(h3270::session *ses, int row, int col, const char* str) { |
95 | + | |
96 | + if(!ses) { | |
97 | + return -1; | |
98 | + } | |
99 | + | |
82 | 100 | try { |
83 | 101 | trace_to_file("%s(%d,%d):\n%s\n",__FUNCTION__,row,col,str); |
84 | 102 | debug("%s(%d,%d,\"%s\")",__FUNCTION__,row,col,str); |
... | ... | @@ -91,20 +109,32 @@ int tn3270_set_string_at(h3270::session *ses, int row, int col, const char* str) |
91 | 109 | } |
92 | 110 | |
93 | 111 | int tn3270_wait_for_string_at(h3270::session *ses, int row, int col, const char *key, int timeout) { |
94 | - try { | |
95 | - return ses->wait_for_string_at(row,col,key,timeout); | |
96 | - } catch(std::exception &e) { | |
97 | - tn3270_lasterror = e.what(); | |
112 | + | |
113 | + if(ses) { | |
114 | + | |
115 | + try { | |
116 | + return ses->wait_for_string_at(row,col,key,timeout); | |
117 | + } catch(std::exception &e) { | |
118 | + tn3270_lasterror = e.what(); | |
119 | + } | |
120 | + | |
98 | 121 | } |
122 | + | |
99 | 123 | return -1; |
100 | 124 | |
101 | 125 | } |
102 | 126 | |
103 | 127 | int tn3270_cmp_string_at(h3270::session *ses, int row, int col, const char* str) { |
104 | - try { | |
105 | - return ses->cmp_string_at(row,col,str); | |
106 | - } catch(std::exception &e) { | |
107 | - tn3270_lasterror = e.what(); | |
128 | + | |
129 | + if(ses) { | |
130 | + | |
131 | + try { | |
132 | + return ses->cmp_string_at(row,col,str); | |
133 | + } catch(std::exception &e) { | |
134 | + tn3270_lasterror = e.what(); | |
135 | + } | |
136 | + | |
108 | 137 | } |
138 | + | |
109 | 139 | return -1; |
110 | 140 | } | ... | ... |
src/native/set.cc
... | ... | @@ -62,6 +62,11 @@ int tn3270_set_cursor_addr(h3270::session *ses, int addr) { |
62 | 62 | } |
63 | 63 | |
64 | 64 | int tn3270_set_charset(h3270::session *ses, const char* str) { |
65 | + | |
66 | + if(!ses) { | |
67 | + return EINVAL; | |
68 | + } | |
69 | + | |
65 | 70 | try { |
66 | 71 | trace_to_file("%s: \"%s\" -> \"%s\"",__FUNCTION__,ses->get_display_charset().c_str(),str); |
67 | 72 | ses->set_display_charset(NULL, str); | ... | ... |