[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] [Patch] kernel: RPC-Parameter prüfen
Am Freitag, 8. Februar 2008 15.40:31 schrieb Kevin Wolf:
> Dieser Patch implementiert die Funktion is_userspace(), die bisher mehr
> oder weniger ein Stub war, verschiebt sie in die Speicherverwaltung und
> wendet sie schließlich zur Prüfung der Syscall-Parameter bei RPCs an. Um
> Codeduplikation zu vermeiden, mußte ich resolve_vaddr() ändern, ich
> hoffe, ich habe dabei nichts kaputtgemacht.
>
> Index: src/kernel/src/mm/paging.c
> ===================================================================
> --- src/kernel/src/mm/paging.c (Revision 699)
> +++ src/kernel/src/mm/paging.c (Arbeitskopie)
> - return (paddr_t) (
> - (page_directory[vpage / PAGE_TABLE_LENGTH] & ~0x3FFFFF)
> - | ((dword) vaddr & 0x3FFFFF));
> + return (page_directory[vpage / PAGE_TABLE_LENGTH] & ~0x3FF000)
> + | ((dword) vaddr & 0x3FF000);
Was ist die Überlegung hinter diesem Rückgabewert? Ich sehe da nicht, warum
das so Kompliziert sein muss. Sind die Bits im PD-Eintrag nicht an der
gewünschten Stelle, oder wo ist das Problem?
> /**
> + * Prueft, ob ein Speicherbereich im Page Directory des aktuellen Tasks
> + * komplett gemappt ist und PTE_U (Zugriffsrecht fuer Usermode) gesetzt
> hat. + */
> +bool is_userspace(vaddr_t start, dword len)
> +{
> + vaddr_t cur;
> +
> + if (start + len < start) {
> + return FALSE;
> + }
> +
> + for (cur = start;
> + (cur < start + len) && (cur > (void*) 0xFFF);
Muss das hier wirklich void* sein, oder geht ein vaddr_t auch? ;-)