[2.0.18] Trying to access array offset on value of type null in Subs-Post.php

Started by sah62, February 28, 2021, 02:14:49 PM

Previous topic - Next topic

sah62

I'm running SMF 2.0.18, PHP 7.4, and nginx/1.18.0 (Ubuntu) . I'm seeing these two errors in my error log when the mail queue is processed as part of a scheduled task:

Quote
https://www.mysite.org/forum/index.php?scheduled=mailq;ts=1614539134
450 4.1.2 <[email protected]>: Recipient address rejected: Domain not found

Quote
https://www.mysite.org/forum/index.php?scheduled=mailq;ts=1614539134
8: Trying to access array offset on value of type null
File: /var/www/mysite/web/forum/Sources/Subs-Post.php
Line: 1452

The SMTP error is produced because the forum user's email address is invalid and the email can't be delivered. It's a legitimate error that the user needs to address by updating the email address associated with their forum profile.

Here's the code from Subs-Post.php:


1428 // Parse a message to the SMTP server.
1429 function server_parse($message, $socket, $response)
1430 {
1431         global $txt;
1432
1433         if ($message !== null)
1434                 fputs($socket, $message . "\r\n");
1435
1436         // No response yet.
1437         $server_response = '';
1438
1439         while (substr($server_response, 3, 1) != ' ')
1440                 if (!($server_response = fgets($socket, 256)))
1441                 {
1442                         // !!! Change this message to reflect that it may mean bad user/password/server issues/etc.
1443                         log_error($txt['smtp_bad_response']);
1444                         return false;
1445                 }
1446
1447         if ($response === null)
1448                 return substr($server_response, 0, 3);
1449
1450         if (substr($server_response, 0, 3) != $response)
1451         {
1452                 log_error($txt['smtp_error'] . $server_response);
1453                 return false;
1454         }
1455
1456         return true;
1457 }


I'm using the default theme with English language text. To reproduce this error, enqueue a message and process the queue as part of a scheduled task. The error does not occur when the queue is processed manually as part of a logged-in administrator session.

PHP 7.4 includes a backwards-incompatible change associated with trying to use values of type null, bool, int, float or resource as an array as described here:

https://www.php.net/manual/en/migration74.incompatible.php

Is it correct to assume that the index.english.php file doesn't get loaded as part of running a scheduled task and the $txt array is never initialized with values? If so, that would explain the error. $txt is null, and the attempt to reference $txt['smtp_error'] causes the error to be raised and the notice logged. It seems to be harmless beyond the failure to include the value of $txt['smtp_error'] in the logged error message and the extra notice being logged.

live627

QuoteIs it correct to assume that the index.english.php file doesn't get loaded as part of running a scheduled task and the $txt array is never initialized with values?
yeah, seems like it. I think that whoever wrote the task scheduler thought teat tasks would never need any languages. Actually the  task runner doesn't load much and thus produces random errors that we had to duct-tape fix.

shawnb61

Address the process rather than the outcome.  Then, the outcome becomes more likely.   - Fripp

Advertisement: