Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #4753
| From | Hansjoerg Lipp <hjlipp@web.de> |
|---|---|
| Newsgroups | de.comp.lang.php |
| Subject | Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes |
| Date | 2021-12-13 04:01 +0100 |
| Message-ID | <j1nrc4Fg12qU1@mid.individual.net> (permalink) |
| References | (7 earlier) <m1pmqdn83a.fsf@mbp.pflaesterer.de> <j0uq9gFlun4U1@mid.individual.net> <m1lf11n0c2.fsf@mbp.pflaesterer.de> <j1ffp8Fsfe5U1@mid.individual.net> <m15yrwnouy.fsf@mbp.pflaesterer.de> |
[ Sorry für die folgende "Rechtschreibschwäche", ich bin etwas müde... ]
Am 10.12.21 um 22:15 schrieb Karl Pflästerer:
> Hansjoerg Lipp <hjlipp@web.de> writes:
>>
>> Ein möglicher Mechanismus wäre folgender: In mail() wird eine 32-Bit
>> Variable, die den Speicherbedarf enthält, mit einem 64-Bit-Zugriff
>> gelesen. Ob dies zu einem Fehler führt, hängt nun davon ab, ob der
>> Speicherbereich nach dieser Variable nur Nullen enthält. In diesem Fall
>> ist alles in Ordnung. Unter manchen Umständen sind dort aber nicht nur
>> Nullen; manchmal liegen da z.B. ASCII-Daten (siehe OP); dann geschieht
>> der Fehler. Ich weiß nicht, wie php intern funktioniert. Ich könnte
>> spekulieren, dass für String-Variablen genullter Speicher in gewissen
>> Größenabstufungen angefordert wird, der dann mit dem String gefüllt
>> wird. Dann ist je nach String-Variable hinten String-Inhalt oder eben
>> nur Nullen. Vielleicht liegt die 32-Bit-Variable an einer Stelle im
>> Speicher, an der zuvor eine String-Variable lag? Vielleicht wird mit
>> OPCache Speicher nicht genullt? Spekulationen sind hier leider müßig,
>> solange ich kein System habe, auf dem ich das Problem reproduzieren kann.
>
>
> Sei mir nicht böse, aber obiges erscheint mir extrem spekulativ. Wie
> kommst du darauf, dass auf dem Host irgendetwas nicht für 64bit
> kompiliert ist? Im Serverbereich hat man (zumindest unter linux) schon
> seit vielen Jahren nur 64bit Systeme.
Dass die Details spekulativ sind, schrieb ich ja. Dass diese Art von
Fehlern bei "systemnäherer" Programmierung vorkommt, ist dagegen
gar nicht so selten (bei Projekten, in denen gerne mal die
Compilerwarnungen heruntergedreht werden oder so zahlreich sind, dass
sie ignoriert werden).
Es geht hierbei nicht darum, dass etwas nicht für eine 64-Bit-Platform
compiliert ist, sondern um die Datentypen der Variablen. Hier wird die
Größe des angeforderten Speichers in einer 64-Bit-Variable hinterlegt
(size_t, siehe zend_mm_alloc_huge oder zend_mm_realloc_huge). Wenn jetzt
irgendwo in mail() oder irgendetwas dazugepatchtem (oder entsprechend in
irgendwelchen Stringfunktionen) die Größe erst mal in einer unsigned
32-Bit-Variable liegt, die man als Pointer kreuz und quer über
Funktionsaufrufe herumschickt, passieren solche Dinge.
Wenn man sich alle Log-Ausgaben ansieht, hat im Fehlerfall die Größe des
angeforderten Speichers (Parameter size_t size von
zend_mm_{re]alloc_huge()) immer Werte der Art
0x2073676e00000152
0x6874207200000152
0x00007f2e00000152
0x656c502000000152
0x5d3d485400000152
Die niederen 32 Bits sind also immer plausibel, die höherwertigen 32
Bits müssen dagegen 0 sein, sind es aber nicht. Diese enthalten
irgendwelchen Datenmüll, meist ASCII-Daten. Dafür gibt es zwei mögliche
Erklärungen:
1. Die oberen 32 Bits wurden nach Berechnung der gewünschten
Speichergröße überschrieben, durch fehlerhafte Pointer,
Probleme in der Speicherverwaltung, ...
2. Die oberen 32 Bits wurden nie initialisiert.
Ich tippe auf 2., weil das auch erklären könnte, warum ohne OPCache kein
Fehler auftritt, wenn man spekuliert, dass in diesem Fall frischer
Speicher genullt wird. Meiner Erfahrung nach führen Fehler der 1. Art
auch ohnehin zu so großen Problemen, dass die Symptome viel auffälliger
sein müssten.
Also mal als Semi-Pseudo-Code:
struct spezial_struct {
char *spezial_string_des_hosters;
size_t size;
};
void berechne_platzbedarf(unsigned *size)
{
*size = 42;
}
PHP_FUNCTION(mail)
{
....
struct spezial_struct *sp = spezial_alloc(sizeof *sp);
berechne_platzbedarf(&sp->size);
sp->spezial_string_des_hosters = zend_mm_alloc_huge(..., sp->size);
....
}
Hier werden in berechne_platzbedarf() die unteren 32 Bits von sp->size
gesetzt, die oberen sind dagegen unverändert die, die spezial_alloc()
zurückgegeben hat. Das Ergebnis bekommt dann zend_mm_alloc_huge() als
Parameter. Wurde der Speicher in spezial_alloc() genullt, ist das kein
Problem, anderenfalls wird ein sehr großer Speicherbereich angefordert.
Es gibt schon einige plausible Szenarien, nur werde ich das ohne den
Quelltext nicht lösen können. Ist ja auch eigentlich nicht meine Aufgabe:-/
> Wenn ein Prozess auf Speicherbereiche zugreift, die ihm nicht geören
> erwarte ich eine segfault, nicht eine ordentliche Fehlermeldung.
Innerhalb des Prozesses nicht. Und bei der 2. Möglichkeit passiert ja
auch nicht mal das.
> Dann wird es an diesem Environment luegen und nicht an PHP.
> Hoster wechseln.
Wenn ich gerade nicht so viel anderes zu tun hätte, wäre ich so langsam
tatsächlich genervt genug... Das war aber halt vor gefühlt 100 Jahren
anders, da hat alles ordentlich funktioniert, und der gelegentliche
PHP-Bug wurde auf einen Hinweis hin gepatcht...
Viele Grüße
Hansjörg
Back to de.comp.lang.php | Previous | Next — Previous in thread | Next in thread | Find similar
Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-11-30 22:37 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes k@rl.pflaesterer.de (Karl Pflästerer) - 2021-12-01 18:52 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-12-01 21:44 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes k@rl.pflaesterer.de (Karl Pflästerer) - 2021-12-02 15:52 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-12-02 22:01 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes k@rl.pflaesterer.de (Karl Pflästerer) - 2021-12-02 23:10 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-12-02 23:30 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes k@rl.pflaesterer.de (Karl Pflästerer) - 2021-12-03 14:14 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-12-03 16:09 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes k@rl.pflaesterer.de (Karl Pflästerer) - 2021-12-03 17:02 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-12-09 23:54 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes k@rl.pflaesterer.de (Karl Pflästerer) - 2021-12-10 22:15 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-12-13 04:01 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Arno Welzel <usenet@arnowelzel.de> - 2021-12-11 00:03 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Arno Welzel <usenet@arnowelzel.de> - 2021-12-05 00:44 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-12-09 23:31 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Arno Welzel <usenet@arnowelzel.de> - 2021-12-10 18:15 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-12-13 04:48 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Arno Welzel <usenet@arnowelzel.de> - 2021-12-13 13:51 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Hansjoerg Lipp <hjlipp@web.de> - 2021-12-14 21:06 +0100
Re: Obskurer php-Bug: mail()+Referenzen => tried to allocate 6718605744721101138 bytes Arno Welzel <usenet@arnowelzel.de> - 2021-12-15 15:43 +0100
csiph-web