From 3e818f2075e1764c33fe620e8c51b7c47091afc4 Mon Sep 17 00:00:00 2001 From: X512 Date: Wed, 8 Jan 2020 03:12:10 +0900 Subject: [PATCH] bfs: keep valid dirent->d_reclen in case of bad name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #15607. Change-Id: I96b807f031df4e5c8b5ae17b22a21aed77616b17 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2083 Reviewed-by: Axel Dörfler --- src/add-ons/kernel/file_systems/bfs/Query.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/file_systems/bfs/Query.cpp b/src/add-ons/kernel/file_systems/bfs/Query.cpp index 4b04f82f29..46026bfb43 100644 --- a/src/add-ons/kernel/file_systems/bfs/Query.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Query.cpp @@ -667,13 +667,14 @@ Equation::GetNextMatching(Volume* volume, TreeIterator* iterator, dirent->d_ino = offset; dirent->d_pdev = volume->ID(); dirent->d_pino = volume->ToVnode(inode->Parent()); + dirent->d_reclen = sizeof(struct dirent); if (inode->GetName(dirent->d_name) < B_OK) { FATAL(("inode %" B_PRIdOFF " in query has no name!\n", inode->BlockNumber())); + } else { + dirent->d_reclen += strlen(dirent->d_name); } - - dirent->d_reclen = sizeof(struct dirent) + strlen(dirent->d_name); } if (status == MATCH_OK)