summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Reinauer <reinauer@chromium.org>2011-11-16 18:33:50 -0800
committerDuncan Laurie <dlaurie@chromium.org>2011-11-16 18:37:25 -0800
commiteb09534c1f934f5773dc38e025668b0104c5b4aa (patch)
tree122d2b2445db5bc3eca28104933d91a3d54f0736
parent4c04144cc639bebbb6ca62e7c222dec260b35fe5 (diff)
downloadvboot-eb09534c1f934f5773dc38e025668b0104c5b4aa.tar.gz
vboot_reference: fix CMOS writing for x86 platforms
VbCmosWrite should seek to correct offset before starting to write; also fixed file handle leakage. BUG=chromium-os:23000 TEST=crossystem recovery_request=1; echo $? # show: 0 crossystem recovery_request # show: 1 reboot # see recovery screen Change-Id: Ie5cdc21acf11962dac9debd1ef26108a05181326 Reviewed-on: https://gerrit.chromium.org/gerrit/11756 Tested-by: Hung-Te Lin <hungte@chromium.org> Reviewed-by: Gabe Black <gabeblack@chromium.org> Commit-Ready: Hung-Te Lin <hungte@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/11828 Commit-Ready: Stefan Reinauer <reinauer@chromium.org> Tested-by: Stefan Reinauer <reinauer@chromium.org> Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
-rw-r--r--host/arch/x86/lib/crossystem_arch.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/host/arch/x86/lib/crossystem_arch.c b/host/arch/x86/lib/crossystem_arch.c
index 92f0b9f5..1042c66e 100644
--- a/host/arch/x86/lib/crossystem_arch.c
+++ b/host/arch/x86/lib/crossystem_arch.c
@@ -112,12 +112,9 @@ static int VbCmosRead(int offs, size_t size, void *ptr) {
VbFixCmosChecksum(f);
res = fread(ptr, size, 1, f);
}
- if (1 != res) {
- fclose(f);
- return -1;
- }
- return 0;
+ fclose(f);
+ return (1 == res) ? 0 : -1;
}
@@ -129,17 +126,19 @@ static int VbCmosWrite(int offs, size_t size, const void *ptr) {
if (!f)
return -1;
+ if (0 != fseek(f, offs, SEEK_SET)) {
+ fclose(f);
+ return -1;
+ }
+
res = fwrite(ptr, size, 1, f);
if (1 != res && errno == EIO && ferror(f)) {
VbFixCmosChecksum(f);
res = fwrite(ptr, size, 1, f);
}
- if (1 != res) {
- fclose(f);
- return -1;
- }
- return 0;
+ fclose(f);
+ return (1 == res) ? 0 : -1;
}