You are not logged in.

Dear visitor, welcome to VDR Portal. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Monday, January 2nd 2012, 5:03pm

[gelöst] VDR coredump und Speicherverletzungen beim Umschalten (patch für <1.7.23 enthalten)

So nach dem ich mir fast 100% sicher bin, daß in meinem Plugin keine Bugs mehr drin sind, die dies produzieren, bin ich diesem Problem nachgegangen.
Ich habe nach und nach alle Funktionen von meinem Plugin ausgeschaltet und es trat immer noch auf.
Also habe ich es mal mit dem vdr-dummydevice probiert und siehe da, es tritt da auch auf.

Entweder liegt es an VDR oder streamdev.

Es tritt auf mit vdr 1.7.21 (Gentoo) und 1.7.22 (Gentoo ext alles disabled) streamdev 0.5.1, 64 bit System.

Vdr aufrufen mit valgrind

Source code

1
valgrind --log-file=/tmp/valgrind.log --track-origins=yes --leak-check=yes /usr/bin/vdr --log=0 --plugin="streamdev-client" --plugin="dummydevice"


Test script zum umschalten:

Source code

1
while true; do for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 28 29 30 31; do svdrpsend.pl chan $i; sleep 0.5s; done; done

Die Kanäle sind die 30 wichtigsten Deutschen, HDTV und SDTV gemischt, spielt aber keine Rolle. Werde später versuchen dies zu reduzieren.

Edit: Dieses einfachere Script tut es auch.

Source code

1
while true; do svdrpsend.pl chan 1; sleep 0.5s; done

1 ist "Das Erste HD"

Ergebis: crash an den unterschiedlichsten Stellen oder

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
==30948== Memcheck, a memory error detector
==30948== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==30948== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==30948== Command: /usr/bin/vdr --log=0 --plugin=streamdev-client --plugin=dummydevice
==30948== Parent PID: 3593
==30948== 
==30948== Thread 7:
==30948== Invalid write of size 2
==30948==    at 0x4A0A640: memcpy@GLIBC_2.2.5 (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==30948==    by 0x4BAC51: cTsToPes::GetPes(int&) (in /usr/bin/vdr)
==30948==    by 0x46B3CA: cDevice::PlayTsVideo(unsigned char const*, int) (in /u
sr/bin/vdr)
==30948==    by 0x46AFF1: cDevice::PlayTs(unsigned char const*, int, bool) (in /usr/bin/vdr)
==30948==    by 0x4DB3BA: cTransfer::Receive(unsigned char*, int) (in /usr/bin/vdr)
==30948==    by 0x46DD22: cDevice::Action() (in /usr/bin/vdr)
==30948==    by 0x4D3087: cThread::StartThread(cThread*) (in /usr/bin/vdr)
==30948==    by 0x377A207DFB: start_thread (in /lib64/libpthread-2.14.1.so)
==30948==    by 0x37796EC21C: clone (in /lib64/libc-2.14.1.so)
==30948==  Address 0x11b2fb7e is 2 bytes before a block of size 302,008 alloc'd
==30948==    at 0x4A09042: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==30948==    by 0x4BAA7F: cTsToPes::PutTs(unsigned char const*, int) (in /usr/bin/vdr)
==30948==    by 0x46B42D: cDevice::PlayTsVideo(unsigned char const*, int) (in /usr/bin/vdr)
==30948==    by 0x46AFF1: cDevice::PlayTs(unsigned char const*, int, bool) (in /usr/bin/vdr)
==30948==    by 0x4DB3BA: cTransfer::Receive(unsigned char*, int) (in /usr/bin/vdr)
==30948==    by 0x46DD22: cDevice::Action() (in /usr/bin/vdr)
==30948==    by 0x4D3087: cThread::StartThread(cThread*) (in /usr/bin/vdr)
==30948==    by 0x377A207DFB: start_thread (in /lib64/libpthread-2.14.1.so)
==30948==    by 0x37796EC21C: clone (in /lib64/libc-2.14.1.so)
==30948== 
==30948== 
==30948== HEAP SUMMARY:
==30948==     in use at exit: 300,273 bytes in 1,091 blocks
==30948==   total heap usage: 1,359,082 allocs, 1,357,991 frees, 910,033,885 bytes allocated
==30948== 
==30948== LEAK SUMMARY:
==30948==    definitely lost: 0 bytes in 0 blocks
==30948==    indirectly lost: 0 bytes in 0 blocks
==30948==      possibly lost: 0 bytes in 0 blocks
==30948==    still reachable: 300,273 bytes in 1,091 blocks
==30948==         suppressed: 0 bytes in 0 blocks
==30948== Reachable blocks (those to which a pointer was found) are not shown.
==30948== To see them, rerun with: --leak-check=full --show-reachable=yes
==30948== 
==30948== For counts of detected and suppressed errors, rerun with: -v
==30948== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 10 from 8)


Haben dies andere auch? Wo möglich ohne streamdev testen um diesen aus zuschließen.

Edit:
Habe nun die Kanäle reduziert es reichen (bis jetzt): Das Erste HD -> SAT.1 -> NICK/COMEDY (alle SAT Astra FTA).
5 Fehler in 1 Stunde also ca. alle 1440 Umschaltungen.

Edit:
Es reicht nur immer wieder auf NICK/COMEDY zuschalten, jetzt mal gucken ob es nur dieser Kanal ist.

Edit:
Es sind auch andere alleine z.b. SAT1 oder Das Erste HD.

Johns

This post has been edited 8 times, last edit by "johns" (Jan 12th 2012, 3:50pm)


2

Saturday, January 7th 2012, 5:51pm

Ist dies das falsche Forum?

Auf der VDR Mailing Liste geht es auch nicht zu posten, weil diese <bitte hier alle bekannten Schimpfworte einsetzen> keine Posts von Nicht Mitgliedern zulassen.

Johns
Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
Sag mir, wo die Developer sind. Was ist geschehn?

Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
Server0: Dockstar TT-S2-3600-USB / streamdev
Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

gda

Im Forum Zuhause

Posts: 13,206

Location: HH

  • Send private message

3

Saturday, January 7th 2012, 9:49pm

Auf der VDR Mailing Liste geht es auch nicht zu posten, weil diese <bitte hier alle bekannten Schimpfworte einsetzen> keine Posts von Nicht Mitgliedern zulassen.


Das ist doch völlig normal bei Mailing-Listen, sonst würde man doch vor lauter Spam nichts mehr finden.

Gerald

HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 12.04.2, Plex Media Server
Zbox HD-ID40, OpenELEC 4.0.2, PLEXBMC

4

Sunday, January 8th 2012, 10:02pm

Also dies ist die erste Mailingliste wo dies so ist.
Für den SPAM gibts es einen Moderator, der alle nicht registrierten Mails freischalten muss.

Normal ist man über jeden Bug Report, den man bekommt, froh, man sollte es deshalb nicht umbedingt erschweren.

Johns
Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
Sag mir, wo die Developer sind. Was ist geschehn?

Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
Server0: Dockstar TT-S2-3600-USB / streamdev
Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

5

Sunday, January 8th 2012, 10:42pm

Normal ist man über jeden Bug Report, den man bekommt, froh, man sollte es deshalb nicht umbedingt erschweren.


Es ist ja auch so schwer, sich für die ML anzumelden : http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr

6

Thursday, January 12th 2012, 10:16am

Es ehrt dich, wenn du es macht.

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.

Der Bug ist in VDR.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--- 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;


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
Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
Sag mir, wo die Developer sind. Was ist geschehn?

Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
Server0: Dockstar TT-S2-3600-USB / streamdev
Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

This post has been edited 1 times, last edit by "johns" (Jan 12th 2012, 1:04pm)


7

Thursday, January 12th 2012, 11:22am

Man kann sich anmelden und dann Postings abstellen. Posten und Lesen geht dann über gmane. Ist aber in der Tat etwas kompliziert. Bei anderen Listen kann man auch ohne den Umweg über die Anmeldung über gmane posten.

Im Zweifelsfall aber einfach direkt Klaus anschreiben. Ich glaube schon, dass er an deinem Fund interessiert ist. Er hat wohl lediglich noch nicht den Thread hier gefunden. Klaus ist auch der richtige wenn es darum geht, die eigentliche Ursache für den Fehler zu finden.

Adresse von Klaus steht hier ganz unten:
http://tvdr.de/

Wenn jemand eine Mail verfasst (habe aktuell keinen Zugriff auf meinen Mailer), dann bitte hier vermerken. Ansonsten sende ich heute Abend eine Mail.

kls

Master

Posts: 2,668

Location: Mettenheim

  • Send private message

8

Thursday, January 12th 2012, 1:23pm


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".

Quoted



Der Bug ist in VDR.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--- 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;


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


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?

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
--- 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);


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
Gib CI+/HD+ keine Chance! Lasst diese Pest am ausgestreckten Arm verhungern!
Wer für sowas bezahlt macht sich zum Totengräber von Projekten wie VDR!
Die Wahrheit ueber HD Plus
CI-Plus -- Das trojanische Pferd im Wohnzimmer

9

Thursday, January 12th 2012, 3:47pm

Der funktioniert, zumindest treten keine Speicherverletzungen mehr auf.
Es kann sein, das es auch wärend des normalen Betrieb passiert, deshalb sollten alle mit Meldung testen.

Die meisten haben ihre eigen TS -> PES demuxer, deshalb fällt es bisher nicht auf.

Johns
johns has attached the following file:
Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
Sag mir, wo die Developer sind. Was ist geschehn?

Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
Server0: Dockstar TT-S2-3600-USB / streamdev
Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch