Commit 9fd81a881469452345d56de8ba28b8794638279c
1 parent
db9535b4
Exists in
master
and in
5 other branches
Corrigindo segfaults aleatorios em windows 64
Showing
5 changed files
with
38 additions
and
69 deletions
Show diff stats
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); |