Czy ktoś może wyjaśnić, do czego służy następujący kod wprowadzony między Magento CE 1.9.1.0 a 1.9.2.0?
class Varien_Image_Adapter_Gd2:
public function __construct()
{
// Initialize shutdown function
register_shutdown_function(array($this, 'destruct'));
}
/**
* Destroy object image on shutdown
*/
public function destruct()
{
@imagedestroy($this->_imageHandler);
}
Po dodaniu tych dwóch funkcji nasz import obrazów galerii produktów z interfejsem ImportExport przestał działać. Błąd wynika z limitu pamięci (który jest limitem maksymalnej wielkości otwartego pliku).
Mój pomysł jest taki, że pliki otwarte przez import nie zostaną poprawnie zamknięte.
Widziałem także, że wprowadzono pewne puste destruct()
funkcje ( Mage_ImportExport_Model_Import_Adapter_Abstract
) - ale rozszerzenie tych, aby pasowały do logiki nadrzędnej, nie pomaga.
źródło
Mam te same problemy z moim Magento 1.9.2.0 ...
Pracuję tylko, zmieniając Varien_Image_Adapter_Gd2 w
/lib/Varien/Image/Adapter/Gd2.php
następujący sposób:Ustawiłem memory_limit z powrotem na 1G (wcześniej zwiększyłem do 32 GB), a teraz działa ...
Ten projekt implementuje wspomnianą procedurę w sposób przyjazny dla modmana. Po prostu zainstaluj go z kompozytorem i gotowe.
źródło
Było to częścią naprawiania problemów związanych z bezpieczeństwem za pomocą unserialize. Magiczne metody, takie jak __destruct, mają nieodłączne problemy z serializacją.
Widzieliśmy proponowane exploity wykorzystujące serializację i __destruct do tworzenia plików w systemie plików - i ta zmiana (zobaczysz więcej podobnych zmian w innych miejscach) została wprowadzona, aby tego uniknąć.
Czy powoduje wyciek pamięci lub po prostu zużywa więcej pamięci, dopóki skrypt się nie skończy?
/security/77549/is-php-unserialize-exploitable-without-any-interesting-methods
źródło
Podniosłem więc błąd w Magento, w tym „rozwiązanie”, które powinno rozwiązać problemy z wykorzystaniem pamięci w procesie importowania obrazu.
Rozwiązanie można znaleźć na github pod https://github.com/sitewards/import_image_memory_leak_fix, ale podstawową ideą jest.
Naprawienie
Mage_Catalog_Helper_Image::validateUploadFile
wywołaniadestruct
metody na procesorze obrazu. Niestety wygląda na to, że domyślnaVarien_Image
opcja nie zajmuje siędestruct
tak, więc musieliśmy dodać własną klasę, która to robi.A potem przepisanie pomocnika.
Nowa funkcja wywołuje nową możliwą do zniszczenia klasę obrazu.
źródło