* 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:
@@ -168,43 +168,38 @@ Keymap::Save(entry_ref& ref)
|
|||||||
return status;
|
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]);
|
((uint32*)&fKeys)[i] = B_HOST_TO_BENDIAN_INT32(((uint32*)&fKeys)[i]);
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t bytesWritten = file.Write(&fKeys, sizeof(fKeys));
|
ssize_t bytesWritten = file.Write(&fKeys, sizeof(fKeys));
|
||||||
if (bytesWritten < (ssize_t)sizeof(fKeys)) {
|
if (bytesWritten < (ssize_t)sizeof(fKeys))
|
||||||
if (bytesWritten < 0)
|
status = bytesWritten < 0 ? bytesWritten : B_IO_ERROR;
|
||||||
return bytesWritten;
|
|
||||||
return 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]);
|
((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);
|
if (status == B_OK) {
|
||||||
|
bytesWritten = file.Write(fChars, fCharsSize);
|
||||||
bytesWritten = file.Write(&fCharsSize, sizeof(uint32));
|
if (bytesWritten < (ssize_t)fCharsSize)
|
||||||
if (bytesWritten < (ssize_t)sizeof(uint32)) {
|
status = bytesWritten < 0 ? bytesWritten : B_IO_ERROR;
|
||||||
if (bytesWritten < 0)
|
|
||||||
return bytesWritten;
|
|
||||||
return B_IO_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fCharsSize = B_BENDIAN_TO_HOST_INT32(fCharsSize);
|
if (status == B_OK) {
|
||||||
|
file.WriteAttr("keymap:name", B_STRING_TYPE, 0, fName, strlen(fName));
|
||||||
bytesWritten = file.Write(fChars, fCharsSize);
|
// Failing would be non-fatal
|
||||||
if (bytesWritten < (ssize_t)fCharsSize) {
|
|
||||||
if (bytesWritten < 0)
|
|
||||||
return bytesWritten;
|
|
||||||
return B_IO_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
file.WriteAttr("keymap:name", B_STRING_TYPE, 0, fName, strlen(fName));
|
return status;
|
||||||
// Failing would be non-fatal
|
|
||||||
|
|
||||||
return B_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user