[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

SRM update request: gnash (Re: Any hope of an gnash update in Lenny?)



Hi stable release managers,

would you accept a update of gnash via s-p-u with the attached patch for 
497633, severity important, causing ~/.Xsession of a user under certain 
frequent circumstances to grow several hundred megabytes in a few days as one 
can be read in the bug. (This has also caused data lost in the past as you 
can read there too.)

The attached patch (also available via 
http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=37;filename=gnash.diff;att=1;bug=497633 ) 
is already in sid and testing and has maintainer approval as you can read 
below.

Should I reassign or clone 497633 to release.debian.org?

On Freitag, 18. Dezember 2009, Miriam Ruiz wrote:
> 2009/12/18 Robert Millan <rmh@aybabtu.com>:
> > On Fri, Dec 18, 2009 at 01:05:29PM +0100, Petter Reinholdtsen wrote:
> >> Hi.  We are working on wrapping up the Lenny version of Debian Edu,
> >> and ran into a fatal problem with Gnash.  On the commonly used web
> >> sites, gnash will fill up ~/.xsession-errors with messages and thus
> >> fill the users home directories very quickly.  The issue is reported
> >> to us in <URL: http://bugs.skolelinux.org/1404 >, and to Debian as
> >> <URL: http://bugs.debian.org/497633 >.
> >>
> >> I've created a patch that solve this issue, and submitted it to the
> >> BTS.  Would you be willing to apply this patch to a stable update of
> >> gnash in Lenny, to make it possible for us to continue using Gnash
> >> from Lenny in the default Debian Edu installation?
> >
> > I have no objection.  Miriam, are you ok with it?
>
> +1
>
> I had a look at the patch yesterday and I have no problem at all with
> it. In any case, I won't be able to take care of anything until at
> least the beginning of next week, so if anyone is willing to apply the
> patch ASAP, they got my green light for that. In other case, I'll try
> to get some time for that as soon as I can.
>
> >> The issue is fixed in version 0.8.5 of gnash, but a backport of gnash
> >> 0.8.6 in Sid is first of all hard because of a lot of new
> >> dependencies,


regards,
	Holger
--- gnash-0.8.4.orig/plugin/plugin.cpp
+++ gnash-0.8.4/plugin/plugin.cpp
@@ -47,6 +47,15 @@
   http://www.gnu.org/software/gnash</a>. \
   Compatible Shockwave Flash "FLASH_VERSION
 
+// Define the following to make the plugin verbose
+// WARNING: will write to .xsession_errors !
+// Values:
+//  1: fatal errors (errors preventing the plugin from working as it should)
+//  2: informational messages
+//
+#define GNASH_PLUGIN_DEBUG 1
+
+
 #include <sys/param.h>
 #include "plugin.h" //Fixes Warning on redef of MIN/MAX
 #include <csignal>
@@ -139,11 +148,15 @@
 {
 	if ( plugInitialized )
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "NS_PluginInitialize called, but ignored (we already initialized)" << endl;
+#endif
 		return NPERR_NO_ERROR;
 	}
 
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << "NS_PluginInitialize call ---------------------------------------------------" << endl;
+#endif
 
 #ifdef HAVE_XPCOM
 	if(!cookieManager) {
@@ -155,7 +168,9 @@
                					(reinterpret_cast<void **>(&serviceManager)));
 
 	        if (err != NPERR_NO_ERROR || !serviceManager) {
+#if GNASH_PLUGIN_DEBUG > 1
 			cout << "Failed to get the service manager" << endl;
+#endif
 			return NPERR_GENERIC_ERROR;
 		}
 		nsresult rv;
@@ -163,10 +178,14 @@
 								NS_GET_IID (nsICookieManager),
 								reinterpret_cast<void **>(&cookieManager));
 		if (NS_FAILED (rv) || !cookieManager) {
+#if GNASH_PLUGIN_DEBUG > 1
 			cout << "Failed to get CookieManager" << endl;
+#endif
 			return NPERR_GENERIC_ERROR;
 		}
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "[XPCOM] - CookieManager retrieved." << endl;
+#endif
 	}
 #endif // HAVE_XPCOM
 
@@ -189,13 +208,17 @@
 
 	if (err != NPERR_NO_ERROR || !supportsXEmbed)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "NPAPI ERROR: No xEmbed support in this browser!"
 							<< endl;
