From 3cd0b14d0b0579e9e1ac0a7d40c93652996671a8 Mon Sep 17 00:00:00 2001 From: Oliver Tappe Date: Tue, 12 May 2009 18:49:32 +0000 Subject: [PATCH] * fixed data corruption and later crash when an error occurs in Save() git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30721 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/preferences/keymap/Keymap.cpp | 47 ++++++++++++++----------------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/src/preferences/keymap/Keymap.cpp b/src/preferences/keymap/Keymap.cpp index 9f8aa1f8ed..79541d4f9e 100644 --- a/src/preferences/keymap/Keymap.cpp +++ b/src/preferences/keymap/Keymap.cpp @@ -168,43 +168,38 @@ Keymap::Save(entry_ref& ref) return status; } - for (uint32 i = 0; i < sizeof(fKeys) / 4; i++) { + for (uint32 i = 0; i < sizeof(fKeys) / 4; i++) ((uint32*)&fKeys)[i] = B_HOST_TO_BENDIAN_INT32(((uint32*)&fKeys)[i]); - } ssize_t bytesWritten = file.Write(&fKeys, sizeof(fKeys)); - if (bytesWritten < (ssize_t)sizeof(fKeys)) { - if (bytesWritten < 0) - return bytesWritten; - return B_IO_ERROR; - } + if (bytesWritten < (ssize_t)sizeof(fKeys)) + status = bytesWritten < 0 ? bytesWritten : B_IO_ERROR; - for (uint32 i = 0; i < sizeof(fKeys) / 4; i++) { + for (uint32 i = 0; i < sizeof(fKeys) / 4; i++) ((uint32*)&fKeys)[i] = B_BENDIAN_TO_HOST_INT32(((uint32*)&fKeys)[i]); + + if (status == B_OK) { + fCharsSize = B_HOST_TO_BENDIAN_INT32(fCharsSize); + + bytesWritten = file.Write(&fCharsSize, sizeof(uint32)); + if (bytesWritten < (ssize_t)sizeof(uint32)) + status = bytesWritten < 0 ? bytesWritten : B_IO_ERROR; + + fCharsSize = B_BENDIAN_TO_HOST_INT32(fCharsSize); } - fCharsSize = B_HOST_TO_BENDIAN_INT32(fCharsSize); - - bytesWritten = file.Write(&fCharsSize, sizeof(uint32)); - if (bytesWritten < (ssize_t)sizeof(uint32)) { - if (bytesWritten < 0) - return bytesWritten; - return B_IO_ERROR; + if (status == B_OK) { + bytesWritten = file.Write(fChars, fCharsSize); + if (bytesWritten < (ssize_t)fCharsSize) + status = bytesWritten < 0 ? bytesWritten : B_IO_ERROR; } - fCharsSize = B_BENDIAN_TO_HOST_INT32(fCharsSize); - - bytesWritten = file.Write(fChars, fCharsSize); - if (bytesWritten < (ssize_t)fCharsSize) { - if (bytesWritten < 0) - return bytesWritten; - return B_IO_ERROR; + if (status == B_OK) { + file.WriteAttr("keymap:name", B_STRING_TYPE, 0, fName, strlen(fName)); + // Failing would be non-fatal } - file.WriteAttr("keymap:name", B_STRING_TYPE, 0, fName, strlen(fName)); - // Failing would be non-fatal - - return B_OK; + return status; }