View Issue Details

This bug affects 1 person(s).
 4
IDProjectCategoryView StatusLast Update
14031Bug reportsSurvey participants (Tokens)public2019-11-26 17:41
ReporterAdrianB Assigned Tocdorin  
PrioritynoneSeverityblock 
Status closedResolutionno change required 
Summary14031: Internal server error on bounce processing - LTS2.6.7
Description

I have one particular survey that caused Apache to return an "Error 500" when bounce processing is initiated. The access log entry looks like this:

xxx.xxx.xxx.xxx - - [05/Sep/2018:17:04:05 +1000] "GET /limesurvey/index.php/admin/tokens/sa/bounceprocessing/surveyid/468744?YII_CSRF_TOKEN=8befe25ecc9e373b42f62487b0d26577725387d3 HTTP/1.1" 500 428 "https://somedomain.org.au/limesurvey/index.php/admin/tokens/sa/browse/surveyid/468744" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0"

When I turn on PHP debugging, the message is:

Sep 5 14:51:22 sphinx-frontend apache2: PHP Notice: Trying to get property 'emailstatus' of non-object in /var/www/limesurvey/application/controllers/admin/tokens.php on line 198

The full PHP dump is attached to this bug report.

It seems like there is something about the records in this survey's token table that is causing the crash, but I can't spot the problem. The survey uses a customised language that we installed manually, but there are other surveys that also use that language, and they work fine with bounce processing. It's just one survey and its token table that encounter the problem.

TagsNo tags attached.
Attached Files
PHP-notice.html (17,928 bytes)   
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PHP notice</title>

<style type="text/css">
/*<![CDATA[*/
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;margin:0;padding:0;}
body{line-height:1;}
ol,ul{list-style:none;}
blockquote,q{quotes:none;}
blockquote:before,blockquote:after,q:before,q:after{content:none;}
:focus{outline:0;}
ins{text-decoration:none;}
del{text-decoration:line-through;}
table{border-collapse:collapse;border-spacing:0;}

body {
	font: normal 9pt "Verdana";
	color: #000;
	background: #fff;
}

h1 {
	font: normal 18pt "Verdana";
	color: #f00;
	margin-bottom: .5em;
}

h2 {
	font: normal 14pt "Verdana";
	color: #800000;
	margin-bottom: .5em;
}

h3 {
	font: bold 11pt "Verdana";
}

pre {
	font: normal 11pt Menlo, Consolas, "Lucida Console", Monospace;
}

pre span.error {
	display: block;
	background: #fce3e3;
}

pre span.ln {
	color: #999;
	padding-right: 0.5em;
	border-right: 1px solid #ccc;
}

pre span.error-ln {
	font-weight: bold;
}

.container {
	margin: 1em 4em;
}

.version {
	color: gray;
	font-size: 8pt;
	border-top: 1px solid #aaa;
	padding-top: 1em;
	margin-bottom: 1em;
}

.message {
	color: #000;
	padding: 1em;
	font-size: 11pt;
	background: #f3f3f3;
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
	margin-bottom: 1em;
	line-height: 160%;
}

.source {
	margin-bottom: 1em;
}

.code pre {
	background-color: #ffe;
	margin: 0.5em 0;
	padding: 0.5em;
	line-height: 125%;
	border: 1px solid #eee;
}

.source .file {
	margin-bottom: 1em;
	font-weight: bold;
}

.traces {
	margin: 2em 0;
}

.trace {
	margin: 0.5em 0;
	padding: 0.5em;
}

.trace.app {
	border: 1px dashed #c00;
}

.trace .number {
	text-align: right;
	width: 2em;
	padding: 0.5em;
}

.trace .content {
	padding: 0.5em;
}

.trace .plus,
.trace .minus {
	display:inline;
	vertical-align:middle;
	text-align:center;
	border:1px solid #000;
	color:#000;
	font-size:10px;
	line-height:10px;
	margin:0;
	padding:0 1px;
	width:10px;
	height:10px;
}

.trace.collapsed .minus,
.trace.expanded .plus,
.trace.collapsed pre {
	display: none;
}

.trace-file {
	cursor: pointer;
	padding: 0.2em;
}

.trace-file:hover {
	background: #f0ffff;
}
/*]]>*/
</style>
</head>

<body>
<div class="container">
	<h1>PHP notice</h1>

	<p class="message">
		Trying to get property 'emailstatus' of non-object	</p>

	<div class="source">
		<p class="file">/var/www/limesurvey/application/controllers/admin/tokens.php(198)</p>
		<div class="code"><pre><span class="ln">186</span>                                 $iSurveyIdBounce = explode(": ", $item);
