[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Korrupte Files vom Apachen bei Kernel 4.9.0-0.bpo.3-amd64



Christian Brabandt <dug@256bit.org> (Mi 28 Jun 2017 22:59:57 CEST):
> Heiko Schlittermann schrieb am Mittwoch, den 28. Juni 2017:
> 
> > Im strace des Apachen sehe ich im (meiner Meinung nach) relevanten Teil folgendes:
> > 
> > 20948 15:52:17.602662 open("/var/www/hosts/…/_migrated/pics/Zitrone_Detailansicht.png", O_RDONLY|O_CLOEXEC) = 40
> > 20948 15:52:17.603024 mmap(NULL, 169065, PROT_READ, MAP_SHARED, 40, 0) = 0x7fa668a6d000
> > 20948 15:52:17.603104 writev(20, [...], 2) = 169398
> > 20948 15:52:17.603701 munmap(0x7fa668a6d000, 169065) = 0
> > 20948 15:52:17.603770 write(21, ""..., 186) = 186
> 
> Hast Du da noch was rausgekürzt?

Nein, nur den Pfadnamen habe ich eingekürzt. Die Ellipsis (oder wie die
... heissen) beim writev() hat strace selbst gemacht, ich denke, weil es
mit `-s0` gestartet wurde (mein Kollege vermutete, dass dann *alles*
aufgeschrieben wird und nicht nichts.)

> > Das oben beschriebene Problem taucht auf, seit wir den Kernel auf 4.9.0-0.bpo.3-amd64
> > aktualisiert haben. Der Rest ist ein „normales“ Jessie (Debian 8).
> > 
> > Wenn statt der statischen Datei ein Script startet und die Daten
> > liefert, dann funktioniert es.
> > 
> > In einem kleinen primitiven C-Programm, welches open/mmap/writev macht
> > wie der Apache, gibt es auch (in diesem Fall leider) keine Probleme.
> 
> Das hört sich ja schon sehr nach Kernel Bug an. Ich würde das einfach 
> mal bei bugzilla.kernel.org oder vielleicht eher bugs.debian.org 
> einkippen.

Ja, ich hoffe immer noch, einige Randbedingungen zu finden, unter denen
das reproduzierbar ist. Mit einem einfach kleinen Programm konnte ich es
nicht nachbauen.

Aber Kernel-Bug… writev() ist ja eigentlich was, was funktionieren
sollte.

Duplizität der Ereignisse. Ich beschäftige mich gerade in anderem
Zusammenhang mit der Atomizität von writev() und readv().

(Programm im Anhang)

-- 
Heiko
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <sys/uio.h>
#include <sys/mman.h>

#define FILE "/var/www/…/_migrated/pics/Zitrone_Detailansicht.png";

int main(int argc, char** argv) {
	int fd;

	const char *file = argc > 1 ? argv[1] : FILE;

	const char *header = 
		"HTTP/1.1 200 OK\r\n"
		"Date: Wed, 28 Jun 2017 15:23:59 GMT\r\n"
		"Server: Apache/2.4.10 (Debian)\r\n"
		"Last-Modified: Fri, 15 Apr 2016 14:25:33 GMT\r\n"
		"ETag: \"29469-53086c89c7140\"\r\n"
		"Accept-Ranges: bytes\r\n"
		"Content-Length: 169065\r\n"
		"X-UA-Compatible: IE=7; IE=8; IE=9; IE=10\r\n"
		"Keep-Alive: timeout=15, max=100\r\n"
		"Connection: Keep-Alive\r\n"
		"Content-Type: image/png\r\n"
		"\r\n";

	char *content;
	struct stat statbuf;

	    struct iovec iov[2] = {
		{ (void*) header, strlen(header) },	/* already known */
		{ },					/* filled later */
	};

	if (-1 == (fd = open(file, O_RDONLY|O_CLOEXEC))) {
		perror(file);
		exit(1) ;
	}
	if (-1 == fstat(fd, &statbuf)) {
		perror("stat"); 
		exit(1);
	}

	if (MAP_FAILED == (content = mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0))) {
		perror("mmap");
		exit(1);
	}

	iov[1].iov_base = (void*) content;		/* cast away const */
	iov[1].iov_len = statbuf.st_size;
	writev(1, iov, 2);

	exit(0);

}

Attachment: signature.asc
Description: PGP signature


Reply to: