diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php index 0c82e21e30d47..b48493c13532e 100644 --- a/lib/private/Files/Cache/Scanner.php +++ b/lib/private/Files/Cache/Scanner.php @@ -221,8 +221,17 @@ public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = } // Only update metadata that has changed - $newData = array_diff_assoc($data, $cacheData->getData()); - + // i.e. get all the values in $data that are not present in the cache already + // NOTE: we serialize then unserialize here because array_diff_assoc() doesn't + // support multidimensional arrays on its own (and otherwise internally casts any + // embedded array elements to attempt to compare them - not only generating warnings + // like "Array to string conversion" but also, as a resut, overlooking real differences) + $newData = array_diff_assoc( + array_map('serialize', $data), + array_map('serialize', $cacheData->getData()) + ); + $newData = array_map('unserialize', $newData); + // make it known to the caller that etag has been changed and needs propagation if (isset($newData['etag'])) { $data['etag_changed'] = true;