<span class="ln">187</span>                             }
<span class="ln">188</span>                             if (preg_match('/^X-tokenid/', $item))
<span class="ln">189</span>                             {
<span class="ln">190</span>                                 $tokenBounce = explode(": ", $item);
<span class="ln">191</span>                                 if ($iSurveyId == $iSurveyIdBounce[1])
<span class="ln">192</span>                                 {
<span class="ln">193</span>                                     $aData = array(
<span class="ln">194</span>                                     'emailstatus' =&gt; 'bounced'
<span class="ln">195</span>                                     );
<span class="ln">196</span>                                     $condn = array('token' =&gt; $tokenBounce[1]);
<span class="ln">197</span>                                     $record = Token::model($iSurveyId)-&gt;findByAttributes($condn);
<span class="error"><span class="ln error-ln">198</span>                                     if ($record-&gt;emailstatus != 'bounced')
</span><span class="ln">199</span>                                     {
<span class="ln">200</span>                                         $record-&gt;emailstatus = 'bounced';
<span class="ln">201</span>                                         $record-&gt;save();
<span class="ln">202</span>                                         $bouncetotal++;
<span class="ln">203</span>                                     }
<span class="ln">204</span>                                     $readbounce = imap_body($mbox, $count); // Put read
<span class="ln">205</span>                                     if (isset($thissurvey['bounceremove']) &amp;&amp; $thissurvey['bounceremove']) // TODO Y or just true, and a imap_delete
<span class="ln">206</span>                                     {
<span class="ln">207</span>                                         $deletebounce = imap_delete($mbox, $count); // Put delete
<span class="ln">208</span>                                     }
<span class="ln">209</span>                                 }
<span class="ln">210</span>                             }
</pre></div>	</div>

	<div class="traces">
		<h2>Stack Trace</h2>
				<table style="width:100%;">
						<tbody><tr class="trace core collapsed">
			<td class="number">
				#0			</td>
			<td class="content">
				<div class="trace-file">
										&nbsp;unknown(0): <strong>tokens</strong>-&gt;<strong>bounceprocessing</strong>("468744")				</div>

							</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#1			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/framework/web/actions/CAction.php(109): <strong>ReflectionMethod</strong>-&gt;<strong>invokeArgs</strong>(tokens, array("468744"))				</div>

				<div class="code"><pre><span class="ln">104</span>             elseif($param-&gt;isDefaultValueAvailable())
<span class="ln">105</span>                 $ps[]=$param-&gt;getDefaultValue();
<span class="ln">106</span>             else
<span class="ln">107</span>                 return false;
<span class="ln">108</span>         }
<span class="error"><span class="ln error-ln">109</span>         $method-&gt;invokeArgs($object,$ps);
</span><span class="ln">110</span>         return true;
<span class="ln">111</span>     }
<span class="ln">112</span> }
</pre></div>			</td>
		</tr>
						<tr class="trace app expanded">
			<td class="number">
				#2			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/application/core/Survey_Common_Action.php(88): <strong>CAction</strong>-&gt;<strong>runWithParamsInternal</strong>(tokens,
 ReflectionMethod, array("YII_CSRF_TOKEN" =&gt; 
"708d2ded010d0a73c2d3c96151e78a928ac84805", "surveyid" =&gt; "468744", 
"sa" =&gt; "bounceprocessing", "iSurveyId" =&gt; "468744", ...))				</div>

				<div class="code"><pre><span class="ln">83</span>             $oMethod = new ReflectionMethod($this, $sDefault);
