Issue Details (XML | Word | Printable)

Key: MDL-10905
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Blocker Blocker
Assignee: Nicolas Connault
Reporter: Scott Turner
Votes: 0
Watchers: 3
Operations

Add/Edit UI Mockup to this issue
If you were logged in you would be able to see more operations.
Moodle

Backup misses files if a directory name evaluates to false (eg. "0")

Created: 18/Aug/07 11:53 AM   Updated: 15/Oct/07 01:53 PM
Return to search
Component/s: Backup, Other
Affects Version/s: 1.8.2, 1.9, 2.0
Fix Version/s: 1.6.6, 1.7.4, 1.8.4, 1.9, 2.0

Issue Links:
Dependency
 

Participants: Eloy Lafuente (stronk7), Martin Dougiamas, Nicolas Connault and Scott Turner
Security Level: None
Resolved date: 15/Oct/07
Affected Branches: MOODLE_18_STABLE, MOODLE_19_STABLE, MOODLE_20_STABLE
Fixed Branches: MOODLE_16_STABLE, MOODLE_17_STABLE, MOODLE_18_STABLE, MOODLE_19_STABLE, MOODLE_20_STABLE


 Description  « Hide
The backup_copy_dir and delete_dir_contents functions in the backup/lib.php file do not work correctly if there is a directory (or file?) name that evaluates to false (eg. "0"). This will result in files not being copied for backup or deleted correctly. In those functions, there is a while loop that uses
$file=readdir($dir)
as its condition which can return valid files that evaluate to false. It is handled correctly in other files with something like
false !== ($file = readdir($handle))

There are other occurrences in the code of this bug including admin/delete.php: delete_subdirectories and backup/bb/restore_bb.php: get_subdirs. There may be others as well.


 All   Comments   Change History   Version Control      Sort Order: Ascending order - Click to sort in descending order
Eloy Lafuente (stronk7) added a comment - 02/Sep/07 05:45 PM
Hi Scott,

but that only can happen if we are talking about relative paths (where a "0" dir name can have the explained effect).... but all those Moodle functions are running against absolute paths (where $CFG->dataroot is prepended).

So, perhaps it's impossible in real life?

Thanks and ciao


Scott Turner added a comment - 03/Sep/07 03:26 AM - edited
This can be duplicated by going to the course files and adding a directory named "0". When the data is backed up, that directory and all files/directories added after it will not be in the backup. If the name of the directory is changed from "0" the backup will proceed correctly.

Those functions may all run with absolute paths, but internally they do not use them. readdir returns a filename and not a path, so the code that uses:

$file=readdir($dir)

as a condition will fail incorrectly at times. The php manual makes an explicit note of this. (http://us3.php.net/readdir)


Eloy Lafuente (stronk7) added a comment - 17/Sep/07 02:39 AM
100% agree. Going to propose this to be changed across Moodle code... thanks!

Martin Dougiamas added a comment - 12/Oct/07 12:26 AM
While you're looking at files, Nicolas, can you look into this?

Eloy Lafuente (stronk7) added a comment - 14/Oct/07 05:38 AM
Raising this to blokcer because of MDL-8605. That upgrade can be breaking sites using the new "user/0" folder.

Nicolas Connault added a comment - 15/Oct/07 01:46 PM - edited
This actually affects all versions from 1.6 onwards: 13 files (the same in each version) have incorrect iterations through readdir(). I fixed them all by simply adding ...

false !== ([code])

... as suggested in the php doc.


Nicolas Connault added a comment - 15/Oct/07 01:53 PM
All fixed