hw/uefi: fix error handling in uefi_vars_json_save

Catch lseek errors.  Return on errors.
Use autoptr for the GString to simplify cleanup.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-ID: <20250319141159.1461621-3-kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2025-03-19 15:11:54 +01:00
parent 560429fd74
commit ae24cf139b

View file

@ -178,7 +178,7 @@ void uefi_vars_json_init(uefi_vars_state *uv, Error **errp)
void uefi_vars_json_save(uefi_vars_state *uv) void uefi_vars_json_save(uefi_vars_state *uv)
{ {
GString *gstr; g_autoptr(GString) gstr = NULL;
int rc; int rc;
if (uv->jsonfd == -1) { if (uv->jsonfd == -1) {
@ -187,18 +187,25 @@ void uefi_vars_json_save(uefi_vars_state *uv)
gstr = uefi_vars_to_json(uv); gstr = uefi_vars_to_json(uv);
lseek(uv->jsonfd, 0, SEEK_SET); rc = lseek(uv->jsonfd, 0, SEEK_SET);
if (rc < 0) {
warn_report("%s: lseek error", __func__);
return;
}
rc = ftruncate(uv->jsonfd, 0); rc = ftruncate(uv->jsonfd, 0);
if (rc != 0) { if (rc != 0) {
warn_report("%s: ftruncate error", __func__); warn_report("%s: ftruncate error", __func__);
return;
} }
rc = write(uv->jsonfd, gstr->str, gstr->len); rc = write(uv->jsonfd, gstr->str, gstr->len);
if (rc != gstr->len) { if (rc != gstr->len) {
warn_report("%s: write error", __func__); warn_report("%s: write error", __func__);
return;
} }
fsync(uv->jsonfd);
g_string_free(gstr, true); fsync(uv->jsonfd);
} }
void uefi_vars_json_load(uefi_vars_state *uv, Error **errp) void uefi_vars_json_load(uefi_vars_state *uv, Error **errp)