La ausencia de un simple “&” en el código ha causado un fallo masivo en Chrome OS que impide volver a acceder a los ficheros locales

27/07/2021Artículo original

La ausencia de un simple

El pasado lunes 19 de julio, Google lanzó una actualización de su sistema operativo Chrome OS, la 91.0.4472.165, que rápidamente empezó a dar problemas a los usuarios: les impedía iniciar sesión en sus sistemas. Google detuvo inmediatamente el despligue de la misma, cuando sólo había afectado a los usuarios que habían reiniciado sus equipos tras la descarga de la nueva versión.

A estos últimos sólo se les pudo ofrecer soluciones para recuperar el acceso a su sistema que pasaban, inevitablemente, por borrar los datos locales del dispositivo (revertir el dispositivo a una versión anterior vía USB, restaurar estado de fábrica, o borrar y recrear la cuenta de usuario).

Un sencillo —casi imperceptible— error tipográfico ha provocado que miles de Chromebooks hayan perdido el acceso a sus datos.

Sin embargo, lo interesante de esta actualización fallida (y, por supuesto, ya parcheada), tiene que ver con la razón de dicho fallo. ¿Quizá una corrupción de algún fichero del sistema? ¿Quizá —qué sé yo— alguna extraña y compleja vulnerabilidad del kernel? Para nada: el problema residía en un “&”.

  Da potencia y flexibilidad a tus tests con Jest

Lo extraño del error no es que se cometiera, es que no se detectaran sus efectos

Sí, el carácter conocido en inglés como ‘ampersand’, usado como sustituto de la palabra ‘and’, es también un operador fundamental en la mayoría de los lenguajes de programación. El problema de esta actualización vino generado por una revisión del código que, inadvertidamente, eliminó uno de estos operadores en el siguiente fragmento de código C++:

if (key_data_.has_value() && !key_data_->label().empty())

Nada impedía que el código compilase, pues el código sigue teniendo sentido aun cambiando “&&” por “&”… sencillamente, el comportamiento del software varía totalmente.

Así, donde “&&” es un operador AND lógico que actúa como una forma de indicar que deben cumplirse simultáneamente dos o más condiciones para realizar una opción, “&” se convierte en un operador AND de bit a bit: compara los bits uno a uno, si ambos son “1” el resultado es “1”, en caso contrario “0”.

  Obama bajará los impuestos a las empresas que inviertan en tecnología y ciencia

Esto significa que “&” evalúa ambos lados de la operación, mientras que “&&” evalúa el primer elemento de la operación, y sólo si es ‘true’ continúa y evalúa el segundo elemento.

¿Qué pruebas debemos hacerle a nuestro software y para qué?En Genbeta¿Qué pruebas debemos hacerle a nuestro software y para qué?

Debido a este error, el Chrome OS actualizado nunca llegaba a verificar correctamente las contraseñas de los usuarios comparándolas con las claves almacenadas, por lo que incluso cuando se introducían las contraseñas correctas, el SO devolvía el mensaje de “Lo siento, no se pudo verificar su contraseña”.

Queda la duda de cómo un error cómo éste se le pudo pasar a Google: Chrome OS, al igual que el navegador Chrome, cuenta con tres canales de pruebas (‘canary’, ‘dev’ y ‘beta’) con semanas de pruebas de diferencia entre lanzamientos, lo que debería servir para cazar bugs tan obvios como éste antes de pasar al canal estable. De hecho, una prueba unitaria automatizada debería haberlo detectado también.

En cualquier caso, éste constituye un ejemplo magnífico de cómo los peores errores de programación pueden depender de algo tan simple como un carácter.

  Cómo mapear json a objetos Java con Jackson ObjectMapper

{“videoId”:”x7ziu8u”,”autoplay”:true,”title”:”Las matemáticas no se me dan mal, quiero aprender a programar CAPTCHA 2×04″}

Vía | The Register

(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName(‘head’)[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement(‘script’); instagramScript.src = ‘https://platform.instagram.com/en_US/embeds.js’; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad