• ResueltoModerador almendron

    (@almendron)


    Me pasó el otro día al actualizar un tema y me ha vuelto a pasar hoy al actualizar una traducción:

    Warning: scandir(/tmp/phptmp/): failed to open dir: Permission denied in /xxx/wp-includes/functions.php on line 2479
    
    Warning: scandir(): (errno 13): Permission denied in /XXX/wp-includes/functions.php on line 2479
    
    Warning: array_diff(): Expected parameter 1 to be an array, bool given in XXX/wp-includes/functions.php on line 2479

    La función comprometida en esa línea es:

    // Prevent collisions with existing file names that contain dimension-like strings
    // (whether they are subsizes or originals uploaded prior to #42437).
    
    // The (resized) image files would have name and extension, and will be in the uploads dir.
    if ( @is_dir( $dir ) && $name && $ext ) {
    	// List of all files and directories contained in $dir (with the "dot" files removed).
    	$files = array_diff( scandir( $dir ), array( '.', '..' ) );
    
    	if ( ! empty( $files ) ) {
    		while ( _wp_check_existing_file_names( $filename, $files ) ) {
    			$new_number = (int) $number + 1;
    			$filename   = str_replace( array( "-{$number}{$ext}", "{$number}{$ext}" ), "-{$new_number}{$ext}", $filename );
    			$number     = $new_number;
    		}
    	}
    }

    Y la línea 2479 es exactamente esta:

    $files = array_diff( scandir( $dir ), array( '.', '..' ) );

    El error se produce desde que actualice a la 5.3.1.

    • Este debate fue modificado hace 4 años, 4 meses por almendron.
    • Este debate fue modificado hace 4 años, 4 meses por almendron.
Viendo 5 respuestas - de la 1 a la 5 (de un total de 5)
  • La función array_diff lo que hace es comparar dos matrices, una con el punto y los dos puntos (directorio actual y superior) y otra matriz con todos los archivos y directorios de cierta ruta y se queda con la diferencia, es decir, elimina de dicha matriz el directorio actual y superior (punto y dos puntos), que también se devuelve al escanear cualquier directorio con la función scandir.

    Dicho, esto, el error, es debido a que la función scandir no tiene permisos para escanear o leer el directorio indicado, es decir, problema de permisos. En este caso concreto, el problema con los permisos es sobre la ruta /tmp/phptmp/ y al no poderlo escanear, no devuelve la matriz correspondiente y lleva al siguiente error, donde se espera que el primer parámetro sea una matriz (y es una cadena string con el error).

    La solución depende del sistema y podría pasar por cambiar la ruta de archivos temporales de php a una con permisos, o que la ruta usada tenga permisos por el usuario web (normalmente www-data, aunque no siempre), habría que verlo en cada caso, ya que depende de configuraciones del servidor.

    Saludos.

    Moderador almendron

    (@almendron)

    Gracias @carloslongarela

    Después de leer tu respuesta, he buscado un poco más de información y al parecer se trata de un error en la nueva versión: en lugar de usar el directorio de subida, comprueba de forma errónea el temporal.

    https://wordpress.org/support/topic/wordpress-5-3-1-error/
    https://core.trac.wordpress.org/ticket/48960

    Según he leído, la versión 5.3.2, que ya está disponible, resolverá el problema.

    Gracias @almendron no había visto el ticket #48960 pero como bien indicas, parece que la actualización de hoy arregla este problema.

    Saludos.

    Estoy viendo en la solución aportada https://core.trac.wordpress.org/attachment/ticket/48960/48960.1.diff que lo que han hecho es silenciar la lectura del directorio con una @ antes de la función, así aunque de fallo no se muestra ($files = @scandir( $dir );) y después sólo se ejecuta array_diff si la primera matriz existe.

    • Esta respuesta fue modificada hace 4 años, 4 meses por Carlos Longarela. Razón: syntax
    Moderador almendron

    (@almendron)

    Gracias por la información, @carloslongarela

Viendo 5 respuestas - de la 1 a la 5 (de un total de 5)
  • El debate ‘«Warning» al actualizar’ está cerrado a nuevas respuestas.