* 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
This commit is contained in:
Oliver Tappe
2009-05-12 18:49:32 +00:00
parent 0c7085458e
commit 3cd0b14d0b
+21 -26
View File
@@ -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;
}