viernes, 2 de enero de 2009

Patch para VMware Server 1.0.8 en linux kernel 2.6.27

Termine una versión del patch para vmware bajo linux para kernels nuevos ( testeado en un fedora con kernel 2.6.27.9 ), básicamente este patch corrigen los problemas descriptos en este post

A las correcciones descriptas en el articulo anteriormente mencionado, se le suma la corrección de la deferencia de puntero nulo, la que producía el colapso del kernel (el de la maquina host :S ) y escupía este backtrace:

[<f99e76a1>] HostIF_SetFastClockRate+0x8d/0x148 [vmmon]
[<f99efd65>] Vmx86_SetHostClockRate+0xad/0xd5 [vmmon]
[<f99e5a87>] LinuxDriver_Ioctl+0x4c6/0xdcd [vmmon]
[<c0118694>] kmap_atomic_prot+0x102/0x137
[<c0395846>] _spin_unlock+0x5/0x1c
[<c017bd62>] mnt_drop_write+0x64/0xdd
[<c01f0680>] rb_insert_color+0x4c/0xad
[<c013260a>] enqueue_hrtimer+0xc9/0xd4
[<c0132ba5>] hrtimer_start+0xf9/0x129
[<c011a13c>] hrtick_start_fair+0xf7/0x123
[<c0129e78>] group_send_sig_info+0x12/0x56
[<c0129eed>] kill_pid_info+0x31/0x54
[<c012a44e>] sys_kill+0x73/0x13e
[<c0172b53...


Pasaba que en el archivo linux/hostif.c, en la funcion HostIF_SetFastClockRate, aproximadamente por la linea 3480, habia algo asi:



res = filp->f_op->ioctl(filp->f_dentry->d_inode, filp, RTC_PIE_ON, 0);
if (!cap) {
cap_lower(current->cap_effective, CAP_SYS_RESOURCE);
}



Y aparentemente, en ocasiones, filp->f_op->ioctl (que es un puntero a una función, para los mas desprevenidos), tenia el valor de 0, es decir un puntero a nada, para solventar esto, simplemente cambie ese bloque de codigo por esto:



// mejor verificamos si ioctl es un puntero nulo antes
// de deferenciarlo como puntero funcion
if (filp->f_op->ioctl == 0) {
// si el puntero es nulo, hacemos de cuenta que
// la función devolvió status de error
res = -1;
} else {
// ojo, en esta seccion de esta deferencia ioctl como puntero
// que bueno que ya se verifico
res = filp->f_op->ioctl(filp->f_dentry->d_inode, filp, RTC_PIE_ON, 0);
if (!cap) {
cap_lower(current->cap_effective, CAP_SYS_RESOURCE);
}
}



Y con eso se chequeo el puntero antes de deferenciarlo

Uh, casi me olvidaba, aca esta el patch, tengan en cuenta que es para la version 1.0.8-126538 (no se descarata que funcione en otras versiones de vmware, pero yo solo lo probe con esa), por favor, si lo prueban comenten a este articulo que tal les fue, si hubo problemas, para que version de vmware y linux (kernel) instalaron el patch, etc...

1 comentario:

Anónimo dijo...

Fíjate que en el parche estás metiendo el directorio del subversion (.svn). Sea como sea, gracias por el parche.