segfault on customer report

will Snow wsnow at gmx.com
Mon Apr 25 06:15:56 EDT 2016


   Hi All,

   After running Reports -> business -> customer report gnucash has a
   segfault (git master branch c739f4fae442e583389dd8c47100a38a06aac4c4)

   I'm interested in helping out with gnucash so looked a bit further. It
   looks as though the segfault occurs when the get_slot method is run
   because the book variable is empty.

   src/libqof/qof/qofbook.cpp
   1194 KvpValue*
   1195 qof_book_get_option (QofBook *book, GSList *path)
   1196 {
   1197     KvpFrame *root = qof_instance_get_slots(QOF_INSTANCE (book));
   1198     Path path_v {KVP_OPTION_PATH};
   1199     for (auto item = path; item != nullptr; item =
   g_slist_next(item))
   1200         path_v.push_back(static_cast<const char*>(item->data));
   1201     return root->get_slot(path_v);
   1202 }
   After looking a bit deeper it seems that SWIG_MustGetPtr (see below)
   returns null to arg1 (book) which is then passed to qof_book_get_option
   resulting in qof_instance_get_slots returning null instead of an object
   and then it segfaults when trying to run get_slots.

   I thought adding some sort of check on the root variable but that's
   probably wrong and not solving the underlying problem? I'm not sure
   where to go from here with regards to fixing the issue. Any pointers
   would be helpful. Thanks.

   ./src/engine/swig-engine.c
   static SCM
   _wrap_qof_book_get_option (SCM s_0, SCM s_1)
   {
   #define FUNC_NAME "qof-book-get-option"
     QofBook *arg1 = (QofBook *) 0 ;
     GSList *arg2 = (GSList *) 0 ;
     SCM gswig_result;
     SWIGUNUSED int gswig_list_p = 0;
     KvpValue *result = 0 ;
     {
       arg1 = (QofBook *)SWIG_MustGetPtr(s_0, SWIGTYPE_p_QofBook, 1, 0);
     }
     arg2 = gnc_scm_to_gslist_string(s_1);
     result = (KvpValue *)qof_book_get_option(arg1,arg2);
     gswig_result = gnc_kvp_value_ptr_to_scm(result);

     return gswig_result;
   #undef FUNC_NAME


More information about the gnucash-devel mailing list