From 32057ce92279831f060782646fa67ea7161019f9 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 31 Mar 2013 18:30:39 +0200 Subject: [PATCH] If a keyring is empty, store a no data flag instead of failing. Any fully empty keyring (no keys and no applications) would fail to add the empty flat buffer and thus prevent the whole keystore database from being stored. This could easily happen when you used separate keyrings but the master keyring was left unused for example. Adding a flag that tells that there is no data allows us to distinguish between a case where the stored data is missing due to a problem versus an actually empty buffer. --- src/servers/keystore/Keyring.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/servers/keystore/Keyring.cpp b/src/servers/keystore/Keyring.cpp index 8392716909..fbf11b4a0b 100644 --- a/src/servers/keystore/Keyring.cpp +++ b/src/servers/keystore/Keyring.cpp @@ -42,6 +42,11 @@ Keyring::ReadFromMessage(const BMessage& message) if (result != B_OK) return result; + if (message.GetBool("noData", false)) { + fFlatBuffer.SetSize(0); + return B_OK; + } + ssize_t size; const void* data; result = message.FindData("data", B_RAW_TYPE, &data, &size); @@ -69,8 +74,12 @@ Keyring::WriteToMessage(BMessage& message) if (result != B_OK) return result; - result = message.AddData("data", B_RAW_TYPE, fFlatBuffer.Buffer(), - fFlatBuffer.BufferLength()); + if (fFlatBuffer.BufferLength() == 0) + result = message.AddBool("noData", true); + else { + result = message.AddData("data", B_RAW_TYPE, fFlatBuffer.Buffer(), + fFlatBuffer.BufferLength()); + } if (result != B_OK) return result;