jueves, 5 de agosto de 2010

News: 3 Regresiones menos

 

News: 3 Regresiones menos

 

Actualmente el trunk de ReactOS se encuentra congelado, tal y como avisamos en el post anterior.

El objetivo era bloquear la entrada de código nuevo, y permitir únicamente el envío de parches para corregir las regresiones existentes.

 

 

Hoy se han conseguido eliminar 3 regresiones críticas, y que podrían haber estado afectando a cientos de aplicaciones. Estas aplicaciones, desde ahora, vuelven a funcionar.

Si quieres saber más, continua leyendo :)

 

3 Regresiones, 1 único Bug.

 

La importancia de este bug estaba relacionada con la gran pérdida de compatibilidad que provocaba. Por ello ha sido el centro de atención de nuestros desarrolladores.

Los testeadores suelen probar regularmente un conjunto de aplicaciones denominadas “GoldenApps” (aplicaciones que tienen un nivel medio-alto de compatibilidad con ReactOS). Esto permite encontrar regresiones o controlar si la compatibilidad se ha visto incrementada.

Tras un testeo rutinario se descubrió que 3 aplicaciones habían dejado de funcionar, y las 3 mostraban un comportamiento similar. La aplicación no llegaba a abrirse pero el proceso era mostrado en el Administrador de Tareas. Las 3 aplicaciones eran: VLC 0.8.6i, Mirc 6.35, Far Manager 1.7

Si tenemos en cuenta que las GoldenApps son aproximadamente 20, y que 3 de ellas habían dejado de funcionar, esto podría suponer (extrapolando al “mundo real”) una gran perdida de compatibilidad.

 

El commit responsable…

 

Tras un largo proceso de Regtesting, se descubrió que la Commit culpable era…

 

Revision guilty: r47533.
Commiter: Timo Kreuzer

*********************************************

Merge 46523 from amd64 branch:

- Fix assert macro
- Add crt="MSVC" to a number of modules to resolve _assert

**************************************************

Sin embargo, este commit no había provocado la pérdida de compatibilidad,sino que arreglaba la macro “assert”.

Al arreglar esta macro (y hacer que funcionara correctamente)  ReactOS ejecuta una comprobación Assert que antes no hacía correctamente.

El Assert se encuentra en:

Fichero: dll/win32/riched20/wrap.c
Línea 260
Expresión evaluada: i<len

Se puede ver el fichero aquí.

 

La solución.

 

El problema radicaba en GetTextExtentExPointA/W. Antes ReactOS no comprobaba en esta función si los parámetros eran o no válidos. De hecho, tomaba como válidos cualquier parámetro que se le pasara y hacía uso del mismo de manera indiscriminada. Esto provocaba, posteriormente, el Assert.

Un ejemplo: Supongamos que pasamos como variable Divisor el valor CERO. La función “float Dividir(Dividendo,Divisor)” debería comprobar que el valor de Divisor no es CERO antes de ejecutar la división y parar la ejecución de la función, ya que no puede dividirse por CERO. Si no se para la ejecución, el Sistema Operativo dividirá por CERO y almacenará el resultado( Quién sabe qué estará almacenando) y a partir de ahí todos los Asserts comprobatorios serán completamente erróneos.

Por tanto,es fundamental comprobar que los parámetros que una función está recibiendo son totalmente válidos, y “reaccionar” en caso de que no lo sean.

Kamil Hornicek ha creado un parche precisamente con esto en la revisión 48446, ahora GetTextExtentExPointA/W detecta parámetros inválidos y muestra un error correspondiente.

+  if(nMaxExtent < -1)
+  {
+    SetLastError(ERROR_INVALID_PARAMETER);
+    return FALSE;
+  }

 

Y con una cosa tan simple, las 3 aplicaciones funcionan de nuevo… :)

1 comentario:

  1. Me encanta este post. Me ha gustado lo bien explicado que está el bug.
    El blog es muy bueno también, te permite conocer más de cerca ReactOS

    ResponderEliminar