<span class="ln">84</span>         }
<span class="ln">85</span> 
<span class="ln">86</span>         // We're all good to go, let's execute it
<span class="ln">87</span>         // runWithParamsInternal would automatically get the parameters of the method and populate them as required with the params
<span class="error"><span class="ln error-ln">88</span>         return parent::runWithParamsInternal($this, $oMethod, $params);
</span><span class="ln">89</span>     }
<span class="ln">90</span> 
<span class="ln">91</span>     /**
<span class="ln">92</span>     * Some functions have different parameters, which are just an alias of the
<span class="ln">93</span>     * usual parameters we're getting in the url. This function just populates
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#3			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/framework/web/CController.php(308): <strong>Survey_Common_Action</strong>-&gt;<strong>runWithParams</strong>(array("YII_CSRF_TOKEN"
 =&gt; "708d2ded010d0a73c2d3c96151e78a928ac84805", "surveyid" =&gt; 
"468744", "sa" =&gt; "bounceprocessing", "iSurveyId" =&gt; "468744", 
...))				</div>

				<div class="code"><pre><span class="ln">303</span>     {
<span class="ln">304</span>         $priorAction=$this-&gt;_action;
<span class="ln">305</span>         $this-&gt;_action=$action;
<span class="ln">306</span>         if($this-&gt;beforeAction($action))
<span class="ln">307</span>         {
<span class="error"><span class="ln error-ln">308</span>             if($action-&gt;runWithParams($this-&gt;getActionParams())===false)
</span><span class="ln">309</span>                 $this-&gt;invalidActionParams($action);
<span class="ln">310</span>             else
<span class="ln">311</span>                 $this-&gt;afterAction($action);
<span class="ln">312</span>         }
<span class="ln">313</span>         $this-&gt;_action=$priorAction;
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#4			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/framework/web/CController.php(286): <strong>CController</strong>-&gt;<strong>runAction</strong>(tokens)				</div>

				<div class="code"><pre><span class="ln">281</span>      * @see runAction
<span class="ln">282</span>      */
<span class="ln">283</span>     public function runActionWithFilters($action,$filters)
<span class="ln">284</span>     {
<span class="ln">285</span>         if(empty($filters))
<span class="error"><span class="ln error-ln">286</span>             $this-&gt;runAction($action);
</span><span class="ln">287</span>         else
<span class="ln">288</span>         {
<span class="ln">289</span>             $priorAction=$this-&gt;_action;
<span class="ln">290</span>             $this-&gt;_action=$action;
<span class="ln">291</span>             CFilterChain::create($this,$action,$filters)-&gt;run();
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#5			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/framework/web/CController.php(265): <strong>CController</strong>-&gt;<strong>runActionWithFilters</strong>(tokens, array())				</div>

				<div class="code"><pre><span class="ln">260</span>         {
<span class="ln">261</span>             if(($parent=$this-&gt;getModule())===null)
<span class="ln">262</span>                 $parent=Yii::app();
<span class="ln">263</span>             if($parent-&gt;beforeControllerAction($this,$action))
<span class="ln">264</span>             {
<span class="error"><span class="ln error-ln">265</span>                 $this-&gt;runActionWithFilters($action,$this-&gt;filters());
</span><span class="ln">266</span>                 $parent-&gt;afterControllerAction($this,$action);
<span class="ln">267</span>             }
<span class="ln">268</span>         }
<span class="ln">269</span>         else
<span class="ln">270</span>             $this-&gt;missingAction($actionID);
</pre></div>			</td>
		</tr>
						<tr class="trace app expanded">
			<td class="number">
				#6			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/application/controllers/AdminController.php(159): <strong>CController</strong>-&gt;<strong>run</strong>("tokens")				</div>

				<div class="code"><pre><span class="ln">154</span>                     $this-&gt;redirect(array('/admin/authentication/sa/login'));
<span class="ln">155</span>                 }
<span class="ln">156</span> 
<span class="ln">157</span>             }
<span class="ln">158</span> 
<span class="error"><span class="ln error-ln">159</span>             return parent::run($action);
</span><span class="ln">160</span>     }
<span class="ln">161</span> 
<span class="ln">162</span>     /**
<span class="ln">163</span>     * Routes all the actions to their respective places
<span class="ln">164</span>     *
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#7			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/framework/web/CWebApplication.php(282): <strong>AdminController</strong>-&gt;<strong>run</strong>("tokens")				</div>

				<div class="code"><pre><span class="ln">277</span>         {
<span class="ln">278</span>             list($controller,$actionID)=$ca;
<span class="ln">279</span>             $oldController=$this-&gt;_controller;
<span class="ln">280</span>             $this-&gt;_controller=$controller;
<span class="ln">281</span>             $controller-&gt;init();
<span class="error"><span class="ln error-ln">282</span>             $controller-&gt;run($actionID);
</span><span class="ln">283</span>             $this-&gt;_controller=$oldController;
<span class="ln">284</span>         }
<span class="ln">285</span>         else
<span class="ln">286</span>             throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
<span class="ln">287</span>                 array('{route}'=&gt;$route===''?$this-&gt;defaultController:$route)));
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#8			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/framework/web/CWebApplication.php(141): <strong>CWebApplication</strong>-&gt;<strong>runController</strong>("admin/tokens/sa/bounceprocessing")				</div>

				<div class="code"><pre><span class="ln">136</span>             foreach(array_splice($this-&gt;catchAllRequest,1) as $name=&gt;$value)
<span class="ln">137</span>                 $_GET[$name]=$value;
<span class="ln">138</span>         }
<span class="ln">139</span>         else
<span class="ln">140</span>             $route=$this-&gt;getUrlManager()-&gt;parseUrl($this-&gt;getRequest());
<span class="error"><span class="ln error-ln">141</span>         $this-&gt;runController($route);
</span><span class="ln">142</span>     }
<span class="ln">143</span> 
<span class="ln">144</span>     /**
<span class="ln">145</span>      * Registers the core application components.
<span class="ln">146</span>      * This method overrides the parent implementation by registering additional core components.
</pre></div>			</td>
		</tr>
						<tr class="trace core collapsed">
			<td class="number">
				#9			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/framework/base/CApplication.php(184): <strong>CWebApplication</strong>-&gt;<strong>processRequest</strong>()				</div>

				<div class="code"><pre><span class="ln">179</span>     public function run()
<span class="ln">180</span>     {
<span class="ln">181</span>         if($this-&gt;hasEventHandler('onBeginRequest'))
<span class="ln">182</span>             $this-&gt;onBeginRequest(new CEvent($this));
<span class="ln">183</span>         register_shutdown_function(array($this,'end'),0,false);
<span class="error"><span class="ln error-ln">184</span>         $this-&gt;processRequest();
</span><span class="ln">185</span>         if($this-&gt;hasEventHandler('onEndRequest'))
<span class="ln">186</span>             $this-&gt;onEndRequest(new CEvent($this));
<span class="ln">187</span>     }
<span class="ln">188</span> 
<span class="ln">189</span>     /**
</pre></div>			</td>
		</tr>
						<tr class="trace app expanded">
			<td class="number">
				#10			</td>
			<td class="content">
				<div class="trace-file">
											<div class="plus">+</div>
						<div class="minus">–</div>
										&nbsp;/var/www/limesurvey/index.php(211): <strong>CApplication</strong>-&gt;<strong>run</strong>()				</div>

				<div class="code"><pre><span class="ln">206</span>         die (sprintf('%s should be writable by the webserver (766 or 776).', $runtimePath));
<span class="ln">207</span>     }
<span class="ln">208</span> }
<span class="ln">209</span> 
<span class="ln">210</span> Yii::$enableIncludePath = false;
<span class="error"><span class="ln error-ln">211</span> Yii::createApplication('LSYii_Application', $config)-&gt;run();
</span><span class="ln">212</span> 
<span class="ln">213</span> /* End of file index.php */
<span class="ln">214</span> /* Location: ./index.php */
</pre></div>			</td>
		</tr>
				</tbody></table>
	</div>

	<div class="version">
		2018-09-05 15:09:29 Apache/2.4.18 (Ubuntu) <a href="http://www.yiiframework.com/">Yii Framework</a>/1.1.16	</div>
