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



Reply via email to