diff options
author | Stefan Reinauer <stefan.reinauer@coreboot.org> | 2014-05-27 22:10:15 +0000 |
---|---|---|
committer | Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> | 2014-05-27 22:10:15 +0000 |
commit | 0801368353e0cbe98455e5babf94a372b3247685 (patch) | |
tree | be7f11b60a21440482b93901985259620eda690b /serial.c | |
parent | d1bfc7ef04b3896e5f78457ef37402ebf2ae1bda (diff) | |
download | flashrom-0801368353e0cbe98455e5babf94a372b3247685.zip flashrom-0801368353e0cbe98455e5babf94a372b3247685.tar.gz |
CID1129998/1129999: Unchecked return value from library
Check return values of various fcntl() invocations in
serialport_config(), serialport_read_nonblock() and
serialport_write_nonblock().
Also, remove some superfluous print conversion specifiers and refine
messages.
Corresponding to flashrom svn r1803.
Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Diffstat (limited to 'serial.c')
-rw-r--r-- | serial.c | 37 |
1 files changed, 30 insertions, 7 deletions
@@ -181,7 +181,10 @@ int serialport_config(fdtype fd, unsigned int baud) msg_pdbg("Baud rate is %ld.\n", dcb.BaudRate); #else struct termios wanted, observed; - fcntl(fd, F_SETFL, 0); + if (fcntl(fd, F_SETFL, 0) != 0) { + msg_perr_strerror("Could not clear serial port mode: "); + return 1; + } if (tcgetattr(fd, &observed) != 0) { msg_perr_strerror("Could not fetch original serial port configuration: "); return 1; @@ -419,14 +422,21 @@ int serialport_read_nonblock(unsigned char *c, unsigned int readcnt, unsigned in return -1; } if(!SetCommTimeouts(sp_fd, &newTimeout)) { + msg_perr_strerror("Could not set serial port timeout settings: "); + return -1; + } #else ssize_t rv; const int flags = fcntl(sp_fd, F_GETFL); + if (flags == -1) { + msg_perr_strerror("Could not get serial port mode: "); + return -1; + } if (fcntl(sp_fd, F_SETFL, flags | O_NONBLOCK) != 0) { -#endif - msg_perr_strerror("Could not set serial port timeout settings %s"); + msg_perr_strerror("Could not set serial port mode to non-blocking: "); return -1; } +#endif int i; int rd_bytes = 0; @@ -458,12 +468,15 @@ int serialport_read_nonblock(unsigned char *c, unsigned int readcnt, unsigned in /* restore original blocking behavior */ #ifdef _WIN32 if (!SetCommTimeouts(sp_fd, &oldTimeout)) { + msg_perr_strerror("Could not restore serial port timeout settings: "); + ret = -1; + } #else if (fcntl(sp_fd, F_SETFL, flags) != 0) { -#endif - msg_perr_strerror("Could not restore serial port timeout settings: %s\n"); + msg_perr_strerror("Could not restore serial port mode to blocking: "); ret = -1; } +#endif return ret; } @@ -495,7 +508,14 @@ int serialport_write_nonblock(const unsigned char *buf, unsigned int writecnt, u #else ssize_t rv; const int flags = fcntl(sp_fd, F_GETFL); - fcntl(sp_fd, F_SETFL, flags | O_NONBLOCK); + if (flags == -1) { + msg_perr_strerror("Could not get serial port mode: "); + return -1; + } + if (fcntl(sp_fd, F_SETFL, flags | O_NONBLOCK) != 0) { + msg_perr_strerror("Could not set serial port mode to non-blocking: "); + return -1; + } #endif int i; @@ -531,10 +551,13 @@ int serialport_write_nonblock(const unsigned char *buf, unsigned int writecnt, u #ifdef _WIN32 if (!SetCommTimeouts(sp_fd, &oldTimeout)) { msg_perr_strerror("Could not restore serial port timeout settings: "); + return -1; + } #else if (fcntl(sp_fd, F_SETFL, flags) != 0) { -#endif + msg_perr_strerror("Could not restore serial port blocking behavior: "); return -1; } +#endif return ret; } |