aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul LeoNerd Evans <leonerd@leonerd.org.uk>2012-01-18 10:36:50 +0000
committerPaul LeoNerd Evans <leonerd@leonerd.org.uk>2012-01-18 10:36:50 +0000
commitd64ba87edae62894ca74cfb9d6d8cdd88c213397 (patch)
treefab0f0af85d94b40240c881994f18b52f4130bc3
parent3474a45b14a131e92e52960dd90e63c12fda275d (diff)
downloadtermo-d64ba87edae62894ca74cfb9d6d8cdd88c213397.tar.gz
termo-d64ba87edae62894ca74cfb9d6d8cdd88c213397.tar.xz
termo-d64ba87edae62894ca74cfb9d6d8cdd88c213397.zip
Ensure that termkey_advisereadable() just fails with errno=ENOMEM rather than trying to read() zero bytes
-rw-r--r--termkey.c6
-rw-r--r--termkey_advisereadable.32
2 files changed, 7 insertions, 1 deletions
diff --git a/termkey.c b/termkey.c
index 7770d83..a55b106 100644
--- a/termkey.c
+++ b/termkey.c
@@ -949,6 +949,12 @@ TermKeyResult termkey_advisereadable(TermKey *tk)
tk->buffstart = 0;
}
+ /* Not expecting it ever to be greater but doesn't hurt to handle that */
+ if(tk->buffcount >= tk->buffsize) {
+ errno = ENOMEM;
+ return TERMKEY_RES_ERROR;
+ }
+
retry:
len = read(tk->fd, tk->buffer + tk->buffcount, tk->buffsize - tk->buffcount);
diff --git a/termkey_advisereadable.3 b/termkey_advisereadable.3
index fe70125..06e0467 100644
--- a/termkey_advisereadable.3
+++ b/termkey_advisereadable.3
@@ -10,7 +10,7 @@ termkey_advisereadable \- read more bytes from the underlying terminal
.sp
Link with \fI-ltermkey\fP.
.SH DESCRIPTION
-\fBtermkey_advisereadable\fP() informs the instance that new input may be available on the underlying file descriptor and so it should call \fBread\fP(2) to obtain it. If at least one more byte was read it will return \fBTERMKEY_RES_AGAIN\fP to indicate it may be useful to call \fBtermkey_getkey\fP(3) again. If no more input was read then \fBTERMKEY_RES_NONE\fP is returned.
+\fBtermkey_advisereadable\fP() informs the instance that new input may be available on the underlying file descriptor and so it should call \fBread\fP(2) to obtain it. If at least one more byte was read it will return \fBTERMKEY_RES_AGAIN\fP to indicate it may be useful to call \fBtermkey_getkey\fP(3) again. If no more input was read then \fBTERMKEY_RES_NONE\fP is returned. If there was no buffer space remaining, then \fBTERMKEY_RES_ERROR\fP is returned with \fIerrno\fP set to \fBENOMEM\fP.
.PP
This function, along with \fBtermkey_getkey\fP(3) make it possible to use the termkey instance in an asynchronous program.
.PP