Make getutxent(3) more robust against bad utx.log files. Whenever we read

zeroes, don't stop processing the file, but read until its end or valid
data.

In collaboration with:	ed
This commit is contained in:
Gleb Smirnoff 2013-10-15 13:32:01 +00:00
parent aa93041d2c
commit a173916590

View File

@ -122,9 +122,20 @@ getfutxent(struct futx *fu)
if (udb == UTXDB_LOG) {
uint16_t len;
retry:
if (fread(&len, sizeof(len), 1, uf) != 1)
return (-1);
len = be16toh(len);
if (len == 0) {
/*
* XXX: Though zero-size records are valid in theory,
* they can never occur in practice. Zero-size records
* indicate file corruption. Seek one byte forward, to
* see if we can find a record there.
*/
ungetc('\0', uf);
goto retry;
}
if (len > sizeof *fu) {
/* Forward compatibility. */
if (fread(fu, sizeof(*fu), 1, uf) != 1)