diff --git a/repository/lib.php b/repository/lib.php index 69a393799cb..7f22e6b9cb2 100644 --- a/repository/lib.php +++ b/repository/lib.php @@ -1141,11 +1141,17 @@ abstract class repository { return; } - // do NOT mess with permissions here, the calling party is responsible for making - // sure the scanner engine can access the files! - + $clamparam = ' --stdout '; + // If we are dealing with clamdscan, clamd is likely run as a different user + // that might not have permissions to access your file. + // To make clamdscan work, we use --fdpass parameter that passes the file + // descriptor permissions to clamd, which allows it to scan given file + // irrespective of directory and file permissions. + if (basename($CFG->pathtoclam) == 'clamdscan') { + $clamparam .= '--fdpass '; + } // execute test - $cmd = escapeshellcmd($CFG->pathtoclam).' --stdout '.escapeshellarg($thefile); + $cmd = escapeshellcmd($CFG->pathtoclam).$clamparam.escapeshellarg($thefile); exec($cmd, $output, $return); if ($return == 0) { diff --git a/repository/upload/lib.php b/repository/upload/lib.php index d2c1fdda42c..47ad7a4be26 100644 --- a/repository/upload/lib.php +++ b/repository/upload/lib.php @@ -141,12 +141,7 @@ class repository_upload extends repository { } } - // scan the files, throws exception and deletes if virus found - // this is tricky because clamdscan daemon might not be able to access the files - $permissions = fileperms($_FILES[$elname]['tmp_name']); - @chmod($_FILES[$elname]['tmp_name'], $CFG->filepermissions); self::antivir_scan_file($_FILES[$elname]['tmp_name'], $_FILES[$elname]['name'], true); - @chmod($_FILES[$elname]['tmp_name'], $permissions); // {@link repository::build_source_field()} $sourcefield = $this->get_file_source_info($_FILES[$elname]['name']);