Ich bin dazu zu faul. Ich will ja nichts von der Mailingiste, sondern was bringen.
Da es ja niemanden zu intressieren scheint. Habe ich mal näher geguckt.
Ich lese zwar hier immer wieder mit, aber dieser Thread ist mir anscheinend echt durch die Lappen gegangen
Am sichersten ist es immer, mir sowas per Email zu schicken (muß nicht über die VDR-ML gehen).
Danke jedenfalls fürs "gucken".
Zitat
Der Bug ist in VDR.
--- remux.c.orig 2012-01-12 10:08:11.388006000 +0100
+++ remux.c 2012-01-12 10:11:14.245006788 +0100
@@ -700,8 +700,13 @@
if (offset) {
uchar *p = data + offset - 6;
if (p != data) {
- p -= 3;
- memmove(p, data, 4);
+ if (p - 3 < data) {
+ esyslog("ERROR: pointer before data offset=%d", offset);
+ }
+ else {
+ p -= 3;
+ memmove(p, data, 4);
+ }
}
int l = min(length - offset, MAXPESLENGTH);
offset += l;
Alles anzeigen
Dies fixt nur den Crash. Die Ursache, daß offset = 7 ist, muß nun wirklich jemand anderes suchen.
Edit: da war ein Fehler im diff.
Johns
Alles anzeigen
Warum hier p < data wird ist schwer zu sagen, aber ich vermute mal, daß beim Umschalten ein paar kaputte TS-Pakete kommen.
Es macht also durchaus Sinn, an dieser Stelle p zu überprüfen. Zur Sicherheit würde ich dann sogar so weit gehen, einen Reset zu machen.
Kannst du bitte mal folgendes ausprobieren?
--- remux.c 2011/09/04 13:09:06 2.62
+++ remux.c 2012/01/12 12:07:58
@@ -701,6 +701,10 @@
uchar *p = data + offset - 6;
if (p != data) {
p -= 3;
+ if (p < data) {
+ Reset();
+ return NULL;
+ }
memmove(p, data, 4);
}
int l = min(length - offset, MAXPESLENGTH);
Alles anzeigen
Zum Testen kannst du vor dem Reset() ja noch eine Debug-Ausgabe reinmachen, um zu verifizieren, daß der Code auch wirklich mal durchlaufen wird.
Ich selber benutze eine FF-Karte für die Ausgabe, daher tritt der Fehler bei mir nicht auf und ich kann es auch selber schlecht testen.
Falls du in der HISTORY genannt werden möchtest, schick mir bitte eine Email mit deinem vollen Namen.
Klaus