Access Violation

Moin Moin,
ich habe bei der Abfrage über das REST interface eine Access Violation:

Access violation at address 0086CD07 in module ‘mAirList.exe’. Read of address 0000001B

mAirlist 6.0.6 Build 3642

Greetz
Malte

EDIT: nachdem ich unter Fernsteuerung das REST interface deaktiviert habe kann ich es nicht wieder einschalten, weil der Port schon in Verwendung ist.

Gestern im Sendebetrieb konnte ich mAirlist nicht einfach beenden. Heute beim Neustart, wurde auch die Accessviolation angezeigt, Bug-Report verschickt.

EDIT: Problem ist reprodizierbar, wenn viele REST calls laufen.
Wir haben eine Webapp gebaut, sobald mehrere davon offen sind, kommt mAirlist wohl nicht mit der Menge der Anfragen klar.
Wir werden das reduzieren aber vielleicht gibt es da noch ein Problem? Sieht irgendwie nach Speicherüberlauf aus…

Wenn der Fehler einmal auftritt, kann ich die REST Fernsteuerung zwar deaktivieren aber der port bleibt blockiert. Ich kann also das REST-Interface nicht resetten, ohne mAirlist komplett zu beenden. Das ist im Dauerbetrieb ziemlich hinderlich.

Noch ein Update, wir haben in der App noch einen Fehler. Es werden zu viele Befehle abgesetzt, anstatt nur den Status zu pollen.
Ich vermute mal dass es da zum Problem kommt, wenn mehrere unterschiedliche Befehle gleichzeitig (Sehr schnell hintereinander) kommen oder das aufgerufene mAirListscript, noch nicht durch ist und schon das nächste gestartet wird.

Ich habe gerade mal den REST-Server mit httperf malträtiert, konnte das Problem aber bislang nicht reproduzieren.

Grundsätzlich ist zu sagen, dass der REST-Server keinerlei besonderen Schutz gegen DoS-Angriffe oder dergleichen bietet (allein schon aufgrund der begrenzten Möglichkeiten des Delphi/Indy-HTTP-Servers gegenüber z.B. Apache oder nginx).

Insofern ist REST auch eher für interne Anwendungen konzipiert. Wer den REST-Dienst öffentlich im Internet stellen möchte, sollte zusätzliche Schutzmechanismen installieren; zum Beispiel einen vorgeschalteten Reverse Proxy mit zusätzlicher Authentifizierung und/oder Rate Limiting.

Die Anwendung der WebApp ist auch nicht für die Öffentlichkeit gedacht, nur für unsere Moderatoren. Kann aber trotzdem vorkommen, dass mehrere offen sind.
Ich habe einen Webserver der über ein PHP script die Anfragen weiterverarbeitet, vorgeschaltet, alleine schon um darüber die Authentifizierung zu machen und die Credentials nicht im Javascript zu haben. Der macht aber kein Rate-Limit sondern macht entweder eine GET Abfrage oder reicht den POST durch.

Ich glaube auch nicht, dass die Menge der Zugriffe vergleichbar wäre mit einer DoS attacke.
Ich hatte 7 Instanzen der App offen und jede davon hat alle 5 Sekunden 2 mAirlistscripte gestartet. Dabei konnte ich den Fehler quasi beliebig reproduzieren.
Das ist zwar in der Form nicht “intended” aber dass das ein Problem wird, hätte ich jetzt auch nicht gedacht und vor allem dass ich das REST Interface dann nicht resetten kann.

Ich muss noch mal auf das Problem zurück kommen.
Aktuell können maximal 2 User (wir Entwickler) auf unser Panel zugreifen und trotzdem hatte ich wieder die Access Violation.

Hier das PHP script mit dem ich die Kommunikation zu mAirlist herstelle, ist daran vielleicht irgendwas falsch? Sorry, für das Denglisch.
Wenn ich das Script als HTTP GET aufrufe mit dem parameter read und der Adresse was er vom REST interface lesen soll, wird 1:1 ausgegeben, was mairlist auch ausgibt.

