support/BPath: Flatten should work on empty BPath

BPath::Flatten() on an empty path returns B_OK in BeOS R5, just
writing an empty entry_ref to the povided buffer. The Haiku
implementation has some additional validation that causes B_NO_INIT to
be returned instead.

This patch attempts to recreate the same behavior of BeOS in this
situation.

* Don't check for initialization in BPath::Flatten(). Instead,
  just write an empty entry_ref to the provided buffer if the BPath is
  empty.
* Fix estimation of expected size when testing the return value of
  BPath::FlattenedSize().
* Clean up warning by removing unecessary forward-declaration of
  CppUnit::Test.

Change-Id: I88880cbb298bdcb594c9c8fef48314165c49e9e5
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2115
Reviewed-by: Adrien Destugues <[email protected]>
Reviewed-by: Axel Dörfler <[email protected]>
This commit is contained in:
Kyle Ambroff-Kao
2020-01-21 09:36:42 +00:00
committed by Axel Dörfler
parent 7037b5d9bc
commit 654135466f
3 changed files with 10 additions and 12 deletions
+8 -8
View File
@@ -431,18 +431,18 @@ BPath::Flatten(void* buffer, ssize_t size) const
return flattenedSize;
if (size < flattenedSize)
return B_BAD_VALUE;
status_t status = InitCheck();
if (status != B_OK)
return status;
// convert the path to an entry_ref
BEntry entry;
entry_ref ref;
status = entry.SetTo(Path());
if (status == B_OK)
status = entry.GetRef(&ref);
if (status != B_OK)
return status;
if (Path() != NULL) {
status_t status = entry.SetTo(Path());
if (status == B_OK)
status = entry.GetRef(&ref);
if (status != B_OK)
return status;
}
// store the entry_ref in the buffer
flattened_entry_ref& fref = *(flattened_entry_ref*)buffer;
+2 -2
View File
@@ -1352,8 +1352,8 @@ PathTest::FlattenableTest()
// flatten the path
struct flattened_ref { dev_t device; ino_t directory; char name[1]; };
size = path.FlattenedSize();
ssize_t expectedSize // hehe, that's hacky ;-)
= (ssize_t)((flattened_ref*)NULL)->name + strlen(ref.name) + 1;
ssize_t expectedSize
= sizeof(dev_t) + sizeof(ino_t) + strlen(ref.name) + 1;
CPPUNIT_ASSERT( size == expectedSize);
CPPUNIT_ASSERT( path.Flatten(buffer, sizeof(buffer)) == B_OK );
// check the flattened data
-2
View File
@@ -8,8 +8,6 @@
#include <StorageDefs.h>
#include <SupportDefs.h>
class CppUnit::Test;
class PathTest : public BasicTest
{
public: