Ensure that termkey_advisereadable() just fails with errno=ENOMEM rather than trying to read() zero bytes

This commit is contained in:
Paul LeoNerd Evans 2012-01-18 10:36:50 +00:00
parent 3474a45b14
commit d64ba87eda
2 changed files with 7 additions and 1 deletions

View File

@ -949,6 +949,12 @@ TermKeyResult termkey_advisereadable(TermKey *tk)
tk->buffstart = 0; 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: retry:
len = read(tk->fd, tk->buffer + tk->buffcount, tk->buffsize - tk->buffcount); len = read(tk->fd, tk->buffer + tk->buffcount, tk->buffsize - tk->buffcount);

View File

@ -10,7 +10,7 @@ termkey_advisereadable \- read more bytes from the underlying terminal
.sp .sp
Link with \fI-ltermkey\fP. Link with \fI-ltermkey\fP.
.SH DESCRIPTION .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 .PP
This function, along with \fBtermkey_getkey\fP(3) make it possible to use the termkey instance in an asynchronous program. This function, along with \fBtermkey_getkey\fP(3) make it possible to use the termkey instance in an asynchronous program.
.PP .PP