Chyby jsou a budou, vždyť všechny programy píší jen lidé.
Víte ovšem, v čem je ten skutečný rozdíl mezi Windows a Linuxem? Ve svobodě. V Linuxu máte tu svobodu a možnost i takovouto chybu opravit sám a mnohem dříve, než se nejaká firma laskavě rozhodne vydat "oficiální" záplatu. Navíc protože je vidět dovnitř, může být oprava mnohem elegantnější než v jakémkoliv proprietárním systému.
Například tato záplata od Honzy K. Malého (díky!) chyby systémového volání mremam() umožnuje zabezpečit kernel za běhu, bez nutnosti restartu. Stačí přeložit jako modul a načíst. Umíte něco takového ve Windows?
/* Po zalepeni ptrace modulem zkusim totez pro mremap error
... narozdil od do_brk by to melo stacit */
#define __KERNEL__
#define MODULE
#define _LOOSE_KERNEL_NAMES
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/config.h>
#include <linux/module.h>
#include <linux/version.h>
#include <sys/syscall.h>
#include <linux/sched.h>
unsigned long (*real_mremap)(unsigned long addr,
unsigned long old_len, unsigned long new_len,
unsigned long flags, unsigned long new_addr);
extern void *sys_call_table[];
asmlinkage unsigned long new_mremap(unsigned long addr,
unsigned long old_len, unsigned long new_len,
unsigned long flags, unsigned long new_addr);
int init_module() {
/* Save a pointer to the old mremap function */
real_mremap = sys_call_table[ __NR_mremap ];
/* point to our new mremap function in sys_call_table */
sys_call_table[ __NR_mremap ] = (void *)new_mremap;
printk(KERN_INFO "safemremap module installed\n");
return 0;
}
#ifdef __KERNEL_STRICT_NAMES
#warn sakra
#endif
int cleanup_module() {
/* reset the pointer back to the actual function */
sys_call_table[ __NR_mremap ] = (void *)real_mremap;
printk(KERN_INFO "safemremap module uninstalled\n");
return 0;
}
/* The replacement function */
asmlinkage unsigned long new_mremap(unsigned long addr,
unsigned long old_len, unsigned long new_len,
unsigned long flags, unsigned long new_addr) {
if (unlikely(!new_len && new_addr != addr)) return(-EINVAL);
return(real_mremap(addr,old_len,new_len,flags,new_addr));
}