ReGaHSS: .DayProfileEntry() -> Absturz der ReGaHSS
Describe the issue you are experiencing
Wird die Methode .DayProfileEntry() mit einem Indexwert grüßer als 23 oder kleiner als 0 im 1. Parameter AIndex aufgerufen, dann kommt es zu unvorhersehbaren Aktionen.
Wird zum Beispiel ein Indexwert von 21738156 angegeben, dann stürzt der ReGaHSS-Prozess ab.
Ein Indexwert von 49 greift auf den Werteeintag der Methode .DayTypeProgId() zu.
Ein Indexwert von 51 hingegen greift auf den Werteeintag der Methode .PrgInfo() zu, wobei bei schreibendem Zugriff die ReGaDom-Struktur beschädigt werden kann, so dass ein korrektes Parsen der Datei nicht mehr möglich ist. Hierbei wird der eingegebene Integerwert in einen String und umgekehrt konvertiert.
Es wird kein Fehler in das Fehlerprotokoll eingetragen.
Describe the behavior you expected
Wird die Methode .DayProfileEntry() im 1. Parameter mit einem Indexwert ausserhalb des gültigen Wertebereichs von 0 bis 23 aufgerufen, dann sollte eine entsprechende Fehlermeldung ins Fehlerprotokoll eingetragen werden. Ausserdem dürfte kein Zugriff auf andere/fremde Speicherbereiche stattfinden, um zu gewähleisten, dass unabhängige Objekt-Parameter nicht mit fehlerhaften Werten überschrieben werden.
Steps to reproduce the issue
Ausführung der folgenden Skripte unter "Skript testen":
Skript 1 -> ReGaHSS-Absturz
WriteLine("Start");
WriteLine(dom.BuildLabel());
var lResult;
object lObjPrg = (dom.GetObject(ID_PROGRAMS)).GetAt(0);
if(lObjPrg)
{
lResult = lObjPrg.DayProfileEntry(21738156);
}
WriteLine("Ende");
Skript 2 -> Zugriff auf den Speicherbereich von .DayTypeProgId();
WriteLine("Start");
WriteLine(dom.BuildLabel());
var lResult;
var lSaveValue;
object lObjPrg = (dom.GetObject(ID_PROGRAMS)).GetAt(0);
if(lObjPrg)
{
WriteLine("------------------");
WriteLine("------------------");
lResult = lObjPrg.DayTypeProgId();
lSaveValue = lResult;
WriteLine(lResult);
WriteLine(lResult.Type())
WriteLine("------------------");
lResult = lObjPrg.DayProfileEntry(49);
WriteLine(lResult);
WriteLine(lResult.Type());
WriteLine("------------------");
WriteLine("------------------");
lResult = lObjPrg.DayProfileEntry(49,12345);
WriteLine(lResult);
WriteLine(lResult.Type());
WriteLine("------------------");
lResult = lObjPrg.DayProfileEntry(49);
WriteLine(lResult);
WriteLine(lResult.Type());
WriteLine("------------------");
lResult = lObjPrg.DayTypeProgId();
WriteLine(lResult);
WriteLine(lResult.Type())
WriteLine("------------------");
WriteLine("------------------");
lResult = lObjPrg.DayTypeProgId(23456);
WriteLine(lResult);
WriteLine(lResult.Type())
WriteLine("------------------");
lResult = lObjPrg.DayProfileEntry(49);
WriteLine(lResult);
WriteLine(lResult.Type());
WriteLine("------------------");
lResult = lObjPrg.DayTypeProgId();
WriteLine(lResult);
WriteLine(lResult.Type())
WriteLine("------------------");
WriteLine("------------------");
lObjPrg.DayTypeProgId(lSaveValue);
}
WriteLine("Ende");
Skript 3 -> Zugriff auf den Speicherbereich von .PrgInfo();
WriteLine("Start");
WriteLine(dom.BuildLabel());
var lResult;
var lSaveValue;
object lObjPrg = (dom.GetObject(ID_PROGRAMS)).GetAt(0);
if(lObjPrg)
{
WriteLine("------------------");
WriteLine("------------------");
lResult = lObjPrg.PrgInfo();
lSaveValue = lResult;
WriteLine(lResult);
WriteLine(lResult.Type())
WriteLine("------------------");
lResult = lObjPrg.DayProfileEntry(51);
WriteLine(lResult);
WriteLine(lResult.Type());
WriteLine("------------------");
WriteLine("------------------");
lResult = lObjPrg.DayProfileEntry(51,1819042120); !Ha+llo
WriteLine(lResult);
WriteLine(lResult.Type());
WriteLine("------------------");
lResult = lObjPrg.DayProfileEntry(51);
WriteLine(lResult);
WriteLine(lResult.Type());
WriteLine("------------------");
lResult = lObjPrg.PrgInfo();
WriteLine(lResult);
WriteLine(lResult.Type())
WriteLine("------------------");
WriteLine("------------------");
lResult = lObjPrg.PrgInfo("Text");
WriteLine(lResult);
WriteLine(lResult.Type())
WriteLine("------------------");
lResult = lObjPrg.DayProfileEntry(51);
WriteLine(lResult);
WriteLine(lResult.Type());
WriteLine("------------------");
lResult = lObjPrg.PrgInfo();
WriteLine(lResult);
WriteLine(lResult.Type())
WriteLine("------------------");
WriteLine("------------------");
lObjPrg.PrgInfo(lSaveValue);
}
WriteLine("Ende");
Skript 4 -> allgemeines Testskript
WriteLine("Start");
WriteLine(dom.BuildLabel());
integer lStart = 0;
integer lLoops = 1000;
integer lCount = 0;
var lResult;
object lObjPrg = (dom.GetObject(ID_PROGRAMS)).GetAt(0);
if(lObjPrg)
{
while(lCount < lStart + lLoops)
{
lResult = lObjPrg.DayProfileEntry(lCount);
WriteLine(lCount);
WriteLine(lResult);
WriteLine(lResult.Type());
WriteLine("----------");
lCount = lCount + 1;
}
}
WriteLine("Ende");
What is the version this bug report is based on?
CCU3 mit ReGaHSS-Version R1.00.0388.0235
Which base platform are you running?
rpi3 (RaspberryPi3, ARM64/aarch64)
Which HomeMatic/homematicIP radio module are you using?
n/a
Anything in the logs that might be useful for us?
bestehend seit:
unbekannt (bereits mit ReGaHss-Version R1.00.0388.0102)
Additional information
Ausgabe des Skriptes 2:
Start
R1.00.0388.0235
------------------
------------------
65535
integer
------------------
65535
integer
------------------
------------------
true
boolean
------------------
12345
integer
------------------
12345
integer
------------------
------------------
true
boolean
------------------
23456
integer
------------------
23456
integer
------------------
------------------
Ende
Ausgabe des Skriptes 3:
Start
R1.00.0388.0235
------------------
------------------
string
------------------
1819042048
integer
------------------
------------------
true
boolean
------------------
1819042120
integer
------------------
Hallo
string
------------------
------------------
true
boolean
------------------
1954047316
integer
------------------
Text
string
------------------
------------------
Ende