c - segmentation fault on g_slice_alloc () from gtk_file_chooser_dialog_new () -
i'm writing text editor in gtk+ 2.0 , gtksourceview 2.0 way learn c. i'm getting segfault when try open file, happens reside on sshfs. isn't problem, don't know if sshfs has it.
here block of code open function:
printf("\nentered open_activated\n"); gtksourcelanguage *lang; gtksourcelanguagemanager *lm; gtkwidget *dialog; gtkwidget *tablabel; gtktextbuffer *tbuffer; int opentabs = 0; const gchar *folder; int page = 0; char *path,*string; page = gtk_notebook_get_current_page(gtk_notebook(notebook)); path = paths[notebookpages[page]]; folder = folderfrompath(path); printf("folder: %s\n\n",folder); dialog = gtk_file_chooser_dialog_new("open file", parent, gtk_file_chooser_action_open,gtk_stock_cancel,gtk_response_cancel,gtk_stock_open,gtk_response_accept,null); gtk_file_chooser_set_current_folder (gtk_file_chooser(dialog), folder); additional info
notebookpages global array of integers:
#define num_tabs 100 int notebookpages[num_tabs]; paths global char array:
char paths[num_tabs][200]; and here function folderfrompath:
char * folderfrompath(char *path) { printf("\nentered folderfrompath\n"); char *token[80]; int = 0; char str[80]; strcpy(str,path); printf("path: %s\n", path); token[0] = strtok(str, "/"); while (token[i]!= null) { i++; token[i] = strtok (null, "/"); } // char folder[128]; char *folder; folder = malloc(sizeof(path)); if (folder != null) { int j = 0; strcpy(folder,"/"); while (j < (i-1)) { strcat(folder,token[j]); strcat(folder,"/"); j++; } printf("folder: %s\n", folder); return folder; free(folder); } else { return "/"; } } here backtrace gdb:
#0 0xb6e1d257 in g_slice_alloc () /usr/lib/libglib-2.0.so.0 #1 0xb6e1e42e in g_slist_prepend () /usr/lib/libglib-2.0.so.0 #2 0xb6e27c74 in g_once_init_enter_impl () /usr/lib/libglib-2.0.so.0 #3 0xb739e24e in gtk_dialog_get_type () /usr/lib/libgtk-x11-2.0.so.0 #4 0xb73d1527 in gtk_file_chooser_dialog_get_type () /usr/lib/libgtk-x11-2.0.so.0 #5 0xb73d15d6 in ?? () /usr/lib/libgtk-x11-2.0.so.0 #6 0xb73d1735 in gtk_file_chooser_dialog_new () /usr/lib/libgtk-x11-2.0.so.0 #7 0x08050506 in open_activated (widget=0x8266878, parent=0x8083a60) @ ledit.c:1715 #8 0xb6eea3dc in g_cclosure_marshal_void__void () /usr/lib/libgobject-2.0.so.0 #9 0xb6ee8f5a in g_closure_invoke () /usr/lib/libgobject-2.0.so.0 #10 0xb6efc816 in ?? () /usr/lib/libgobject-2.0.so.0 #11 0xb6f05168 in g_signal_emit_valist () /usr/lib/libgobject-2.0.so.0 #12 0xb6f05302 in g_signal_emit () /usr/lib/libgobject-2.0.so.0 #13 0xb755a3af in ?? () /usr/lib/libgtk-x11-2.0.so.0 #14 0xb6ee8f5a in g_closure_invoke () /usr/lib/libgobject-2.0.so.0 #15 0xb6efc816 in ?? () /usr/lib/libgobject-2.0.so.0 #16 0xb6f04f13 in g_signal_emit_valist () /usr/lib/libgobject-2.0.so.0 #17 0xb6f05302 in g_signal_emit () /usr/lib/libgobject-2.0.so.0 #18 0xb734aaa1 in gtk_accel_group_activate () /usr/lib/libgtk-x11-2.0.so.0 #19 0xb734bf22 in gtk_accel_groups_activate () /usr/lib/libgtk-x11-2.0.so.0 #20 0xb7575e7d in gtk_window_activate_key () /usr/lib/libgtk-x11-2.0.so.0 #21 0xb7575eec in ?? () /usr/lib/libgtk-x11-2.0.so.0 #22 0xb7427b44 in ?? () /usr/lib/libgtk-x11-2.0.so.0 #23 0xb6ee7a37 in ?? () /usr/lib/libgobject-2.0.so.0 #24 0xb6ee8f5a in g_closure_invoke () /usr/lib/libgobject-2.0.so.0 #25 0xb6efc62c in ?? () /usr/lib/libgobject-2.0.so.0 #26 0xb6f04f13 in g_signal_emit_valist () /usr/lib/libgobject-2.0.so.0 #27 0xb6f05302 in g_signal_emit () /usr/lib/libgobject-2.0.so.0 #28 0xb755bbc6 in ?? () /usr/lib/libgtk-x11-2.0.so.0 #29 0xb7425d63 in gtk_propagate_event () /usr/lib/libgtk-x11-2.0.so.0 #30 0xb742608f in gtk_main_do_event () /usr/lib/libgtk-x11-2.0.so.0 #31 0xb72aa42a in ?? () /usr/lib/libgdk-x11-2.0.so.0 #32 0xb6dfed42 in g_main_context_dispatch () /usr/lib/libglib-2.0.so.0 #33 0xb6dff508 in ?? () /usr/lib/libglib-2.0.so.0 #34 0xb6dffabb in g_main_loop_run () /usr/lib/libglib-2.0.so.0 #35 0xb7424d59 in gtk_main () /usr/lib/libgtk-x11-2.0.so.0 #36 0x0804d636 in main (argc=1, argv=0xbfad3774) @ ledit.c:492 i'm @ point in learning know need understand better memory management , pointers. ideas might causing segfault? or ideas of how troubleshoot further? thanks.
this line dangerous: strcpy(str,path);
if length of path large length of str[], may cause write on array boundary , other unwanted result.
please use strncpy instead of strcpy or make sure source string small or equal destination string.
Comments
Post a Comment