|
View:
New views
3 Messages
—
Rating Filter:
Alert me
|
|
|
Fix thread issuesWhile developing a Gdome application using threads, I found an issue with the
way it handles singletons, like dome-xml-domimpl.c and gdome-xpath-xpeval.c. You first test if global instance is NULL, if not you allocate the new, _EMPTY_ instance directly to the global instance, then goes to fill needed fields, like "vtab". Problem happens if you allocate and is preempted by system. Global pointer is not NULL anymore, however you don't have any required field, like "vtab", and can segfault your application. This could be solved easily without any locks, just use a local variable while the instance is not setup, just then make it global. Attached patch fix this problem. Thanks, -- Gustavo Sverzut Barbieri ------------------------ INdT, Recife, Brazil Jabber: barbieri@... MSN: barbieri@... ICQ#: 17249123 Skype: gsbarbieri Mobile: +55 (81) 9927 0010 Phone: +1 (347) 624 6296; 08122692@... GPG: 0xB640E1A2 @ wwwkeys.pgp.net [gdome2-cvs-threadsafe.patch] diff -ur gdome2-fix/libgdome/gdomecore/gdome-xml-domimpl.c gdome2-orig/libgdome/gdomecore/gdome-xml-domimpl.c --- gdome2-fix/libgdome/gdomecore/gdome-xml-domimpl.c 2006-05-18 15:02:22.000000000 -0300 +++ gdome2-orig/libgdome/gdomecore/gdome-xml-domimpl.c 2005-05-13 04:05:56.000000000 -0300 @@ -70,11 +70,10 @@ GdomeDOMImplementation * gdome_xml_di_mkref (void) { if (gdome_xml_DOMImplementation == NULL) { - Gdome_xml_DOMImplementation *n; - n = g_new0 (Gdome_xml_DOMImplementation, 1); - n->refcnt = 1; - n->vtab = &gdome_xml_di_vtab; - gdome_xml_DOMImplementation = n; + gdome_xml_DOMImplementation = g_new (Gdome_xml_DOMImplementation, 1); + memset(gdome_xml_DOMImplementation, 0, sizeof(Gdome_xml_DOMImplementation)); + gdome_xml_DOMImplementation->refcnt = 1; + gdome_xml_DOMImplementation->vtab = &gdome_xml_di_vtab; } else gdome_xml_DOMImplementation->refcnt++; diff -ur gdome2-fix/libgdome/xpath/gdome-xpath-xpeval.c gdome2-orig/libgdome/xpath/gdome-xpath-xpeval.c --- gdome2-fix/libgdome/xpath/gdome-xpath-xpeval.c 2006-05-18 15:01:55.000000000 -0300 +++ gdome2-orig/libgdome/xpath/gdome-xpath-xpeval.c 2006-05-18 15:11:48.000000000 -0300 @@ -53,11 +53,9 @@ gdome_xpath_xpeval_mkref (void) { if (gdome_xpath_XPathEvaluator == NULL) { - Gdome_xpath_XPathEvaluator *n; - n = g_new0 (Gdome_xpath_XPathEvaluator, 1); - n->refcnt = 1; - n->vtab = &gdome_xpath_xpeval_vtab; - gdome_xpath_XPathEvaluator = n; + gdome_xpath_XPathEvaluator = g_new (Gdome_xpath_XPathEvaluator, 1); + gdome_xpath_XPathEvaluator->refcnt = 1; + gdome_xpath_XPathEvaluator->vtab = &gdome_xpath_xpeval_vtab; } else gdome_xpath_XPathEvaluator->refcnt++; _______________________________________________ gdome mailing list gdome@... http://mail.gnome.org/mailman/listinfo/gdome |
|
|
Re: Fix thread issuesSorry, but previous patch was wrong (it was a revert patch :-D).
Attached is the correct. -- Gustavo Sverzut Barbieri ------------------------ INdT, Recife, Brazil Jabber: barbieri@... MSN: barbieri@... ICQ#: 17249123 Skype: gsbarbieri Mobile: +55 (81) 9927 0010 Phone: +1 (347) 624 6296; 08122692@... GPG: 0xB640E1A2 @ wwwkeys.pgp.net [gdome2-cvs-threadsafe.patch] diff -ur gdome2-orig/libgdome/gdomecore/gdome-xml-domimpl.c gdome2-fix/libgdome/gdomecore/gdome-xml-domimpl.c --- gdome2-orig/libgdome/gdomecore/gdome-xml-domimpl.c 2005-05-13 04:05:56.000000000 -0300 +++ gdome2-fix/libgdome/gdomecore/gdome-xml-domimpl.c 2006-05-18 15:02:22.000000000 -0300 @@ -70,10 +70,11 @@ GdomeDOMImplementation * gdome_xml_di_mkref (void) { if (gdome_xml_DOMImplementation == NULL) { - gdome_xml_DOMImplementation = g_new (Gdome_xml_DOMImplementation, 1); - memset(gdome_xml_DOMImplementation, 0, sizeof(Gdome_xml_DOMImplementation)); - gdome_xml_DOMImplementation->refcnt = 1; - gdome_xml_DOMImplementation->vtab = &gdome_xml_di_vtab; + Gdome_xml_DOMImplementation *n; + n = g_new0 (Gdome_xml_DOMImplementation, 1); + n->refcnt = 1; + n->vtab = &gdome_xml_di_vtab; + gdome_xml_DOMImplementation = n; } else gdome_xml_DOMImplementation->refcnt++; diff -ur gdome2-orig/libgdome/xpath/gdome-xpath-xpeval.c gdome2-fix/libgdome/xpath/gdome-xpath-xpeval.c --- gdome2-orig/libgdome/xpath/gdome-xpath-xpeval.c 2006-05-18 15:11:48.000000000 -0300 +++ gdome2-fix/libgdome/xpath/gdome-xpath-xpeval.c 2006-05-18 15:01:55.000000000 -0300 @@ -53,9 +53,11 @@ gdome_xpath_xpeval_mkref (void) { if (gdome_xpath_XPathEvaluator == NULL) { - gdome_xpath_XPathEvaluator = g_new (Gdome_xpath_XPathEvaluator, 1); - gdome_xpath_XPathEvaluator->refcnt = 1; - gdome_xpath_XPathEvaluator->vtab = &gdome_xpath_xpeval_vtab; + Gdome_xpath_XPathEvaluator *n; + n = g_new0 (Gdome_xpath_XPathEvaluator, 1); + n->refcnt = 1; + n->vtab = &gdome_xpath_xpeval_vtab; + gdome_xpath_XPathEvaluator = n; } else gdome_xpath_XPathEvaluator->refcnt++; _______________________________________________ gdome mailing list gdome@... http://mail.gnome.org/mailman/listinfo/gdome |
|
|
Re: Fix thread issuesThanks Gustavo, patch applied.
--luca _______________________________________________ gdome mailing list gdome@... http://mail.gnome.org/mailman/listinfo/gdome |
| Free embeddable forum powered by Nabble | Forum Help |