[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? ;-)