Захватываем ring 0 в Linux

Проблемы многопоточности


В классической UNIX никаких потоков вообще не было, а потому не существовало проблемы их синхронизации. С функцией fork() и развитыми средствами межпроцессорного взаимодействия потоки не очень-то и нужны. Но все-таки они появились, продырявив систему до самого дна. Ядро превратилось в настоящее скопище багов. Вот только один из них, обнаруженный в начале января 2005 года и поражающий все ядра версии 2.2, а ядра с версиями от 2.4 до 2.4.29-pre3 и от 2.6 до 2.6.10 включительно.

Рассмотрим фрагмент функции load_elf_library(), автоматически вызываемой функцией sys_uselib() при загрузке новой библиотеки:

static int load_elf_library(struct file *file){         down_write(&current->mm->mmap_sem);         error = do_mmap(file,                 ELF_PAGESTART(elf_phdata->p_vaddr),                 (elf_phdata->p_filesz +                 ELF_PAGEOFFSET(elf_phdata->p_vaddr)),                 PROT_READ | PROT_WRITE | PROT_EXEC,                 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,                 (elf_phdata->p_offset -                 ELF_PAGEOFFSET(elf_phdata->p_vaddr)));         up_write(&current->mm->mmap_sem);         if (error != ELF_PAGESTART(elf_phdata->p_vaddr))                 goto out_free_ph;                  elf_bss = elf_phdata->p_vaddr + elf_phdata->p_filesz;         padzero(elf_bss);                  len = ELF_PAGESTART(elf_phdata->p_filesz                           elf_phdata->p_vaddr + ELF_MIN_ALIGN - 1);         bss = elf_phdata->p_memsz + elf_phdata->p_vaddr;         if (bss > len)                 do_brk(len, bss - len);



Содержание раздела