Software > Alternative Betriebssysteme

Alte Programme und deren Probleme mit Speicherschutz

(1/3) > >>

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