kwboot : bug when board stops acking

SC sc.mailling at gmail.com
Wed Jan 8 15:21:12 CET 2020


Hi list,

I think there's a bug in kwboot.
I have a faulty board that stops acking xmodem frames after a certain number of packets and kwboot 
instead of exiting continues to send frames up to 100%.
With the one second retry timer it's very long! More than 2 hours :-(

The bug is in the kwboot_xm_sendblock() fonction : 
https://gitlab.denx.de/u-boot/u-boot/blob/master/tools/kwboot.c#L375
kwboot_tty_recv detects the timeout but the return value is based on the last character received 
(line 403)
The variable c is not initialized so if it keeps the previous value which is ACK => rc=0 => infinite 
loop

There are several ways to fix the bug:
* Surround the "switch(c)" with a test:
  if ( !((rc == -1) && (errno == ETIMEDOUT)) ) {
         rc = -1;
         switch (c) {
         case ACK:
             rc = 0;
             break;
         case NAK:
             errno = EBADMSG;
             break;
         case CAN:
             errno = ECANCELED;
             break;
         default:
             errno = EPROTO;
             break;
         }
     }
     return rc;
* In the case of a TIMEOUT set c to a specific value and add the case in the switch

Do you agree with my diagnosis?
What is the best solution to fix this bug?
Should I provide a patch?

Thank you,
Stephane





More information about the U-Boot mailing list