[Petter Reinholdtsen] > Have not investigated this issue so far. Was able to build on another machine, so I will ignore the segfault and assume it is a local problem on that machine.
Here is an updated and tested patch. It got rid of a lot of the messages that used to fill up .xsession-errors. The original patch had a few typos which are fixed now. Happy hacking, -- Petter Reinholdtsen
--- 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, "petsc...@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);