diff options
author | Petr Rockai <prockai@redhat.com> | 2012-09-19 23:30:16 +0200 |
---|---|---|
committer | Petr Rockai <prockai@redhat.com> | 2012-09-26 17:26:23 +0200 |
commit | c731bb1ee13565763cc1ac77ed1a01ccea0337ac (patch) | |
tree | 9a38ac6074ab04b5706ff29dca8e45d465f26e4b | |
parent | d2d66634282459438210f1f9ba7e2e4c910e13ba (diff) | |
download | lvm2-c731bb1ee13565763cc1ac77ed1a01ccea0337ac.tar.gz lvm2-c731bb1ee13565763cc1ac77ed1a01ccea0337ac.tar.xz lvm2-c731bb1ee13565763cc1ac77ed1a01ccea0337ac.zip |
lvmetad: Fix #845269: SEGV on corrupt lvmetad response.
-rw-r--r-- | lib/cache/lvmetad.c | 6 | ||||
-rw-r--r-- | libdaemon/client/daemon-client.c | 2 |
2 files changed, 5 insertions, 3 deletions
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c index a7e3cd38..8ac5732c 100644 --- a/lib/cache/lvmetad.c +++ b/lib/cache/lvmetad.c @@ -86,7 +86,7 @@ static int _token_update() { daemon_reply repl = _lvmetad_send("token_update", NULL); - if (strcmp(daemon_reply_str(repl, "response", ""), "OK")) { + if (repl.error || strcmp(daemon_reply_str(repl, "response", ""), "OK")) { daemon_reply_destroy(repl); return 0; } @@ -118,7 +118,7 @@ retry: daemon_request_destroy(req); - if (!strcmp(daemon_reply_str(repl, "response", ""), "token_mismatch") && try < 2 && !test_mode()) { + if (!repl.error && !strcmp(daemon_reply_str(repl, "response", ""), "token_mismatch") && try < 2 && !test_mode()) { future_token = _lvmetad_token; _lvmetad_token = (char *) "update in progress"; if (!_token_update()) goto out; @@ -298,7 +298,7 @@ struct volume_group *lvmetad_vg_lookup(struct cmd_context *cmd, const char *vgna reply = _lvmetad_send("vg_lookup", "name = %s", vgname, NULL); } - if (!strcmp(daemon_reply_str(reply, "response", ""), "OK")) { + if (!reply.error && !strcmp(daemon_reply_str(reply, "response", ""), "OK")) { if (!(top = dm_config_find_node(reply.cft->root, "metadata"))) { log_error(INTERNAL_ERROR "metadata config node not found."); diff --git a/libdaemon/client/daemon-client.c b/libdaemon/client/daemon-client.c index 0ade3295..39b082fa 100644 --- a/libdaemon/client/daemon-client.c +++ b/libdaemon/client/daemon-client.c @@ -81,6 +81,8 @@ daemon_reply daemon_send(daemon_handle h, daemon_request rq) if (read_buffer(h.socket_fd, &reply.buffer)) { reply.cft = dm_config_from_string(reply.buffer); + if (!reply.cft) + reply.error = EPROTO; } else reply.error = errno; |