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

Popular posts from this blog

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -

php - Controller/JToolBar not working in Joomla 2.5 -