summaryrefslogtreecommitdiff
path: root/lib/mirror
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2012-02-08 11:29:13 +0000
committerZdenek Kabelac <zkabelac@redhat.com>2012-02-08 11:29:13 +0000
commitb63b77514327e7b90dcc17e3a7ae5b784d5e5ee4 (patch)
tree1e5551aaec169dd9bee4b2ab7aeaa99943773740 /lib/mirror
parentebc9abf6c0525df2c6ce5e210c205f014b5d4d0d (diff)
downloadlvm2-b63b77514327e7b90dcc17e3a7ae5b784d5e5ee4.tar.gz
Add boundary test for number of mirror devs and logs
As atoi may return negative value - test for both limits. Test log_args for limits before calling alloca(). Code from dmeventd mirror plugin should probably share same code as we have in mirrored.c.
Diffstat (limited to 'lib/mirror')
-rw-r--r--lib/mirror/mirrored.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/lib/mirror/mirrored.c b/lib/mirror/mirrored.c
index e80fee6da..a20fff479 100644
--- a/lib/mirror/mirrored.c
+++ b/lib/mirror/mirrored.c
@@ -248,7 +248,7 @@ static int _mirrored_transient_status(struct lv_segment *seg, char *params)
p += strlen(p) + 1;
- if (num_devs > DEFAULT_MIRROR_MAX_IMAGES) {
+ if (num_devs > DEFAULT_MIRROR_MAX_IMAGES || num_devs < 0) {
log_error("Unexpectedly many (%d) mirror images in %s.",
num_devs, lv->name);
return_0;
@@ -261,14 +261,14 @@ static int _mirrored_transient_status(struct lv_segment *seg, char *params)
return_0;
log_argc = atoi(args[3 + num_devs]);
- log_args = alloca(log_argc * sizeof(char *));
- if (log_argc > 16) {
+ if (log_argc > 16 || log_argc < 0) {
log_error("Unexpectedly many (%d) log arguments in %s.",
log_argc, lv->name);
return_0;
}
+ log_args = alloca(log_argc * sizeof(char *));
if (dm_split_words(args[3 + num_devs] + strlen(args[3 + num_devs]) + 1,
log_argc, 0, log_args) < log_argc)