Wenn ich das PHP script mit einem Post Befehl aurufe, werden die entsprechenden kommandos 1:1 an mairlist weiter gegeben.

[code]<?PHP
/**

*/

// Configurattion Block
$mairlistserver = ‘mairlistserver.domain.de’; // ip oder hostname Deines mAirList Rechners
$mairlistrestport = ‘9300’; // Der Port Deiner REST Schnittstelle, default 9300
$mairlistuser = ‘mAirlistRestUser’; // Der Benutzername für Deinen REST User
$mairlistpass = ‘Supergeheimes-Passwort-0815’; // Das Passwort für Deinen REST User
// Configurattion Block End
// ab hier nur noch ändern, wenn Du weißt, was Du tust.
ini_set(‘default_socket_timeout’, 2); // kein Response in 2 Sekunden, dann ist irgendwas fürchterlich falsch gelaufen.

if (isset($_GET[‘read’]))
{
$read = ($_GET[‘read’]);
$json = file_get_contents(‘http://’.$mairlistuser.’:’.$mairlistpass.’@’.$mairlistserver.’:’.$mairlistrestport.$read);
header(‘Content-Type: application/json’);
header(“Access-Control-Allow-Origin: *”);
echo $json;
}
else if (isset($_POST))
{
postrest($mairlistserver, $mairlistrestport, $mairlistuser, $mairlistpass, $_POST[‘command’]);
header(“Access-Control-Allow-Origin: *”);
}

// POST function to pass commands to mAirList.

function postrest($server, $port, $user, $pass, $execcommand)
{
$fp = curl_init($server.’:’.$port.’/execute’);
curl_setopt($fp,CURLOPT_TIMEOUT,2);
curl_setopt($fp,CURLOPT_FAILONERROR,0);
curl_setopt($fp,CURLOPT_RETURNTRANSFER,1);
curl_setopt($fp,CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($fp,CURLOPT_USERPWD, $user.’:’.$pass);
curl_setopt($fp,CURLOPT_POST, 1);
curl_setopt($fp,CURLOPT_POSTFIELDS, ‘command=’.urlencode($execcommand));
curl_exec($fp);
echo $_POST[‘command’];
if (curl_errno($fp) != 0)
{
echo $mairlistserver[‘status’] = false;
}
else
{
$mairlistserver[‘status’] = true;
}
curl_close($fp);
}

?>[/code]

Muss ich jedes mal die User Authentifizierung durchführen oder gibt es da noch einen anderen Weg?
Fehlendes Fearture: Wenn mAirlist die Fehlermeldung schmeißt, wird das im Moment nicht abgefangen und die Ausgabe bleibt leer.

Auth muss immer mitgegeben werden, entweder Basic mit User/Passwort oder Bearer mit Token.

Wann und wo genau siehst du denn die Access Violation? In deinem letzten Bugreport war nur eine, die offenbar erst beim Beenden von mAirList kam.

Die taucht schon vorher auf, wird auch als REST Antwort zurück gegeben aber in der mAirlist GUI ist erst mal nichts zu sehen.
Dort wird es dann erst beim beenden angezeigt aber die gleichen HEX Adressen.

Und um was für eine REST-Anfrage handelt es sich? Normales /execute? Oder auch bei anderen?

Ich bin nicht ganz sicher, wann das auftritt. Ob bei der Statusabfrage oder beim Execute.
Der Execute löst das script aus, welches den Stream Monitor ein oder aus schaltet.
https://www.mairlist.com/forum/index.php/topic,9200.msg61098.html#msg61098

Im Moment noch ein Bug in unserem Javascript das neben der Statusabfrage auch alle 5 Sekunden den Execute aufruft.
Der Kollege arbeitet noch daran, das zu lösen, sobald es fehlerfrei ist, werden wir das auch gerne für alle zur Verfügung stellen.