+#endif
 		return NPERR_INCOMPATIBLE_VERSION_ERROR;
 	}
 	else
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "xEmbed supported in this browser" << endl;
+#endif
 	}
 
 	err = CallNPN_GetValueProc(NPNFuncs.getvalue, NULL,
@@ -208,14 +231,18 @@
 	*/
 	if (err != NPERR_NO_ERROR || toolkit != NPNVGtk2)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "NPAPI ERROR: No GTK2 support in this browser!"
 			" Have version " << (int)toolkit << endl;
+#endif
 
 		return NPERR_INCOMPATIBLE_VERSION_ERROR;
 	}
 	else
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "GTK2 supported in this browser" << endl;
+#endif
 	}
 
 	/*
@@ -224,7 +251,9 @@
 	char* opts = std::getenv("GNASH_OPTIONS");
 	if (opts != NULL)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "GNASH_OPTIONS : " << opts << endl;
+#endif
 		
 		// Should the plugin wait for gdb to be attached?
 		if ( strstr(opts, "waitforgdb") )
@@ -266,7 +295,9 @@
 		{
 			cerr << "WARNING: NPAPI plugin could not append to the GNASHRC env variable" << endl;
 		}
+#if GNASH_PLUGIN_DEBUG > 1
 		else cout << "NOTE: NPAPI plugin set GNASHRC to " << newGnashRc << endl;
+#endif
 
 	} while (0);
 
@@ -290,7 +321,9 @@
 #if 0
 	if (!plugInitialized)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Plugin already shut down" << endl;
+#endif
 		return;
 	}
 
@@ -404,7 +437,9 @@
 			_name = val;
 		}
 
+#if GNASH_PLUGIN_DEBUG > 1
 		cerr << "PARAM: " << name << " = " << val << endl;
+#endif
 		_params[name] = val;
 	}
 
@@ -413,10 +448,14 @@
 /// \brief Destructor
 nsPluginInstance::~nsPluginInstance()
 {
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << "plugin instance destruction" << endl;
+#endif
 	if ( _ichan )
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "shutting down input chan " << _ichan << endl;
+#endif
 		GError *error = NULL;
 		g_io_channel_shutdown (_ichan, TRUE, &error);
 		g_io_channel_unref (_ichan);
@@ -428,7 +467,9 @@
 
     // TODO: unlink the cookie jar
     if ( ! _cookieFile.empty() ) {
+#if GNASH_PLUGIN_DEBUG > 1
 	    cout << " ~nsPluginInstance: file " << _cookieFile << " should be unlinked!" << endl;
+#endif
     }
 }
 
@@ -442,17 +483,21 @@
 {
 	if(!aWindow)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout <<  __PRETTY_FUNCTION__ << " ERROR: Window handle was bogus!" << endl;
+#endif
 		return FALSE;
 	}
 	else
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "X origin: = " << aWindow->x 
 			<< ", Y Origin = " << aWindow->y
 			<< ", Width = " << aWindow->width
 			<< ", Height = " << aWindow->height
 			<< ", WindowID = " << aWindow->window
 			<< ", this = " << static_cast<void*>(this) << endl;
+#endif
 	}
 
 #if 0
@@ -461,7 +506,9 @@
 
     bool gdb = true;
     while (gdb) {
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << "Waiting for GDB for pid " << getpid() << endl;
+#endif
 	sleep(5);
     }
 #endif
@@ -477,7 +524,9 @@
 void
 nsPluginInstance::shut()
 {
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << "Shutting down" << endl;
+#endif
 
 	if (_childpid > 0)
 	{
@@ -487,7 +536,9 @@
 		kill(_childpid, SIGTERM);
 		int status;
 		waitpid(_childpid, &status, 0);
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Child process exited with status " << status << endl;	
+#endif
 	}
 
 	_childpid = 0;
@@ -505,7 +556,9 @@
 {
 	if(!aWindow)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << __FUNCTION__ << ": ERROR: Window handle was bogus!" << endl;
+#endif
 		return NPERR_INVALID_PARAM;
 #if 0
 	}
@@ -542,7 +595,9 @@
 nsPluginInstance::WriteStatus(char *msg) const
 {
 	NPN_Status(_instance, msg);
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << msg << endl;
+#endif
 
 	return NPERR_NO_ERROR;
 }
@@ -569,7 +624,9 @@
 {
 	_swf_url = stream->url;
 
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << __FUNCTION__ << ": The full URL is " << _swf_url << endl;
+#endif
 
 #ifdef WRITE_FILE
 	size_t start, end;
@@ -578,7 +635,9 @@
 	start = _swf_url.rfind("/", end) + 1;
 	fname = "/tmp/";
 	fname += _swf_url.substr(start, end - start);
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << "The Flash movie name is: " << fname << endl;
+#endif
 
 	_filefd = open(fname.c_str(), O_CREAT | O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
     
@@ -674,7 +733,9 @@
 {
 	if ( cond & G_IO_HUP )
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Player request channel hang up" << endl;
+#endif
 		g_source_remove(_ichanWatchId);
 		return false;
 	}
@@ -682,7 +743,9 @@
 	assert(cond & G_IO_IN);
 	int inputfd = g_io_channel_unix_get_fd(iochan);
 
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << "Checking player requests on fd " << inputfd << endl;
+#endif
 
 	do
 	{
@@ -693,21 +756,31 @@
 		switch ( status )
 		{
 			case G_IO_STATUS_ERROR:
+#if GNASH_PLUGIN_DEBUG > 1
 				cout << "Error reading request line: " << error->message << endl; 
+#endif
 				g_error_free(error);
 				return false;
 			case G_IO_STATUS_EOF:
+#if GNASH_PLUGIN_DEBUG > 1
 				cout << "EOF (error:" << error << ")" << endl;
+#endif
 				return false;
 			case G_IO_STATUS_AGAIN:
+#if GNASH_PLUGIN_DEBUG > 1
 				cout << "Read again (error:" << error << ")" << endl;
+#endif
 				break;
 			case G_IO_STATUS_NORMAL:
 				// process request
+#if GNASH_PLUGIN_DEBUG > 1
 				cout << "Normal read: " << request << " (error:" << error << ")" << endl;
+#endif
 				break;
 			default:
+#if GNASH_PLUGIN_DEBUG > 1
 				cout << "Abnormal status " << status << "  (error:" << error << ")" << endl;
+#endif
 				return false;
 			
 		}
@@ -727,7 +800,9 @@
 {
 	if ( linelen < 4 )
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Invalid player request (too short): " << buf << endl;
+#endif
 		return false;
 	}
 
@@ -736,7 +811,9 @@
 		char* target = buf+4;
 		if ( ! *target )
 		{
+#if GNASH_PLUGIN_DEBUG > 1
 			cout << "No target found after GET request" << endl;
+#endif
 			return false;
 		}
 		char* url = target;
@@ -748,11 +825,15 @@
 		}
 		else
 		{
+#if GNASH_PLUGIN_DEBUG > 1
 			cout << "No colon found after GETURL target string" << endl;
+#endif
 			return false;
 		}
 
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Asked to get URL '" << url << "' in target '" << target << "'" << endl;
+#endif
 		NPN_GetURL(_instance, url, target);
 		return true;
 
@@ -761,7 +842,9 @@
 	{
 		char* command = buf+7;
 		if ( ! *command ) {
+#if GNASH_PLUGIN_DEBUG > 1
 			cout << "No command found after INVOKE request" << endl;
+#endif
 			return false;
 		}
 		char* arg = command;
@@ -770,7 +853,9 @@
 			*arg='\0';
 			++arg;
 		} else {
+#if GNASH_PLUGIN_DEBUG > 1
 			cout << "No colon found after INVOKE command string" << endl;
+#endif
 			return false;
 		}
 
@@ -782,13 +867,17 @@
 		// TODO: check if _self is a good target for this
 		static const char* tgt = "_self";
 
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Calling NPN_GetURL(" << jsurl.str() << ", '" << tgt << "');" << endl;
+#endif
 		NPN_GetURL(_instance, jsurl.str().c_str(), tgt);
 		return true;
 	}
 	else
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Unknown player request: '" << buf << "'" << endl;
+#endif
 		return false;
 	}
 }
@@ -804,7 +893,9 @@
 	nsISupports * sm = NULL;
 
 	// Get service manager
+#if GNASH_PLUGIN_DEBUG > 1
 	cerr << "Getting Path" << NPN_GetValue(NULL, NPNVserviceManager, &sm) << "\n";
+#endif
 
 	// Mozilla returns nsIServiceManager so we can use it directly;
 	// doing QI on nsISupports here can still be more appropriate in
@@ -823,17 +914,23 @@
 
 	// Gets extension service
 	rv = gServiceManager->GetServiceByContractID("@mozilla.org/extensions/manager;1", NS_GET_IID(nsIExtensionManager), (void **)&nsExtensionService);
+#if GNASH_PLUGIN_DEBUG > 1
 	cerr << "gSM" << rv << " " << (nsExtensionService == NULL) << "\n";
+#endif
 	if (!nsExtensionService) return -2;
 	
 	// Gets install location object
 	rv = nsExtensionService->GetInstallLocation(NS_LITERAL_STRING("{2b70f2b1-fc72-4734-bb81-4eb2a7713e49}"), (nsIInstallLocation**)&installLocation);
+#if GNASH_PLUGIN_DEBUG > 1
 	cerr << "nES" << rv << " " << (installLocation == NULL) << "\n";
+#endif
 	if (!installLocation) return -3;
 
 	// Gets information on file in the extension - here, "PetsCity@PetsCity.com" is the ID of the plugin. install.rdf is a file stored in the plugin
 	rv = installLocation->GetItemFile(NS_LITERAL_STRING("{2b70f2b1-fc72-4734-bb81-4eb2a7713e49}"), NS_LITERAL_STRING("plugins/gnash"), (nsIFile**)&file);
+#if GNASH_PLUGIN_DEBUG > 1
 	cerr << "iL" << rv << " " << (file == NULL) << "\n";
+#endif
 	if (!file) return -4;
 
 	// We get the path (stored as unicode in nsName)
@@ -842,7 +939,9 @@
 
        	//const NPString& propValue = NS_LossyConvertUTF16toASCII(sName);
 	gnashpath = ToNewCString(NS_LossyConvertUTF16toASCII(sName));
+#if GNASH_PLUGIN_DEBUG > 1
 	cerr << "Path" << gnashpath << "\n";
+#endif
 	return 0;
 }
 #endif // GNASH_XPI_PLUGIN
@@ -851,14 +950,18 @@
 nsPluginInstance::dumpCookies()
 {
     if ( ! _cookieFile.empty() ) {
+#if GNASH_PLUGIN_DEBUG > 1
 	    cout << " dumpCookies: file " << _cookieFile << " should be unlinked!" << endl;
+#endif
     }
     _cookieFile.clear();
 
 // Linking problems...
 //#ifdef HAVE_XPCOM 
 #if 0
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << "[XPCOM] trying to dump cookies" << endl;
+#endif
 
 	nsCOMPtr<nsISimpleEnumerator> cookie_e;
 	nsresult rv =  cookieManager->GetEnumerator(getter_AddRefs(cookie_e));
@@ -874,10 +977,14 @@
 			const char *tmpname = tmpnam(tmpnamebuf); 
 			fout.open(tmpname, ios::out | ios::trunc);
 			if(!fout.is_open()) {
+#if GNASH_PLUGIN_DEBUG > 1
 				cout << "not opened!!" << endl;
+#endif
 				continue;
 			} else {
+#if GNASH_PLUGIN_DEBUG > 1
 				cout << "opened cookie store: " << tmpname << endl;
+#endif
 			}
 			res = TRUE;
 			_cookieFile = tmpname; // assign ? 
@@ -894,32 +1001,44 @@
 
 			nsCString host;
 			if(NS_FAILED(cookie->GetHost(host))) {
+#if GNASH_PLUGIN_DEBUG > 1
 			  cout << "[XPCOM] cookie without host ... ommitting" << endl;
+#endif
 			  continue;
 			}
 			nsCString path;
 			if(NS_FAILED(cookie->GetPath(path))) {
+#if GNASH_PLUGIN_DEBUG > 1
 			  cout << "[XPCOM] cookie without path ... ommitting" << endl;
+#endif
 			  continue;
 			}
 			PRBool isSecure;
 			if(NS_FAILED(cookie->GetIsSecure(&isSecure))) {
+#if GNASH_PLUGIN_DEBUG > 1
 			  cout << "[XPCOM] cookie without isSecure ... ommitting" << endl;
+#endif
 			  continue;
 			}
 			PRUint64 expires;
 			if(NS_FAILED(cookie->GetExpires(&expires))) {
+#if GNASH_PLUGIN_DEBUG > 1
 			  cout << "[XPCOM] cookie without expires ... ommitting" << endl;
+#endif
 			  continue;
 			}	
 			nsCString name;
 			if(NS_FAILED(cookie->GetName(name))) {
+#if GNASH_PLUGIN_DEBUG > 1
 			  cout << "[XPCOM] cookie without name ... ommitting" << endl;
+#endif
 			  continue;
 			}
 			nsCString value;
 			if(NS_FAILED(cookie->GetValue(value))) {
+#if GNASH_PLUGIN_DEBUG > 1
 			  cout << "[XPCOM] cookie without value ... ommitting" << endl;
+#endif
 			  continue;
 			}
 
@@ -953,9 +1072,13 @@
 			c++;
 		}
 		fout.close();
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "[XPCOM] dump finished (" << c << " cookies in total)" << endl;
+#endif
 	} else {
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "[XPCOM] WARNING: Cookie feature disabled" << endl;
+#endif
 	}
 #endif // HAVE_XPCOM
 
@@ -983,7 +1106,9 @@
 	const char* pageurl = getCurrentPageURL();
 	if (!pageurl)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Could not get current page URL!" << endl;
+#endif
 	}
 
 	struct stat procstats;
@@ -991,7 +1116,9 @@
 	// See if the file actually exists, otherwise we can't spawn it
 	if (stat(procname.c_str(), &procstats) == -1)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Invalid path to standalone executable: " << procname << endl;
+#endif
 		return;
 	}
 
@@ -1004,14 +1131,18 @@
 	int ret = pipe(p2c_pipe);
 	if (ret == -1)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "ERROR: parent to child pipe() failed: " << strerror(errno) << endl;
+#endif
 	}
 	_streamfd = p2c_pipe[1];
 
 	ret = pipe(c2p_pipe);
 	if (ret == -1)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "ERROR: child to parent pipe() failed: " << strerror(errno) << endl;
+#endif
 	}
 
 
@@ -1112,7 +1243,9 @@
 	// If the fork failed, childpid is -1. So print out an error message.
 	if (_childpid == -1)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "ERROR: dup2() failed: " << strerror(errno) << endl;
+#endif
 		return;
 	}
 
@@ -1125,22 +1258,28 @@
 		ret = close (p2c_pipe[0]);
 		if (ret == -1)
 		{
+#if GNASH_PLUGIN_DEBUG > 1
 			cout << "ERROR: p2c_pipe[0] close() failed: " << strerror(errno)
 								<< endl;
+#endif
 		}
 
 		// we want to read from c2p pipe, so close read-fd1
 		ret = close (c2p_pipe[1]);
 		if (ret == -1)
 		{
+#if GNASH_PLUGIN_DEBUG > 1
 			cout << "ERROR: c2p_pipe[1] close() failed: " << strerror(errno)
 								<< endl;
+#endif
 		}
 	
 
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Forked successfully, child process PID is " 
 								<< _childpid
 								<< endl;
+#endif
 
 		_ichan = g_io_channel_unix_new(c2p_pipe[0]);
 		g_io_channel_set_close_on_unref(_ichan, true);
@@ -1158,7 +1297,9 @@
 	ret = close (p2c_pipe[1]); 
 	if (ret == -1)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "ERROR: close() failed: " << strerror(errno) << endl;
+#endif
 	}
 
 	// close standard input and direct read-fd1 to standard input
@@ -1166,7 +1307,9 @@
 	
 	if (ret == -1)
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "ERROR: dup2() failed: " << strerror(errno) << endl;
+#endif
 	}
 
 	// Close all of the browser's file descriptors that we just 
@@ -1191,7 +1334,9 @@
 		}
 	}
 
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << "Closed " << closed << " files." << endl;
+#endif
 
 
 	/*
@@ -1199,6 +1344,7 @@
 	*/
 
 	
