[PATCH] editors/AbiWord2 bug (function returns pointer to non static data destroyed after return)

Oleg Sharoiko os at rsu.ru
Wed Jun 2 09:38:45 GMT 2004


>Submitter-Id:	current-users
>Originator:	Oleg Sharoiko
>Organization:	Computer Center of Rostov State University
>Confidential:	no 
>Synopsis:	[PATCH] editors/AbiWord2 bug (function returns pointer to non static data destroyed after return)
>Severity:	serious
>Priority:	medium
>Category:	ports
>Class:		sw-bug
>Release:	FreeBSD 5.2-CURRENT i386
>Environment:
System: FreeBSD brain.cc.rsu.ru 5.2-CURRENT FreeBSD 5.2-CURRENT #0: Tue May 18 18:15:48 MSD 2004 os at brain.cc.rsu.ru:/usr/obj/usr/src/sys/brain.athlon-xp.HEAD.2004-01-30 i386


	
>Description:
	After upgrade of AbiWord from 2.06 to 2.0.7 is stopped working with
	SIGSEGV. After some digging in the code I found:

	ap_GetLabel_Autotext() (src/wp/ap/xp/ap_Menu_Functions.cpp)
	returns a pointer to internal buffer of temp variable of type
	UT_UTF8String, but ~UT_UTF8String destroys this buffer.
	
>How-To-Repeat:
	It seems that this bug is not always seen.
	I could easily reproduce it with

	cd /usr/ports/editors/AbiWord2
	make
	make install
	rehash
	AbiWord-2.0

	on two -CURRENT boxes
	but it works on my friend's -CURRENT which is a little bit older.
>Fix:

	The following patch (which is quite similar to the one committed into
	main abiword source three) solves the problem.


--- AbiWord2/files/patch-src::wp::ap::xp::ap_Menu_Functions.cpp	Thu Jan  1 03:00:00 1970
+++ AbiWord2/files/patch-src::wp::ap::xp::ap_Menu_Functions.cpp	Wed Jun  2 13:33:55 2004
@@ -0,0 +1,135 @@
+--- src/wp/ap/xp/ap_Menu_Functions.cpp.orig	Wed Jun  2 12:47:46 2004
++++ src/wp/ap/xp/ap_Menu_Functions.cpp	Wed Jun  2 12:47:49 2004
+@@ -62,92 +62,94 @@
+ 	const char * c = NULL;
+ 
+ 	const XAP_StringSet * pss = pApp->getStringSet();
+-	c = pss->getValueUTF8(AP_STRING_ID_DLG_Spell_NoSuggestions).utf8_str();
++	static UT_UTF8String s;
+ 
+ 	switch (id)
+ 	  {
+ 	  case AP_MENU_ID_AUTOTEXT_ATTN_1:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_ATTN_1).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_ATTN_1); break;
+ 	  case AP_MENU_ID_AUTOTEXT_ATTN_2:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_ATTN_2).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_ATTN_2); break;
+ 
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_1:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_1).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_1); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_2:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_2).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_2); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_3:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_3).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_3); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_4:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_4).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_4); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_5:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_5).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_5); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_6:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_6).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_6); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_7:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_7).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_7); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_8:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_8).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_8); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_9:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_9).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_9); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_10:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_10).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_10); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_11:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_11).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_11); break;
+ 	  case AP_MENU_ID_AUTOTEXT_CLOSING_12:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_12).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_CLOSING_12); break;
+ 
+ 	  case AP_MENU_ID_AUTOTEXT_MAIL_1:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_1).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_1); break;
+ 	  case AP_MENU_ID_AUTOTEXT_MAIL_2:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_2).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_2); break;
+ 	  case AP_MENU_ID_AUTOTEXT_MAIL_3:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_3).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_3); break;
+ 	  case AP_MENU_ID_AUTOTEXT_MAIL_4:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_4).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_4); break;
+ 	  case AP_MENU_ID_AUTOTEXT_MAIL_5:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_5).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_5); break;
+ 	  case AP_MENU_ID_AUTOTEXT_MAIL_6:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_6).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_6); break;
+ 	  case AP_MENU_ID_AUTOTEXT_MAIL_7:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_7).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_7); break;
+ 	  case AP_MENU_ID_AUTOTEXT_MAIL_8:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_8).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_MAIL_8); break;
+ 
+ 	  case AP_MENU_ID_AUTOTEXT_REFERENCE_1:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_REFERENCE_1).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_REFERENCE_1); break;
+ 	  case AP_MENU_ID_AUTOTEXT_REFERENCE_2:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_REFERENCE_2).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_REFERENCE_2); break;
+ 	  case AP_MENU_ID_AUTOTEXT_REFERENCE_3:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_REFERENCE_3).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_REFERENCE_3); break;
+ 
+ 	  case AP_MENU_ID_AUTOTEXT_SALUTATION_1:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SALUTATION_1).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SALUTATION_1); break;
+ 	  case AP_MENU_ID_AUTOTEXT_SALUTATION_2:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SALUTATION_2).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SALUTATION_2); break;
+ 	  case AP_MENU_ID_AUTOTEXT_SALUTATION_3:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SALUTATION_3).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SALUTATION_3); break;
+ 	  case AP_MENU_ID_AUTOTEXT_SALUTATION_4:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SALUTATION_4).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SALUTATION_4); break;
+ 
+ 	  case AP_MENU_ID_AUTOTEXT_SUBJECT_1:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SUBJECT_1).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_SUBJECT_1); break;
+ 
+ 	  case AP_MENU_ID_AUTOTEXT_EMAIL_1:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_1).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_1); break;
+ 	  case AP_MENU_ID_AUTOTEXT_EMAIL_2:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_2).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_2); break;
+ 	  case AP_MENU_ID_AUTOTEXT_EMAIL_3:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_3).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_3); break;
+ 	  case AP_MENU_ID_AUTOTEXT_EMAIL_4:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_4).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_4); break;
+ 	  case AP_MENU_ID_AUTOTEXT_EMAIL_5:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_5).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_5); break;
+ 	  case AP_MENU_ID_AUTOTEXT_EMAIL_6:
+-	    c = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_6).utf8_str(); break;
++	    s = pss->getValueUTF8(AP_STRING_ID_AUTOTEXT_EMAIL_6); break;
+ 
+ 	  default:
+-	    c = "No clue"; break;
++	    s = pss->getValueUTF8(AP_STRING_ID_DLG_Spell_NoSuggestions); break;
+ 	  }
++
++	c = s.utf8_str();
+ 
+ 	return c;
+ }


More information about the freebsd-gnome mailing list