Commit 9fd81a881469452345d56de8ba28b8794638279c

Authored by perry.werneck@gmail.com
1 parent db9535b4

Corrigindo segfaults aleatorios em windows 64

src/lib3270/screen.c
@@ -264,6 +264,7 @@ void update_model_info(H3270 *session, int model, int cols, int rows) @@ -264,6 +264,7 @@ void update_model_info(H3270 *session, int model, int cols, int rows)
264 /* Update the model name. */ 264 /* Update the model name. */
265 (void) sprintf(session->model_name, "327%c-%d%s",session->m3279 ? '9' : '8',session->model_num,session->extended ? "-E" : ""); 265 (void) sprintf(session->model_name, "327%c-%d%s",session->m3279 ? '9' : '8',session->model_num,session->extended ? "-E" : "");
266 266
  267 + trace("%s: %p",__FUNCTION__,session->update_model);
267 session->update_model(session, session->model_name,session->model_num,rows,cols); 268 session->update_model(session, session->model_name,session->model_num,rows,cols);
268 } 269 }
269 270
@@ -634,7 +635,12 @@ void Error(H3270 *session, const char *fmt, ...) @@ -634,7 +635,12 @@ void Error(H3270 *session, const char *fmt, ...)
634 trace("%s: title=%s fmt=%s",__FUNCTION__,"3270 Error",fmt); 635 trace("%s: title=%s fmt=%s",__FUNCTION__,"3270 Error",fmt);
635 636
636 va_start(arg_ptr, fmt); 637 va_start(arg_ptr, fmt);
637 - popup_handler(session,session->widget,LIB3270_NOTIFY_ERROR, _( "3270 Error" ),NULL,fmt,arg_ptr); 638 +
  639 + if(session && session->sz == sizeof(H3270))
  640 + popup_handler(session,session->widget,LIB3270_NOTIFY_ERROR, _( "3270 Error" ),NULL,fmt,arg_ptr);
  641 + else
  642 + popup_handler(NULL,NULL,LIB3270_NOTIFY_ERROR, _( "3270 Error" ),NULL,fmt,arg_ptr);
  643 +
638 va_end(arg_ptr); 644 va_end(arg_ptr);
639 645
640 } 646 }
src/lib3270/util.c
@@ -167,8 +167,8 @@ char * xs_vsprintf(const char *fmt, va_list args) @@ -167,8 +167,8 @@ char * xs_vsprintf(const char *fmt, va_list args)
167 char *r; 167 char *r;
168 #if defined(HAVE_VASPRINTF) /*[*/ 168 #if defined(HAVE_VASPRINTF) /*[*/
169 (void) vasprintf(&r, fmt, args); 169 (void) vasprintf(&r, fmt, args);
170 - if (r == CN)  
171 - Error("Out of memory"); 170 + if(!r)
  171 + Error(NULL,"Out of memory in %s",__FUNCTION__);
172 return r; 172 return r;
173 #else /*][*/ 173 #else /*][*/
174 char buf[16384]; 174 char buf[16384];
@@ -1098,7 +1098,7 @@ LIB3270_EXPORT void * lib3270_realloc(void *p, int len) @@ -1098,7 +1098,7 @@ LIB3270_EXPORT void * lib3270_realloc(void *p, int len)
1098 { 1098 {
1099 p = realloc(p, len); 1099 p = realloc(p, len);
1100 if(!p) 1100 if(!p)
1101 - Error(NULL,"Out of memory"); 1101 + Error(NULL,"Out of memory in %s",__FUNCTION__);
1102 return p; 1102 return p;
1103 } 1103 }
1104 1104
@@ -1114,7 +1114,7 @@ LIB3270_EXPORT void * lib3270_calloc(int elsize, int nelem, void *ptr) @@ -1114,7 +1114,7 @@ LIB3270_EXPORT void * lib3270_calloc(int elsize, int nelem, void *ptr)
1114 if(ptr) 1114 if(ptr)
1115 memset(ptr,0,sz); 1115 memset(ptr,0,sz);
1116 else 1116 else
1117 - Error(NULL,"Out of memory"); 1117 + Error(NULL,"Out of memory in %s",__FUNCTION__);
1118 1118
1119 return ptr; 1119 return ptr;
1120 } 1120 }
@@ -1127,7 +1127,7 @@ LIB3270_EXPORT void * lib3270_malloc(int len) @@ -1127,7 +1127,7 @@ LIB3270_EXPORT void * lib3270_malloc(int len)
1127 r = malloc(len); 1127 r = malloc(len);
1128 if (r == (char *)NULL) 1128 if (r == (char *)NULL)
1129 { 1129 {
1130 - Error(NULL,"Out of memory"); 1130 + Error(NULL,"Out of memory in %s",__FUNCTION__);
1131 return 0; 1131 return 0;
1132 } 1132 }
1133 1133
@@ -1142,7 +1142,7 @@ void * Calloc(size_t nelem, size_t elsize) @@ -1142,7 +1142,7 @@ void * Calloc(size_t nelem, size_t elsize)
1142 char * r = malloc(sz); 1142 char * r = malloc(sz);
1143 1143
1144 if(!r) 1144 if(!r)
1145 - Error(NULL,"Out of memory"); 1145 + Error(NULL,"Out of memory in %s",__FUNCTION__);
1146 1146
1147 memset(r, 0, sz); 1147 memset(r, 0, sz);
1148 return r; 1148 return r;
src/pw3270/common/config.c
@@ -330,21 +330,19 @@ gchar * get_last_error_msg(void) @@ -330,21 +330,19 @@ gchar * get_last_error_msg(void)
330 #ifdef WIN_REGISTRY_ENABLED 330 #ifdef WIN_REGISTRY_ENABLED
331 331
332 HKEY key_handle; 332 HKEY key_handle;
333 - BYTE data[4096];  
334 - unsigned long datatype;  
335 - unsigned long datalen = sizeof(data);  
336 - gchar *ret = NULL; 333 + BYTE data[4097];
  334 + unsigned long datalen = 4096;
  335 + unsigned long datatype;
  336 + gchar * ret = NULL;
337 337
338 if(!registry_open_key(group,KEY_READ,&key_handle)) 338 if(!registry_open_key(group,KEY_READ,&key_handle))
339 return g_strdup(def); 339 return g_strdup(def);
340 340
341 if(RegQueryValueExA(key_handle,key,NULL,&datatype,data,&datalen) == ERROR_SUCCESS) 341 if(RegQueryValueExA(key_handle,key,NULL,&datatype,data,&datalen) == ERROR_SUCCESS)
342 { 342 {
343 - ret = (char *) malloc(datalen+1);  
344 -  
345 - memcpy(ret,data,datalen);  
346 - ret[datalen+1] = 0;  
347 -// trace("%s\\%s=\"%s\"",group,key,ret); 343 + data[datalen+1] = 0;
  344 + ret = g_strdup(data);
  345 + trace("datalen=%d",datalen);
348 } 346 }
349 else if(def) 347 else if(def)
350 { 348 {
src/pw3270/v3270/widget.c
@@ -220,6 +220,8 @@ void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type , const gchar *t @@ -220,6 +220,8 @@ void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type , const gchar *t
220 GtkMessageType msgtype = GTK_MESSAGE_WARNING; 220 GtkMessageType msgtype = GTK_MESSAGE_WARNING;
221 GtkButtonsType buttons = GTK_BUTTONS_OK; 221 GtkButtonsType buttons = GTK_BUTTONS_OK;
222 222
  223 + trace("%s: widget=%p",__FUNCTION__,widget);
  224 +
223 if(widget && GTK_IS_WIDGET(widget)) 225 if(widget && GTK_IS_WIDGET(widget))
224 toplevel = gtk_widget_get_toplevel(GTK_WIDGET(widget)); 226 toplevel = gtk_widget_get_toplevel(GTK_WIDGET(widget));
225 227
@@ -743,6 +745,8 @@ static void v3270_init(v3270 *widget) @@ -743,6 +745,8 @@ static void v3270_init(v3270 *widget)
743 { 745 {
744 widget->host = lib3270_session_new(""); 746 widget->host = lib3270_session_new("");
745 747
  748 + trace("%s",__FUNCTION__);
  749 +
746 if(widget->host->sz != sizeof(H3270)) 750 if(widget->host->sz != sizeof(H3270))
747 { 751 {
748 g_error( _( "Unexpected signature in H3270 object, possible version mismatch in lib3270") ); 752 g_error( _( "Unexpected signature in H3270 object, possible version mismatch in lib3270") );
@@ -782,6 +786,7 @@ static void v3270_init(v3270 *widget) @@ -782,6 +786,7 @@ static void v3270_init(v3270 *widget)
782 // Setup events 786 // Setup events
783 gtk_widget_add_events(GTK_WIDGET(widget),GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_MOTION_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_ENTER_NOTIFY_MASK); 787 gtk_widget_add_events(GTK_WIDGET(widget),GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_MOTION_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_ENTER_NOTIFY_MASK);
784 788
  789 + trace("%s",__FUNCTION__);
785 } 790 }
786 791
787 GtkWidget * v3270_new(void) 792 GtkWidget * v3270_new(void)
@@ -1133,6 +1138,12 @@ void v3270_set_font_family(GtkWidget *widget, const gchar *name) @@ -1133,6 +1138,12 @@ void v3270_set_font_family(GtkWidget *widget, const gchar *name)
1133 1138
1134 terminal = GTK_V3270(widget); 1139 terminal = GTK_V3270(widget);
1135 1140
  1141 + if(!name)
  1142 + {
  1143 + // TODO (perry#3#): Get default font family from currrent style
  1144 + name = "courier new";
  1145 + }
  1146 +
1136 if(terminal->font_family) 1147 if(terminal->font_family)
1137 { 1148 {
1138 if(!g_strcasecmp(terminal->font_family,name)) 1149 if(!g_strcasecmp(terminal->font_family,name))
@@ -1141,12 +1152,6 @@ void v3270_set_font_family(GtkWidget *widget, const gchar *name) @@ -1141,12 +1152,6 @@ void v3270_set_font_family(GtkWidget *widget, const gchar *name)
1141 terminal->font_family = NULL; 1152 terminal->font_family = NULL;
1142 } 1153 }
1143 1154
1144 - if(!name)  
1145 - {  
1146 - // TODO (perry#3#): Get default font family from currrent style  
1147 - name = "courier new";  
1148 - }  
1149 -  
1150 terminal->font_family = g_strdup(name); 1155 terminal->font_family = g_strdup(name);
1151 terminal->font_weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; 1156 terminal->font_weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL;
1152 1157
src/pw3270/window.c
@@ -126,8 +126,13 @@ @@ -126,8 +126,13 @@
126 return 0; 126 return 0;
127 } 127 }
128 128
129 - static int popup_handler(H3270 *session, void *widget, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list args) 129 + static int popup_handler(H3270 *session, void *terminal, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list args)
130 { 130 {
  131 + GtkWidget *widget = NULL;
  132 +
  133 + if(session && terminal && GTK_IS_V3270(terminal))
  134 + widget = GTK_WIDGET(terminal);
  135 +
131 if(fmt) 136 if(fmt)
132 { 137 {
133 gchar *text = g_strdup_vprintf(fmt,args); 138 gchar *text = g_strdup_vprintf(fmt,args);
@@ -138,52 +143,6 @@ @@ -138,52 +143,6 @@
138 { 143 {
139 v3270_popup_message(GTK_WIDGET(widget),type,title,msg,NULL); 144 v3270_popup_message(GTK_WIDGET(widget),type,title,msg,NULL);
140 } 145 }
141 -/*  
142 - GtkWidget * dialog;  
143 - GtkWidget * toplevel = NULL;  
144 - GtkMessageType msgtype = GTK_MESSAGE_WARNING;  
145 - GtkButtonsType buttons = GTK_BUTTONS_OK;  
146 - gchar * text = NULL;  
147 -  
148 - if(fmt)  
149 - text = g_strdup_vprintf(fmt,args);  
150 -  
151 - if(widget && GTK_IS_WIDGET(widget))  
152 - toplevel = gtk_widget_get_toplevel(GTK_WIDGET(widget));  
153 -  
154 - if(type == LIB3270_NOTIFY_CRITICAL)  
155 - {  
156 - msgtype = GTK_MESSAGE_ERROR;  
157 - buttons = GTK_BUTTONS_CLOSE;  
158 - }  
159 -  
160 - if(!title)  
161 - title = _( "Error" );  
162 -  
163 - if(msg)  
164 - {  
165 - dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(toplevel),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,msgtype,buttons,"%s",msg);  
166 -  
167 - if(text)  
168 - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",text);  
169 - }  
170 - else if(text)  
171 - {  
172 - dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(toplevel),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,msgtype,buttons,"%s",text);  
173 - }  
174 - else  
175 - {  
176 - dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(toplevel),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,msgtype,buttons,"%s",title);  
177 - }  
178 -  
179 - if(text)  
180 - g_free(text);  
181 -  
182 - gtk_window_set_title(GTK_WINDOW(dialog),title);  
183 - gtk_widget_show_all(dialog);  
184 - gtk_dialog_run(GTK_DIALOG (dialog));  
185 - gtk_widget_destroy(dialog);  
186 -*/  
187 return 0; 146 return 0;
188 } 147 }
189 148
@@ -418,6 +377,7 @@ @@ -418,6 +377,7 @@
418 for(f=0;f<G_N_ELEMENTS(widget_config);f++) 377 for(f=0;f<G_N_ELEMENTS(widget_config);f++)
419 { 378 {
420 gchar *str = get_string_from_config("terminal",widget_config[f].key,NULL); 379 gchar *str = get_string_from_config("terminal",widget_config[f].key,NULL);
  380 + trace("str=%p strlen=%d",str,strlen(str));
421 widget_config[f].set(widget->terminal,str); 381 widget_config[f].set(widget->terminal,str);
422 if(str) 382 if(str)
423 g_free(str); 383 g_free(str);