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 264 /* Update the model name. */
265 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 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 635 trace("%s: title=%s fmt=%s",__FUNCTION__,"3270 Error",fmt);
635 636  
636 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 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 167 char *r;
168 168 #if defined(HAVE_VASPRINTF) /*[*/
169 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 172 return r;
173 173 #else /*][*/
174 174 char buf[16384];
... ... @@ -1098,7 +1098,7 @@ LIB3270_EXPORT void * lib3270_realloc(void *p, int len)
1098 1098 {
1099 1099 p = realloc(p, len);
1100 1100 if(!p)
1101   - Error(NULL,"Out of memory");
  1101 + Error(NULL,"Out of memory in %s",__FUNCTION__);
1102 1102 return p;
1103 1103 }
1104 1104  
... ... @@ -1114,7 +1114,7 @@ LIB3270_EXPORT void * lib3270_calloc(int elsize, int nelem, void *ptr)
1114 1114 if(ptr)
1115 1115 memset(ptr,0,sz);
1116 1116 else
1117   - Error(NULL,"Out of memory");
  1117 + Error(NULL,"Out of memory in %s",__FUNCTION__);
1118 1118  
1119 1119 return ptr;
1120 1120 }
... ... @@ -1127,7 +1127,7 @@ LIB3270_EXPORT void * lib3270_malloc(int len)
1127 1127 r = malloc(len);
1128 1128 if (r == (char *)NULL)
1129 1129 {
1130   - Error(NULL,"Out of memory");
  1130 + Error(NULL,"Out of memory in %s",__FUNCTION__);
1131 1131 return 0;
1132 1132 }
1133 1133  
... ... @@ -1142,7 +1142,7 @@ void * Calloc(size_t nelem, size_t elsize)
1142 1142 char * r = malloc(sz);
1143 1143  
1144 1144 if(!r)
1145   - Error(NULL,"Out of memory");
  1145 + Error(NULL,"Out of memory in %s",__FUNCTION__);
1146 1146  
1147 1147 memset(r, 0, sz);
1148 1148 return r;
... ...
src/pw3270/common/config.c
... ... @@ -330,21 +330,19 @@ gchar * get_last_error_msg(void)
330 330 #ifdef WIN_REGISTRY_ENABLED
331 331  
332 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 338 if(!registry_open_key(group,KEY_READ,&key_handle))
339 339 return g_strdup(def);
340 340  
341 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 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 220 GtkMessageType msgtype = GTK_MESSAGE_WARNING;
221 221 GtkButtonsType buttons = GTK_BUTTONS_OK;
222 222  
  223 + trace("%s: widget=%p",__FUNCTION__,widget);
  224 +
223 225 if(widget && GTK_IS_WIDGET(widget))
224 226 toplevel = gtk_widget_get_toplevel(GTK_WIDGET(widget));
225 227  
... ... @@ -743,6 +745,8 @@ static void v3270_init(v3270 *widget)
743 745 {
744 746 widget->host = lib3270_session_new("");
745 747  
  748 + trace("%s",__FUNCTION__);
  749 +
746 750 if(widget->host->sz != sizeof(H3270))
747 751 {
748 752 g_error( _( "Unexpected signature in H3270 object, possible version mismatch in lib3270") );
... ... @@ -782,6 +786,7 @@ static void v3270_init(v3270 *widget)
782 786 // Setup events
783 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 792 GtkWidget * v3270_new(void)
... ... @@ -1133,6 +1138,12 @@ void v3270_set_font_family(GtkWidget *widget, const gchar *name)
1133 1138  
1134 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 1147 if(terminal->font_family)
1137 1148 {
1138 1149 if(!g_strcasecmp(terminal->font_family,name))
... ... @@ -1141,12 +1152,6 @@ void v3270_set_font_family(GtkWidget *widget, const gchar *name)
1141 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 1155 terminal->font_family = g_strdup(name);
1151 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 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 136 if(fmt)
132 137 {
133 138 gchar *text = g_strdup_vprintf(fmt,args);
... ... @@ -138,52 +143,6 @@
138 143 {
139 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 146 return 0;
188 147 }
189 148  
... ... @@ -418,6 +377,7 @@
418 377 for(f=0;f<G_N_ELEMENTS(widget_config);f++)
419 378 {
420 379 gchar *str = get_string_from_config("terminal",widget_config[f].key,NULL);
  380 + trace("str=%p strlen=%d",str,strlen(str));
421 381 widget_config[f].set(widget->terminal,str);
422 382 if(str)
423 383 g_free(str);
... ...