Improve error reporting for XML RPCs

- If handling an XML RPC, use set_error_handler() to output PHP warnings as XML.
Otherwise they appear as strings in the XML reply, making them not parse.

- suppress warnings from PHP function calls where we're already checking errors
This commit is contained in:
David Anderson 2016-07-22 01:41:43 -07:00
parent 7a431cc54f
commit e11b62adab
6 changed files with 25 additions and 10 deletions

View File

@ -16,7 +16,7 @@
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
// PHP versions of functions in sched/sched_util.C
// PHP versions of functions in sched/sched_util.cpp
function filename_hash($filename, $fanout) {
$m = md5($filename);

View File

@ -44,7 +44,7 @@ function show_page($x, $y) {
";
}
function xml_error($num, $msg=null) {
function xml_error($num, $msg=null, $file=null, $line=null) {
if (!$msg) {
switch($num) {
case -112: $msg = "Invalid XML"; break;
@ -64,8 +64,14 @@ function xml_error($num, $msg=null) {
echo "<error>
<error_num>$num</error_num>
<error_msg>$msg</error_msg>
</error>
";
if ($file) {
echo " <file>$file</file>\n";
}
if ($line) {
echo " <line>$line</line>\n";
}
echo "</error>\n";
exit();
}

View File

@ -29,8 +29,19 @@ function db_init_xml() {
return 0;
}
function handler($errno, $errstr, $errfile, $errline) {
echo "<error>
<error_msg>$errstr</error_msg>
<file>$errfile</file>
<line>$errline</line>
</error>
";
}
function xml_header() {
global $generating_xml;
set_error_handler('handler', E_ALL);
header('Content-type: text/xml');
echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
$generating_xml = true;

View File

@ -192,7 +192,7 @@ if (0) {
xml_header();
$r = simplexml_load_string($_POST['request']);
if (!$r) {
xml_error(-1, "can't parse request message");
xml_error(-1, "can't parse request message", __FILE__, __LINE__);
}
switch($r->getName()) {

View File

@ -117,8 +117,6 @@ function handle_edit_form() {
}
$q = (string) $usub->quota;
$mj = $usub->max_jobs_in_progress;
$sav = $usub->create_app_versions?"checked":"";
$sa = $usub->create_apps?"checked":"";
echo "
<p>
Quota: <input name=quota value=$q>

View File

@ -132,28 +132,28 @@ function stage_file($file) {
// read the file (from disk or network) to get MD5.
// Copy to download hier, using a physical name based on MD5
//
$md5 = md5_file($file->source);
$md5 = @md5_file($file->source);
if (!$md5) {
xml_error(-1, "BOINC server: Can't get MD5 of file $file->source");
}
$name = "jf_$md5";
$path = dir_hier_path($name, $download_dir, $fanout);
if (file_exists($path)) return $name;
if (!copy($file->source, $path)) {
if (!@copy($file->source, $path)) {
xml_error(-1, "BOINC server: can't copy file from $file->source to $path");
}
return $name;
case "local_staged":
return $file->source;
case "inline":
$md5 = md5($file->source);
$md5 = @md5($file->source);
if (!$md5) {
xml_error(-1, "BOINC server: Can't get MD5 of inline data");
}
$name = "jf_$md5";
$path = dir_hier_path($name, $download_dir, $fanout);
if (file_exists($path)) return $name;
if (!file_put_contents($path, $file->source)) {
if (!@file_put_contents($path, $file->source)) {
xml_error(-1, "BOINC server: can't write to file $path");
}
return $name;