[BUG] Sectionsd Bug ?

Das Original Benutzerinterface Neutrino-SD incl. zapit, sectionsd, yWeb etc...
re_Look
Interessierter
Interessierter
Beiträge: 47
Registriert: Mittwoch 10. Oktober 2007, 07:20

[BUG] Sectionsd Bug ?

Beitrag von re_Look »

Code: Alles auswählen

cvs diff: Diffing .                                                             
Index: dmxapi.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/dmxapi.cpp,v
retrieving revision 1.5
diff -u -r1.5 dmxapi.cpp
--- a/dmxapi.cpp        13 Jan 2005 10:48:02 -0000      1.5
+++ b/dmxapi.cpp        19 Feb 2009 10:52:00 -0000
@@ -116,6 +116,7 @@
        {
                printf("[sectionsd] getUTC: invalid %s section received: %02x %02x %02x %02x %02x\n",
                        TDT ? "TDT" : "TOT", cUTC[0], cUTC[1], cUTC[2], cUTC[3], cUTC[4]);
+               ::close(fd);
                return false;
        }

Index: sectionsd.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/sectionsd.cpp,v
retrieving revision 1.286
diff -u -r1.286 sectionsd.cpp
--- a/sectionsd.cpp     24 Jan 2009 17:34:45 -0000      1.286
+++ b/sectionsd.cpp     19 Feb 2009 10:52:03 -0000
@@ -2143,10 +2143,9 @@
                                s->second->eitScheduleFlag(), s->second->eitPresentFollowingFlag(),
                                s->second->runningStatus(), s->second->freeCAmode(),
                                s->second->nvods.size());
-/**    soll es in count ?
-                       + strlen(s->second->serviceName.c_str()) + 1
-                       + strlen(s->second->providerName.c_str()) + 1
-                       + 3;  **/
+
+               count += s->second->serviceName.length()+s->second->providerName.length()+1+1+3;
+
                if (count < MAX_SIZE_SERVICELIST)
                {
                        strcat(serviceList, daten);
 
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

Den ersten Teil habe ich committed. Beim zweiten Teil wird zweifelsohne jetzt falsch gezählt.
Ich behaupte aber, du zählst auch nicht richtig:
re_Look hat geschrieben:

Code: Alles auswählen

Index: sectionsd.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/sectionsd.cpp,v
retrieving revision 1.286
diff -u -r1.286 sectionsd.cpp
--- a/sectionsd.cpp     24 Jan 2009 17:34:45 -0000      1.286
+++ b/sectionsd.cpp     19 Feb 2009 10:52:03 -0000
@@ -2143,10 +2143,9 @@
                                s->second->eitScheduleFlag(), s->second->eitPresentFollowingFlag(),
                                s->second->runningStatus(), s->second->freeCAmode(),
                                s->second->nvods.size());
-/**    soll es in count ?
-                       + strlen(s->second->serviceName.c_str()) + 1
-                       + strlen(s->second->providerName.c_str()) + 1
-                       + 3;  **/
+
+               count += s->second->serviceName.length()+s->second->providerName.length()+1+1+3;
+
                if (count < MAX_SIZE_SERVICELIST)
                {
                        strcat(serviceList, daten);
 
Wozu "+1+1"? (Ich behaupte weiter oben das "count += 1 + ..." ist auch schon falsch).
re_Look
Interessierter
Interessierter
Beiträge: 47
Registriert: Mittwoch 10. Oktober 2007, 07:20

Re: [BUG] Sectionsd Bug ?

Beitrag von re_Look »

Wozu "+1+1"?
Weil 2 mal "strcat(serviceList, "\n");" da ist.
Naja ob ich 100% zähle, weiss ich auch nicht ;) , aber so wie jetzt ist, kann es segfaulten.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

Das "\n" wird 3 mal angehängt. Dafür ist die +3. Aber wofür sind die "+1"?
Ich sage, das sind "Angstbytes" ;)

Ich vermute, dass da mal jemand Platz für die '\0' am String-Ende gelassen hat, die tatsächlich aber gar nicht drangehangen werden.
re_Look
Interessierter
Interessierter
Beiträge: 47
Registriert: Mittwoch 10. Oktober 2007, 07:20

Re: [BUG] Sectionsd Bug ?

Beitrag von re_Look »

Jo, hast recht.
Apropos '\0' , wieso wird es nirgendwo in sectionsd am Ende dran gehängt ?
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

Ich sagte nicht "nirgends". Aber in diesem Fall hängt halt nur ganz hinten einmal ein \0 dran, und nicht nach jedem strcat "in der Mitte", so wie anscheinend gezählt wurde.
re_Look
Interessierter
Interessierter
Beiträge: 47
Registriert: Mittwoch 10. Oktober 2007, 07:20

Re: [BUG] Sectionsd Bug ?

Beitrag von re_Look »

Ich meine nicht bei jeden strcat bzw in schleife sonder, danach vor "msgResponse.dataLength = strlen(serviceList) + 1;" .
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

Das ist IMHO schon korrekt. Aber ich werde es mir mal genauer anschauen.
Ist auf die TODO-Liste gepushed ;)
re_Look
Interessierter
Interessierter
Beiträge: 47
Registriert: Mittwoch 10. Oktober 2007, 07:20

Re: [BUG] Sectionsd Bug ?

Beitrag von re_Look »

Wie lange ist deine TODO Liste ? :D
Hier noch ein BUG bzw Fix.

Code: Alles auswählen

cvs diff: Diffing .
Index: sectionsd.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/sectionsd.cpp,v
retrieving revision 1.286
diff -u -r1.286 sectionsd.cpp
--- a/sectionsd.cpp     24 Jan 2009 17:34:45 -0000      1.286
+++ b/sectionsd.cpp     20 Feb 2009 14:42:36 -0000
@@ -4769,8 +4769,8 @@
 {
        struct sectionsd::msgResponseHeader responseHeader;
        responseHeader.dataLength = 0;
-       char * buf = (char*)malloc(64);
-       char *val = (char*)malloc(32);  // needed for SETENV?-macros
+       char * buf = new char[64];;
+       char *val = new char[32];;      // needed for SETENV?-macros
        int count;
        if (val && buf && (count = readlink("/proc/self/exe", buf, 63)) >= 0) {
                buf[count] = '\0';
@@ -4805,7 +4805,8 @@
        execv(buf, p);
        perror("[sectionsd] commandRestart execv");
        fprintf(stderr, "[sectionsd] ERROR! This is impossible!\n\n");
-       free(buf);
+       delete[] buf;
+       delete[] val;
 }

 struct s_cmd_table
GetAway
Contributor
Beiträge: 1509
Registriert: Donnerstag 27. Dezember 2007, 12:59

Re: [BUG] Sectionsd Bug ?

Beitrag von GetAway »

Also, wenn dies nicht nur eine Schönheitskorrektur ist, sollte es nochmal jemand
unter die Lupe nehmen und einchecken.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

Das letzte ist eine Schönheitskorrektur (wenn der sectionsd an der Stelle ankommt, wo er den Speicher freigibt, hast du ein anderes Problem ;))

Das falsche Zählen ist mir bisher in der Praxis nicht aufgefallen (durch segfaults oder so), aber ja, man sollte das anschauen.
re_Look
Interessierter
Interessierter
Beiträge: 47
Registriert: Mittwoch 10. Oktober 2007, 07:20

Re: [BUG] Sectionsd Bug ?

Beitrag von re_Look »

seife hat geschrieben:Das letzte ist eine Schönheitskorrektur (wenn der sectionsd an der Stelle ankommt, wo er den Speicher freigibt, hast du ein anderes Problem ;))
Wenn fehlende free nur Schönheitskorrektur ist, dann weiß ich nicht was ein BUG ist und wenn die code nicht gebraucht wird, wieso ist die überhaupt in sectionsd gelandet ?
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

Hinter dem execve() solltest du nie ankommen. Insofern hat du recht, das free() könnte auch noch weg.

(und ja, letzte Woche ist mein sectionsd hinter dem execve angekommen, aber da waren die paar bytes leaked memory dann auch egal ;))
re_Look
Interessierter
Interessierter
Beiträge: 47
Registriert: Mittwoch 10. Oktober 2007, 07:20

Re: [BUG] Sectionsd Bug ?

Beitrag von re_Look »

Ich hab noch ein Patch.
Wenn jemand es testen will.
Bitte Speicher verbrauch in Auge behalten. ;)

Code: Alles auswählen

Index: SIevents.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/SIevents.cpp,v
retrieving revision 1.35
diff -u -r1.35 SIevents.cpp
--- a/SIevents.cpp	16 Aug 2008 19:23:18 -0000	1.35
+++ b/SIevents.cpp	6 Mar 2009 08:31:14 -0000
@@ -75,6 +75,7 @@
 	transport_stream_id = _transport_stream_id;
 	service_id          = _service_id;
 	eventID		    = _event_id;
+	running=0;
 /*	contentClassification = "";
 	userClassification = "";
 	itemDescription = "";
Index: SIevents.hpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/SIevents.hpp,v
retrieving revision 1.29
diff -u -r1.29 SIevents.hpp
--- a/SIevents.hpp	16 Aug 2008 19:23:18 -0000	1.29
+++ b/SIevents.hpp	6 Mar 2009 08:31:15 -0000
@@ -341,6 +341,7 @@
 		original_network_id = 0;
 		transport_stream_id = 0;
 		eventID    = 0;
+		running=0;
 //      dauer=0;
 //      startzeit=0;
 	}
Index: SIservices.hpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/SIservices.hpp,v
retrieving revision 1.15
diff -u -r1.15 SIservices.hpp
--- a/SIservices.hpp	24 Feb 2009 19:09:10 -0000	1.15
+++ b/SIservices.hpp	6 Mar 2009 08:31:15 -0000
@@ -139,6 +139,7 @@
 		transport_stream_id = _transport_stream_id;
 		serviceTyp=0;
 		memset(&flags, 0, sizeof(flags));
+		is_actual = false;
 	}
 	// Std-Copy
 	SIservice(const SIservice &s) {
Index: sectionsd.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/sectionsd.cpp,v
retrieving revision 1.288
diff -u -r1.288 sectionsd.cpp
--- a/sectionsd.cpp	28 Feb 2009 13:57:50 -0000	1.288
+++ b/sectionsd.cpp	6 Mar 2009 08:31:18 -0000
@@ -667,8 +667,10 @@
 			writeLockEvents();
 			if (e->runningStatus() > 2) { // paused or currently running
 				if (!myCurrentEvent || (myCurrentEvent && (*myCurrentEvent).uniqueKey() != e->uniqueKey())) {
-					if (myCurrentEvent)
+					if (myCurrentEvent){
 						delete myCurrentEvent;
+						myCurrentEvent=NULL;
+					 }
 					myCurrentEvent = new SIevent(evt);
 					writeLockMessaging();
 					messaging_got_CN |= 0x01;
@@ -689,8 +691,10 @@
 			} else {
 				if ((!myNextEvent    || (myNextEvent    && (*myNextEvent).uniqueKey()    != e->uniqueKey() && (*myNextEvent).times.begin()->startzeit < e->times.begin()->startzeit)) &&
 				    (!myCurrentEvent || (myCurrentEvent && (*myCurrentEvent).uniqueKey() != e->uniqueKey()))) {
-					if (myNextEvent)
+					if (myNextEvent){
 						delete myNextEvent;
+						myNextEvent=NULL;
+					}
 					myNextEvent = new SIevent(evt);
 					writeLockMessaging();
 					messaging_got_CN |= 0x02;
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

re_Look hat geschrieben:Ich hab noch ein Patch.
Wenn jemand es testen will.
Bitte Speicher verbrauch in Auge behalten. ;)
Die initialisierungen kann man machen (aber bitte im selben Codingstyle wie die Umgebung ;)), den Rest kommentier ich inline...

Code: Alles auswählen

Index: SIevents.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/SIevents.cpp,v
retrieving revision 1.35
diff -u -r1.35 SIevents.cpp
--- a/SIevents.cpp	16 Aug 2008 19:23:18 -0000	1.35
+++ b/SIevents.cpp	6 Mar 2009 08:31:14 -0000
@@ -75,6 +75,7 @@
 	transport_stream_id = _transport_stream_id;
 	service_id          = _service_id;
 	eventID		    = _event_id;
+	running=0;
 /*	contentClassification = "";
 	userClassification = "";
 	itemDescription = "";
Index: SIevents.hpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/SIevents.hpp,v
retrieving revision 1.29
diff -u -r1.29 SIevents.hpp
--- a/SIevents.hpp	16 Aug 2008 19:23:18 -0000	1.29
+++ b/SIevents.hpp	6 Mar 2009 08:31:15 -0000
@@ -341,6 +341,7 @@
 		original_network_id = 0;
 		transport_stream_id = 0;
 		eventID    = 0;
+		running=0;
 //      dauer=0;
 //      startzeit=0;
 	}
Index: SIservices.hpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/SIservices.hpp,v
retrieving revision 1.15
diff -u -r1.15 SIservices.hpp
--- a/SIservices.hpp	24 Feb 2009 19:09:10 -0000	1.15
+++ b/SIservices.hpp	6 Mar 2009 08:31:15 -0000
@@ -139,6 +139,7 @@
 		transport_stream_id = _transport_stream_id;
 		serviceTyp=0;
 		memset(&flags, 0, sizeof(flags));
+		is_actual = false;
 	}
 	// Std-Copy
 	SIservice(const SIservice &s) {
Index: sectionsd.cpp
===================================================================
RCS file: /cvs/tuxbox/apps/tuxbox/neutrino/daemons/sectionsd/sectionsd.cpp,v
retrieving revision 1.288
diff -u -r1.288 sectionsd.cpp
--- a/sectionsd.cpp	28 Feb 2009 13:57:50 -0000	1.288
+++ b/sectionsd.cpp	6 Mar 2009 08:31:18 -0000
@@ -667,8 +667,10 @@
 			writeLockEvents();
 			if (e->runningStatus() > 2) { // paused or currently running
 				if (!myCurrentEvent || (myCurrentEvent && (*myCurrentEvent).uniqueKey() != e->uniqueKey())) {
-					if (myCurrentEvent)
+					if (myCurrentEvent){
 						delete myCurrentEvent;
+						myCurrentEvent=NULL;
+					 }
Unnötig, weil:

Code: Alles auswählen

 					myCurrentEvent = new SIevent(evt);
 					writeLockMessaging();
 					messaging_got_CN |= 0x01;
@@ -689,8 +691,10 @@
 			} else {
 				if ((!myNextEvent    || (myNextEvent    && (*myNextEvent).uniqueKey()    != e->uniqueKey() && (*myNextEvent).times.begin()->startzeit < e->times.begin()->startzeit)) &&
 				    (!myCurrentEvent || (myCurrentEvent && (*myCurrentEvent).uniqueKey() != e->uniqueKey()))) {
-					if (myNextEvent)
+					if (myNextEvent){
 						delete myNextEvent;
+						myNextEvent=NULL;
+					}
dasselbe

Code: Alles auswählen

 					myNextEvent = new SIevent(evt);
 					writeLockMessaging();
 					messaging_got_CN |= 0x02;
re_Look
Interessierter
Interessierter
Beiträge: 47
Registriert: Mittwoch 10. Oktober 2007, 07:20

Re: [BUG] Sectionsd Bug ?

Beitrag von re_Look »

Einverstanden "Chef". ;)
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

Und nur um keine Missverständnisse aufkommen zu lassen: ich finde es gut, dass du den Code systematisch durchschaust und bin dir dankbar dafür.
PauleFoul
Wissender
Wissender
Beiträge: 1839
Registriert: Sonntag 17. August 2003, 01:39

Re: [BUG] Sectionsd Bug ?

Beitrag von PauleFoul »

seife hat geschrieben:Und nur um keine Missverständnisse aufkommen zu lassen: ich finde es gut, dass du den Code systematisch durchschaust und bin dir dankbar dafür.
DITO!!
PT-1
Moderator english
Beiträge: 2458
Registriert: Donnerstag 20. Dezember 2001, 00:00

Re: [BUG] Sectionsd Bug ?

Beitrag von PT-1 »

Klasse Sache !
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: [BUG] Sectionsd Bug ?

Beitrag von mb405 »

ich habe seit langen mal mein cvs updatet, und image gebaut.
mit dem neuen sectionsd löscht mir der automatische hintergrundscan immer die kanäle :(
der 1.286 geht wunderbar.

kann das wer verifizieren ?
JimPoison
Einsteiger
Einsteiger
Beiträge: 312
Registriert: Samstag 29. November 2003, 00:20

Re: [BUG] Sectionsd Bug ?

Beitrag von JimPoison »

ja, das problem hab ich auch neuerdings. dachte schon an einen fehler meiner box und wollte neuflashen, aber das kann ich mir dann wohl sparen.
muß noch dazu sagen, daß bei mir immer kanäle des bouquets gelöscht werden, von dem ich gerade einen sender schaue. besonders der aktuell geschaute kanal verschwindet einfach, die box schaltet auf kanal 1 (bei mir ard) und in den bouquetlisten fehlen dann einige kanäle des vorher benutzten bouquets.
kurz vorm verschwinden eines senders wurde öfter die meldung angezeigt, daß der hintergrundcan neue kanäle gefunden hat, aber das neu angelegte bouquet "neue sender" war immer leer :gruebel:
seitdem ich vor ein paar stunden mal testweise den automatischen hintergrundscan ausgeschaltet habe, gibts keine probleme mehr
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: [BUG] Sectionsd Bug ?

Beitrag von mb405 »

klar denn du hast in /tmp ne currentservices.xml datei wo drin steht was er macht :)
da steht bei mir mit dem neuesten sectionsd dimmer "del" für löschen. ansonsten steht da.add und replace.

Code: Alles auswählen

...
       <sat name="Astra 19.2E" position="0192" diseqc="0">
		<transponder id="0441" onid="0001" frequency="12187500" inversion="2" symbol_rate="27500000" fec_inner="3" polarization="0">
			<channel action="add" service_id="2ee6" name="RTL FS" service_type="01"/>
			<channel action="replace" service_id="2f30" name="Channel 21" service_type="01"/>
			<channel action="replace" service_id="2f3f" name="Channel 21" service_type="01"/>
		</transponder>
	</sat>
...
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

reverte mal das: http://cvs.tuxbox-cvs.sourceforge.net/l ... 00213.html
Ich denke, dass da am ehesten der Wurm drinsteckt.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Re: [BUG] Sectionsd Bug ?

Beitrag von seife »

Ich habe es (hoffentlich) gefixt.
Allerdings hat es mir die bouquets nicht zerschossen, drum hatte ich das nicht gemerkt (liegt evtl. daran, dass ich "Bouquets nicht ändern" in meiner Kanalsuche eingestellt habe).
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: [BUG] Sectionsd Bug ?

Beitrag von mb405 »

nein die bouquets bleiben.
er sorgt durch die del einträge in der currentservices.xml für ein löschen der kanäle. in den bouquets sind se noch drin, nur in den services dann nimmer.