From 1d9f10e3b6fd63a6337b4e4e2a668426e4e0cfc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Thu, 7 Jul 2016 14:36:16 +0200 Subject: [PATCH] iso9660: fix reading of large directory entries This commit makes it possible to read directory entries that span more than one sector. Fixes #2038. --- repos/os/src/server/iso9660/iso9660.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/repos/os/src/server/iso9660/iso9660.cc b/repos/os/src/server/iso9660/iso9660.cc index 5588272ac5..ea576d74b3 100644 --- a/repos/os/src/server/iso9660/iso9660.cc +++ b/repos/os/src/server/iso9660/iso9660.cc @@ -427,9 +427,16 @@ namespace Iso { t.string(level, PATH_LENGTH); + /* + * Save current block number in a variable because successive + * iterations might override the memory location where dir points + * to when a directory entry spans several sectors. + */ + uint32_t current_blk_nr = dir->blk_nr(); + /* load extent of directory record and search for level */ for (unsigned long i = 0; i < Sector::to_blk(dir->data_length()); i++) { - Sector sec(dir->blk_nr() + i, 1); + Sector sec(current_blk_nr + i, 1); Directory_record *tmp = sec.addr()->locate(level); if (!tmp && i == Sector::to_blk(dir->data_length()) - 1) { @@ -440,12 +447,13 @@ namespace Iso { if (!tmp) continue; dir = tmp; + current_blk_nr = dir->blk_nr(); if (verbose) PDBG("Found %s", level); if (!dir->directory()) { - blk_nr = dir->blk_nr(); + blk_nr = current_blk_nr; data_length = dir->data_length(); }