Commit 78eed2a48453c66c34336fc33a13fb9de91e8241

Authored by Perry Werneck
1 parent 3af05c1f
Exists in master

Fixing segfaults on session creation error.

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
... ... @@ -49,6 +49,7 @@
49 49 return h3270::session::create(name);
50 50 } catch(std::exception &e) {
51 51 tn3270_lasterror = e.what();
  52 + trace_to_file("%s(%s)",__FUNCTION__,e.what());
52 53 }
53 54 return nullptr;
54 55 }
... ...
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);
... ...