Software > Alternative Betriebssysteme
Alte Programme und deren Probleme mit Speicherschutz
Thorsten Otto:
--- Zitat von: ari.tao am Mo 28.05.2018, 10:20:05 --- ... berüchtigtes Bsp., das imho per AES unlösbar ist.
--- Ende Zitat ---
Kein Geheimnis: Die TDI-Tools tauschen ihre Daten untereinander auch auf unsaubere Weise
[/quote]]
Das ist natürlich ungünstig, da kann man wenig machen. Im AES könnte man nur die bekannten, mehr oder wenigen offiziellen Protokolle fixen.
--- Zitat ---Speicher zu benutzen, der einem nicht selbst gehört, das war auch vor Erfindung von MP und Flags schon eine Schweinerei.
--- Ende Zitat ---
Naja, das müsste man dann eher den Designern der Protokolle vorwerfen. Die Programme können da wenig für, wenn sie sich an die Vorgaben halten. Ganz abgesehen davon, daß es ohne MiNT/MagiC auch gar keine Möglichkeit gibt, Shared-Memory anzufordern.
In dem Zusammenhang wäre auch mal interessant zu erfahren, was Virtuelle Memory-Manager wie OUTSIDE/VRAM da anstellen, wenn der Speicher nicht nur einem nicht gehört, sondern in einem anderen Prozess möglicherweise an einer Addresse eingeblendet wird.
ari.tao:
Das Speicher-Problem trat in´s Bewußtsein, als es MultiTOS gab. Ab da konnten jeder Programmierer und jeder Protokoll-Designer daran arbeiten. MP war erst eine ganze Weile später, ab dem 68030.
goetz @ 3rz:
--- Zitat von: ari.tao am Mo 28.05.2018, 23:57:04 ---Das Speicher-Problem trat in´s Bewußtsein, als es MultiTOS gab. Ab da konnten jeder Programmierer und jeder Protokoll-Designer daran arbeiten. MP war erst eine ganze Weile später, ab dem 68030.
--- Ende Zitat ---
Als MultiTOS rauskam, gab es den TT schon eine Weile. 'MP' mußte also nicht auf das Erscheinen eines 68030-Computer warten.
ari.tao:
Da hast Du wohl recht. Kam mir nur so vor, weil ich damals bloß den MST4 hatte (übernommen von Viszena). M-TOS trägt ein Datum vom März ´93, mein erster F30 kam ´97 und mein erster TT erst ´09. Aber die Speicher-Problematik war auch mit meinem MST4 für mich schon ein Thema (wg. TDI, so.).
KarlMüller:
Mal was technisches aus Thing, wie zumindest ein Programm selbst verhindern kann nicht in den Abgrund gezogen zu werden.
--- Code: ---/**
* avp_checkbuf
*
* Prueft, ob ein von einem AV-Client gelieferter Pufferzeiger fuer
* Thing les- und ggf. schreibbar ist (Stichwort Speicherschutz).
*
* Eingabe:
* id: AES-ID des AV-Clients
* msg: Betroffene AV-Nachricht als Zahl
* tmsg: Betroffene AV-Nachricht als Text
* buf: Zeiger auf zu pruefenden Puffer
* write: 1, wenn auch Schreibzugriff benötigt wird
*
* Rueckgabe:
* 0: Puffer nicht OK, Alert wurde angezeigt
* sonst: Alles klar, go ahead
*/
short avp_checkbuf(short id, short msg, char *tmsg, char *buf, short write) {
short ok;
long old_sigbus;
char *name, d, *origbuf;
AVINFO *ainfo;
old_sigbus = (long) Psignal(SIGBUS, (long) handle_sigbus);
/* Wenn es Psignal nicht gibt, kann man nix machen ... */
if (old_sigbus == -32L)
return (1);
origbuf = buf;
ok = 1;
/*
* Ohne setjmp()/longjmp() geht es nicht, weil bei Rückkehr
* aus einem Signalhandler fÅr SIGBUS und SIGSEGV an genau
* der Stelle weitergemacht wird, die den Fehler verursacht
* hatte -> das Signal würde also gleich nochmal ausgelöst
*/
if (setjmp(check)) {
/*
* Wenn dieser Teil der Routine erreicht wird, wurde der
* Signalhandler aktiviert und ist mit longjmp() hierher
* zurückgekehrt, um den Fehler zu melden
*/
ok = 0;
ainfo = avp_get(id);
if (ainfo)
name = ainfo->name;
else
name = appl_name(id, "UNKNOWN");
sprintf(almsg, rs_frstr[ALPRIVATEMEM], name, id, write ? "global"
: "readable");
if (frm_alert(2, almsg, altitle, conf.wdial, 0L) == 1) {
sprintf(almsg, rs_frstr[ALPMDETAILS], tmsg, msg, buf, origbuf);
frm_alert(1, almsg, altitle, conf.wdial, 0L);
}
} else {
/*
* Dieser Teil wird direkt nach dem Aufruf von setjmp()
* erreicht. Hier wird der Puffer geprüft, wobei die
* Abfrage auf Ende des Puffers erst in der Schleife
* stattfindet, um ggf. auch diese Speicherstelle
* testweise zu beschreiben
*/
for (;; buf++) {
d = *buf;
if (write)
*buf = d;
if (!d)
break;
}
}
/*
* Den alten Signalhandler restaurieren und das Ergebnis des
* Tests liefern
*/
Psignal(SIGBUS, (long) old_sigbus);
return (ok);
}
/**
* handle_sigbus
*
* Handler fuer SIGBUS und SIGSEGV bei avp_checkbuf(). Springt per
* longjmp() zurück und meldet dabei einen Fehler.
*
* Eingabe:
* signo: Signalnummer (SIGBUS)
*/
static void cdecl handle_sigbus(long signo) {
UNUSED(signo);
Psigreturn();
longjmp(check, 1);
}
--- Ende Code ---
Die Routine befindet sich in AVSERVER.C
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln