ciaa / firmware_v1

Firmware de la CIAA
http://www.proyecto-ciaa.com.ar
126 stars 120 forks source link

buffer overflow when reading/writing the digital outputs with EDU-CIAA-NXP board. #449

Closed m4v closed 5 years ago

m4v commented 7 years ago

La función ciaa_lpc4337_readPins() tiene 2 condiciones dentro del bucle for para terminar de copiar bits al buffer: o copió todos los pines del puerto, o la cantidad en bytes dada por size.

Un problema ocurre con la EDU-CIAA-NXP, que en el puerto de salida tiene 9 pines. Si uno pone que size es 1 byte, tendría que leer un total de 8 bits, pero como la variable j que cuenta los bytes se incrementa después de verificar la condición se copian un total de 9 bits, y si buffer apunta a un uint8_t escribe fuera de la memoria de la variable. Esto no ocurre en la CIAA-NXP porque el puerto digital es de 8 bits.

Lo mismo problema aparece con la función para escribir en el puerto, ciaaDriverDio_write(), escribe un noveno bit en el pin GPIO2 a pesar de que size es 1 byte.

Cambiando el momento donde se incrementa j soluciona este problema.

Este problema lo identifiqué modificando la tarea del blinking.c con el código abajo, cada vez que uno presiona una de las teclas, el LED2 se prende, pero eso no ocurre con la Tecla 1 porque el primer bit de variable inputs se sobreescribe cuando uno lee el puerto de salida.

TASK(PeriodicTask)
{
   /* el compilador coloca inputs y outputs en la memoria en un bloque de 16 bits continuo.
    * cosa que (&outputs + 8) == &inputs */
   uint8_t inputs;
   uint8_t outputs;

   /* write blinking message */
   ciaaPOSIX_printf("Blinking\n");

   ciaaPOSIX_read(fd_in, &inputs, 1);

   /* al leer el puerto de salida, un bit sobreescribe la variable inputs */ 
   ciaaPOSIX_read(fd_out, &outputs, 1);

   if (inputs != 0x0f) {
      /* una tecla apretada, prendemos un LED */
      outputs |= 0x10;
   } else {
          outputs &= ~0x10;
   }

   outputs ^= 0x20;
   ciaaPOSIX_write(fd_out, &outputs, 1);

   /* terminate task */
   TerminateTask();
}