copyin()

Tomas Pluskal plusik at pohoda.cz
Tue May 18 12:47:33 CEST 2004


On Tue, 18 May 2004, Milos Urbanek wrote:

> On Tue, May 18, 2004 at 11:53:33AM +0200, Tomas Pluskal wrote:
>
> a zdrojak toho modulu vypada jak?

cele to sem posilat nebudu, je to prilis dlouhe a dela to spoustu veci
ktere s timhle nesouvisi. Nicmene ten kod na kterem to zkousim je
okopirovany z /sys/kern/imgact_elf.c, funkce
__elfN(coredump)(td, vp, limit)

Udelal jsem si presnou kopii te funkci, jen jsem tam pridal debug vypisy.
Pokud ji ale zavolam, tak to v tomhle cyklu:

                for (i = 0; i < seginfo.count; i++) {

			error = fubyte((void*) php->p_vaddr);
			printf("%p %d\n", (void*) php->p_vaddr, error);

			error = vn_rdwr_inchunks(UIO_WRITE, vp,
                            (caddr_t)(uintptr_t)php->p_vaddr,
                            php->p_filesz, offset, UIO_USERSPACE,
                            IO_UNIT | IO_DIRECT, cred, NOCRED, (int *)NULL,
                            curthread); /* XXXKSE */
                        if (error != 0)
                                break;
                        offset += php->p_filesz;
                        php++;
                }

vrati EFAULT, protoze vn_rdwr_inchunks vrati EFAULT, protoze copyin VRATI
EFAULT. ten fubyte jsem tam pridal ja, a podle toho jsem zjistil, ze to
zhavaruje pokazde na jine adrese, ackoli jindy ta adresa precist jde.

pokud tomu dobre rozumim, tak normalne se ta funkce vola v kontextu
dumpovaneho threadu, tj. parametr td==curthread, to v mem pripade neplati.
ale neni mi jasne jaky to muze mit vliv.

T.P.



More information about the Users-l mailing list