[haiku-commits] haiku: hrev51018 - src/add-ons/kernel/file_systems/btrfs

  • From: pulkomandy@xxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 13 Mar 2017 19:46:23 +0100 (CET)

hrev51018 adds 1 changeset to branch 'master'
old head: 4135f1fd20076c2632f838a164a96cf1c2914343
new head: 3f73d5625cf32f607941027b8c384dcfe6fd5a6f
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=3f73d5625cf3+%5E4135f1fd2007

----------------------------------------------------------------------------

3f73d5625cf3: Fix crash when mounting btrfs volumes
  
  Found item has data offset higher than block size. Move the stream to get the
  data. If the data does not fit in the block, fetch it directly from the 
device.
  
  Signed-off-by: Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
  
  Fixes #12788.

                                             [ Hy Che <cvghy116@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev51018
Commit:      3f73d5625cf32f607941027b8c384dcfe6fd5a6f
URL:         http://cgit.haiku-os.org/haiku/commit/?id=3f73d5625cf3
Author:      Hy Che <cvghy116@xxxxxxxxx>
Date:        Mon Mar 13 17:08:48 2017 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Commit-Date: Mon Mar 13 18:43:44 2017 UTC

Ticket:      https://dev.haiku-os.org/ticket/12788

----------------------------------------------------------------------------

1 file changed, 15 insertions(+), 3 deletions(-)
.../kernel/file_systems/btrfs/BPlusTree.cpp        | 18 +++++++++++++++---

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp 
b/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp
index 0f1bf01..b4d2dd6 100644
--- a/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp
+++ b/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp
@@ -168,10 +168,22 @@ BPlusTree::_Find(struct btrfs_key &key, void** _value, 
size_t* _size,
                        stream->entries[i].Offset(), stream->entries[i].Size());
                if (_value != NULL) {
                        *_value = malloc(stream->entries[i].Size());
-                       memcpy(*_value, ((uint8 *)&stream->entries[0] 
-                               + stream->entries[i].Offset()),
-                               stream->entries[i].Size());
+                       uint32 totalOffset = stream->entries[i].Offset() + 
sizeof(btrfs_header);
                        key.SetOffset(stream->entries[i].key.Offset());
+
+                       if ((fVolume->BlockSize() - totalOffset % 
fVolume->BlockSize())
+                               >= stream->entries[i].Size()) {
+                               //If there is enough space for *_value
+                               stream = (btrfs_stream*)cached.SetTo(physical
+                                       + totalOffset / fVolume->BlockSize());
+                               memcpy(*_value, ((uint8 *)&stream->header
+                                       + totalOffset % fVolume->BlockSize()),
+                                       stream->entries[i].Size());
+                       } else {
+                               read_pos(fVolume->Device(), physical
+                                       * fVolume->BlockSize() + totalOffset,
+                                       *_value, stream->entries[i].Size());
+                       }
                        if (_size != NULL)
                                *_size = stream->entries[i].Size();
                }       


Other related posts:

  • » [haiku-commits] haiku: hrev51018 - src/add-ons/kernel/file_systems/btrfs - pulkomandy