</div>

<script type="text/javascript">
/*<![CDATA[*/
var traceReg = new RegExp("(^|\\s)trace-file(\\s|$)");
var collapsedReg = new RegExp("(^|\\s)collapsed(\\s|$)");

var e = document.getElementsByTagName("div");
for(var j=0,len=e.length;j<len;j++){
	if(traceReg.test(e[j].className)){
		e[j].onclick = function(){
			var trace = this.parentNode.parentNode;
			if(collapsedReg.test(trace.className))
				trace.className = trace.className.replace("collapsed", "expanded");
			else
				trace.className = trace.className.replace("expanded", "collapsed");
		}
	}
}
/*]]>*/
</script>



</body></html>
PHP-notice.html (17,928 bytes)   
Bug heat4
Complete LimeSurvey version number (& build)Version 2.6.7-lts Build 171212
I will donate to the project if issue is resolvedNo
BrowserFirefox
Database type & versionMySQL 5.7
Server OS (if known)Ubuntu Linux 16.04LTS
Webserver software & version (if known)Apache 2.4.18
PHP Version7.2

Users monitoring this issue

There are no users monitoring this issue.

Activities

AdrianB

AdrianB

2018-09-06 02:56

reporter   ~48978

We have discovered that the issue occurred because there was a response for that token in response table, but no corresponding token record in the token table for that response. Once I removed the offending response from the responses table, bounce processing started to work again for this survey.

cdorin

cdorin

2019-11-26 17:41

reporter   ~54793

Hello @AdrianB, and thank you for your update.

I will now close the ticket

Issue History

Date Modified Username Field Change
2018-09-05 09:11 AdrianB New Issue
2018-09-05 09:11 AdrianB File Added: PHP-notice.html
2018-09-06 02:56 AdrianB Note Added: 48978
2019-11-26 17:41 cdorin Assigned To => cdorin
2019-11-26 17:41 cdorin Status new => closed
2019-11-26 17:41 cdorin Resolution open => no change required
2019-11-26 17:41 cdorin Note Added: 54793