Changeset 87822ce in mainline for uspace/app/top


Ignore:
Timestamp:
2021-03-04T19:14:30Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d6c4d40
Parents:
760a392
Message:

Avoid infinite loop when console communication is broken

Need to make sure callers of console_get_event_timeout() can distinguish
between timeout and I/O error. Fix all callers of console_get_event()
and console_get_event_timeout() not to enter infinite loop when console
connection is broken. Also avoid setting of errno variable.

Location:
uspace/app/top
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/top/screen.c

    r760a392 r87822ce  
    534534/** Get char with timeout
    535535 *
     536 * @param sec Timeout in seconds
     537 * @param rch Place to store character on success
     538 * @return EOK on success, ETIMEOUT on time out, EIO on other error
    536539 */
    537 int tgetchar(sec_t sec)
    538 {
     540errno_t tgetchar(sec_t sec, int *rch)
     541{
     542        errno_t rc;
     543
    539544        /*
    540545         * Reset timeleft whenever it is not positive.
     
    548553         * update timeleft so that the next call to tgetchar()
    549554         * will not wait as long. If there is no input,
    550          * make timeleft zero and return -1.
     555         * make timeleft zero and return ETIMEOUT.
    551556         */
    552557
     
    557562
    558563                warning_timeleft -= timeleft;
    559                 if (!console_get_event_timeout(console, &event, &timeleft)) {
     564                rc = console_get_event_timeout(console, &event, &timeleft);
     565                if (rc == ETIMEOUT) {
    560566                        timeleft = 0;
    561                         return -1;
    562                 }
     567                        return ETIMEOUT;
     568                }
     569
     570                if (rc != EOK)
     571                        return EIO;
     572
    563573                warning_timeleft += timeleft;
    564574
     
    567577        }
    568578
    569         return (int) c;
     579        *rch = (int) c;
     580        return EOK;
    570581}
    571582
  • uspace/app/top/screen.h

    r760a392 r87822ce  
    3535#define TOP_SCREEN_H_
    3636
     37#include <errno.h>
    3738#include <io/console.h>
    3839#include <io/verify.h>
     
    4748    _HELENOS_PRINTF_ATTRIBUTE(1, 2);
    4849
    49 extern int tgetchar(sec_t);
     50extern errno_t tgetchar(sec_t, int *);
    5051
    5152#endif
  • uspace/app/top/top.c

    r760a392 r87822ce  
    583583        data_t data_prev;
    584584        const char *ret = NULL;
     585        errno_t rc;
     586        int c;
    585587
    586588        screen_init();
     
    595597        /* And paint screen until death */
    596598        while (true) {
    597                 int c = tgetchar(UPDATE_INTERVAL);
    598 
    599                 if (c < 0) { /* timeout */
     599                rc = tgetchar(UPDATE_INTERVAL, &c);
     600
     601                if (rc == ETIMEOUT) { /* timeout */
    600602                        data_prev = data;
    601603                        if ((ret = read_data(&data)) != NULL) {
     
    608610
    609611                        c = -1;
     612                } else if (rc != EOK) {
     613                        /* Error (e.g. communication with console lost) */
     614                        goto out;
    610615                }
    611616
Note: See TracChangeset for help on using the changeset viewer.