> Прикольная логика. Всерьез предлагается парсить мусор? read_blk(dquot->dq_h, blk, buf);
if (depth == QT_TREEDEPTH - 1) {
for (i = 0; i < QT_BLKSIZE >> 2; i++) {
blk = ext2fs_le32_to_cpu(ref[i]);
check_reference(dquot->dq_h, blk);
if (blk && !get_bit(bitmap, blk))
entries += report_block(dquot, blk, bitmap,
process_dquot, data);
}
...
static void read_blk(struct quota_handle *h, unsigned int blk, dqbuf_t buf)
{
int err;
err = h->e2fs_read(&h->qh_qf, blk << QT_BLKSIZE_BITS, buf,
QT_BLKSIZE);
if (err < 0)
log_err("Cannot read block %u: %s", blk, strerror(errno));
else if (err != QT_BLKSIZE)
memset(buf + err, 0, QT_BLKSIZE - err);
}
как легко заметить read_blk может таки иметь ошибку (log_err только ругнется в консоль или syslog).
но это не мешает продолжать парсить прочитаное. Тоже самое относится к check_reference - которое проверяет индекс блока на валидность.. куда-то репортим об этом. реакции 0.
Вопрос - кем должен быть человек пропустивший такой код?
пример падения
e2fsck -f /dev/md0
Pass 5: Checking group summary information
[ERROR] quotaio_tree.c:590:check_reference:: Illegal reference (2711113728 >= 17) in user quota file. Quota file is probably corrupted.
Please run e2fsck (8) to fix it.
Signal (11) SIGSEGV si_code=SEGV_MAPERR fault addr=0x149e4110
e2fsck[0x42d26e]
/lib64/libc.so.6(+0x326b0)[0x7f98710816b0]
e2fsck[0x4303c8]
e2fsck[0x4302fd]
e2fsck[0x4302fd]
e2fsck[0x4302fd]
e2fsck(qtree_scan_dquots+0x7a)[0x43065a]
e2fsck(quota_compare_and_update+0xb2)[0x42dc92]
e2fsck(main+0x2279)[0x40db59]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x7f987106dd5d]
e2fsck[0x409c09]
все.. приплыли - больше вы починить ext4 не можете.
Правда умный человек пропустил такой код?