+#if GNASH_PLUGIN_DEBUG > 1
 	cout << "Starting process: ";
 
 	for (int i = 0; argv[i] != 0; ++i)
@@ -1206,6 +1352,7 @@
 		cout << argv[i] << " ";
 	}
 	cout << endl;
+#endif
 
 	/*
 	For debugging the plugin (GNASH_OPTIONS=waitforgdb)
@@ -1257,7 +1404,9 @@
 
 	if (!NPVARIANT_IS_OBJECT(vDoc))
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Can't get window object" << endl;
+#endif
 		return NULL;
 	}
 	
@@ -1269,7 +1418,9 @@
         NPN_ReleaseObject(npDoc);
         if (!NPVARIANT_IS_OBJECT(vLoc))
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout <<"Can't get window.location object" << endl;
+#endif
 		return NULL;
 	}
         NPObject* npLoc = NPVARIANT_TO_OBJECT(vLoc);
@@ -1280,7 +1431,9 @@
         NPN_ReleaseObject(npLoc);
         if (!NPVARIANT_IS_STRING(vProp))
 	{
+#if GNASH_PLUGIN_DEBUG > 1
 		cout << "Can't get window.location.href object" << endl;
+#endif
 		return NULL;
 	}
         const NPString& propValue = NPVARIANT_TO_STRING(vProp);

Attachment: signature.asc
Description: This is a digitally signed message part.


Reply to: