diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2012-06-21 12:43:31 +0200 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2012-08-23 14:37:52 +0200 |
commit | fd417db274e9a75f33f661b475aeebfd3d9eae45 (patch) | |
tree | 0a141abbc4fca181dd8ebd93859a7723caceee0f | |
parent | 15891d366d34fa6ea7235ec803ee0c5445a17101 (diff) | |
download | lvm2-fd417db274e9a75f33f661b475aeebfd3d9eae45.tar.gz lvm2-fd417db274e9a75f33f661b475aeebfd3d9eae45.tar.xz lvm2-fd417db274e9a75f33f661b475aeebfd3d9eae45.zip |
check: add internal errors for unexpected paths
Adding couple INTERNAL_ERROR reports for unwanted parameters:
Ensure the 'top' metadata node cannot be NULL for lvmetad.
Make obvious vginfo2 cannot be NULL.
Report internal error if handler and vg is undefined.
Check for handle in poll_vg().
Ensure seg is not NULL in dev_manager_transient().
Report missing read_ahead for _lv_read_ahead_single().
Check for report handler in dm_report_object().
Check missing VG in _vgreduce_single().
-rw-r--r-- | lib/activate/dev_manager.c | 5 | ||||
-rw-r--r-- | lib/cache/lvmcache.c | 12 | ||||
-rw-r--r-- | lib/cache/lvmetad.c | 11 | ||||
-rw-r--r-- | lib/metadata/metadata.c | 5 | ||||
-rw-r--r-- | libdm/libdm-report.c | 5 | ||||
-rw-r--r-- | tools/polldaemon.c | 5 | ||||
-rw-r--r-- | tools/vgreduce.c | 5 |
7 files changed, 42 insertions, 6 deletions
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c index 122741c1..43bcd49d 100644 --- a/lib/activate/dev_manager.c +++ b/lib/activate/dev_manager.c @@ -668,6 +668,11 @@ int dev_manager_transient(struct dev_manager *dm, struct logical_volume *lv) if (!type || !params) continue; + if (!seg) { + log_error(INTERNAL_ERROR "Segment is not selected."); + goto out; + } + if (seg->segtype->ops->check_transient_status && !seg->segtype->ops->check_transient_status(seg, params)) goto_out; diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c index 8936809b..6f9cfada 100644 --- a/lib/cache/lvmcache.c +++ b/lib/cache/lvmcache.c @@ -1005,12 +1005,14 @@ static int _free_vginfo(struct lvmcache_vginfo *vginfo) vginfo->vgname); r = 0; } - } else do - if (vginfo2->next == vginfo) { - vginfo2->next = vginfo->next; - break; + } else + while (vginfo2) { + if (vginfo2->next == vginfo) { + vginfo2->next = vginfo->next; + break; + } + vginfo2 = vginfo2->next; } - while ((vginfo2 = vginfo2->next)); dm_free(vginfo->vgname); dm_free(vginfo->creation_host); diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c index db092acc..6e1759b4 100644 --- a/lib/cache/lvmetad.c +++ b/lib/cache/lvmetad.c @@ -199,7 +199,11 @@ struct volume_group *lvmetad_vg_lookup(struct cmd_context *cmd, const char *vgna if (!strcmp(daemon_reply_str(reply, "response", ""), "OK")) { - top = dm_config_find_node(reply.cft->root, "metadata"); + if (!(top = dm_config_find_node(reply.cft->root, "metadata"))) { + log_error(INTERNAL_ERROR "metadata config node not found."); + goto out; + } + name = daemon_reply_str(reply, "name", NULL); /* fall back to lvm2 if we don't know better */ @@ -593,6 +597,11 @@ int lvmetad_pv_found(struct id pvid, struct device *device, const struct format_ "metadata = %b", strchr(buf, '{'), NULL); } else { + if (handler) { + log_error(INTERNAL_ERROR "Handler needs existing VG."); + dm_free(pvmeta); + return 0; + } /* There are no MDAs on this PV. */ reply = daemon_send_simple(_lvmetad, "pv_found", diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index dd029aca..fd13b0a6 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -2221,6 +2221,11 @@ static int _lv_read_ahead_single(struct logical_volume *lv, void *data) struct lv_segment *seg = first_seg(lv); uint32_t seg_read_ahead = 0, *read_ahead = data; + if (!read_ahead) { + log_error(INTERNAL_ERROR "Read ahead data missing."); + return 0; + } + if (seg && seg->area_count && seg_type(seg, 0) == AREA_PV) dev_get_read_ahead(seg_pv(seg, 0)->dev, &seg_read_ahead); diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c index 3f867674..0bafa86d 100644 --- a/libdm/libdm-report.c +++ b/libdm/libdm-report.c @@ -695,6 +695,11 @@ int dm_report_object(struct dm_report *rh, void *object) struct dm_report_field *field; void *data = NULL; + if (!rh) { + log_error(INTERNAL_ERROR "dm_report handler is NULL."); + return 0; + } + if (!(row = dm_pool_zalloc(rh->mem, sizeof(*row)))) { log_error("dm_report_object: struct row allocation failed"); return 0; diff --git a/tools/polldaemon.c b/tools/polldaemon.c index fe55c3b6..f57484ea 100644 --- a/tools/polldaemon.c +++ b/tools/polldaemon.c @@ -261,6 +261,11 @@ static int _poll_vg(struct cmd_context *cmd, const char *vgname, const char *name; int finished; + if (!parms) { + log_error(INTERNAL_ERROR "Handle is undefined."); + return ECMD_FAILED; + } + dm_list_iterate_items(lvl, &vg->lvs) { lv = lvl->lv; if (!(lv->status & parms->lv_type)) diff --git a/tools/vgreduce.c b/tools/vgreduce.c index 96966513..975b9eab 100644 --- a/tools/vgreduce.c +++ b/tools/vgreduce.c @@ -124,6 +124,11 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg, int r = ECMD_FAILED; const char *name = pv_dev_name(pv); + if (!vg) { + log_error(INTERNAL_ERROR "VG is NULL."); + return ECMD_FAILED; + } + if (pv_pe_alloc_count(pv)) { log_error("Physical volume \"%s\" still in use", name); return ECMD_FAILED; |