[dm-devel] [PATCH] multipathd: Fixed multipathd parameter invoking

Martin Wilck mwilck at suse.com
Thu Dec 1 09:11:39 UTC 2022


On Thu, 2022-12-01 at 15:30 +0800, lixiaokeng wrote:
> Before we apply f812466f ("multipathd: more robust command parsing"),
> multipathd help shows:
> ...
>  map|multipath $map getprstatus
>  map|multipath $map setprstatus
>  map|multipath $map unsetprstatus
>  map|multipath $map getprkey
>  map|multipath $map setprkey key $key
>  map|multipath $map unsetprkey
>  forcequeueing daemon
>  restorequeueing daemon
>  path $path setmarginal
>  path $path unsetmarginal
>  map|multipath $map unsetmarginal
> 
> We think it is better to keep this consistent, so we fix it
> as this patch. Besides that, we also change "getprstatus'
> "getprkey" "setmarginal" "unsetmarginal" orders to keep
> consistent and avoid same problem if users use "multipathd
> xxx" (like getprkey).

Yes, it's unfortunate that the current behavior doesn't comply with the
old help text. But I disagree that this should be "fixed" in the
current code. The old syntax was arguably inconsistent. We now have a
very consistent command structure with a verb followed by arguments,
and we should keep it at that, even if it means that some scripts need
to be adapted.

Therefore I support Ben's approach.

Martin



> 
> On 2022/12/1 0:04, Benjamin Marzinski wrote:
> > On Wed, Nov 30, 2022 at 05:13:28PM +0800, miaoguanqin wrote:
> > > ping
> > 
> > I fixed this issue a different way. Previously we accepted any
> > ordering
> > of keywords, but we have always advertised a specific order in the
> > CLI
> > commands reference (to see it, just run "mulitpathd help" or use
> > any
> > other invalid keyword). The command word is first and the arguments
> > follow.  I think we should keep this consistent, and I don't think
> > we
> > should go changing the order of existing commands. Instead, my
> > patch
> > makes libmpathpersist issue commands in the correct order. Could
> > you
> > look at:
> > 
> > [dm-devel] [PATCH 2/2] libmpathpersist: fix command keyword
> > ordering
> > https://listman.redhat.com/archives/dm-devel/2022-November/052773.html
> > 
> > and see if that solves your issue.
> > 
> > -Ben
> > 
> > > 
> > > On 2022/11/25 9:26, miaoguanqin wrote:
> > > > Users may fail to execute command: multipathd and mpathpersist.
> > > > 
> > > > When we execute the command mpathpersist:
> > > > mpathpersist --out --register --param-sark=123 --prout-type=5
> > > > /dev/mapper/mpathb
> > > > It return an error : Missing arguement. The preceding command
> > > > calls the
> > > > function
> > > > cli_setprkey, which is called by checking whether the handle
> > > > values are
> > > > consistent
> > > > with the command input. CVE-2022-41974 changed the handler
> > > > value of
> > > > function and
> > > > changed the mode of calculating handle.  The handler value is
> > > > not equal to
> > > > the
> > > > command input, causing multipathd can not execute the true
> > > > funcion. It
> > > > could be
> > > > an same error for executing multipathd by the old mode.
> > > > 
> > > > multipathd invokes the corresponding function based on the
> > > > handle value.
> > > > CVE-2022-41964 changed the method of calculating handler value.
> > > > Modify the
> > > > handle
> > > > value so that the corresponding function can be correctly
> > > > execute.
> > > > 
> > > > Signed-off-by: miaoguanqin <miaoguanqin at huawei.com>
> > > > Signed-off-by: lixiaokeng <lixiaokeng at huawei.com>
> > > > ---
> > > >  multipathd/callbacks.c | 18 +++++++++---------
> > > >  multipathd/cli.h       |  9 ++++++++-
> > > >  2 files changed, 17 insertions(+), 10 deletions(-)
> > > > 
> > > > diff --git a/multipathd/callbacks.c b/multipathd/callbacks.c
> > > > index fb87b280..f32666be 100644
> > > > --- a/multipathd/callbacks.c
> > > > +++ b/multipathd/callbacks.c
> > > > @@ -57,16 +57,16 @@ void init_handler_callbacks(void)
> > > >      set_handler_callback(VRB_RESTOREQ | Q1_MAPS,
> > > > HANDLER(cli_restore_all_queueing));
> > > >      set_unlocked_handler_callback(VRB_QUIT,
> > > > HANDLER(cli_quit));
> > > >      set_unlocked_handler_callback(VRB_SHUTDOWN,
> > > > HANDLER(cli_shutdown));
> > > > -    set_handler_callback(VRB_GETPRSTATUS | Q1_MAP,
> > > > HANDLER(cli_getprstatus));
> > > > -    set_handler_callback(VRB_SETPRSTATUS | Q1_MAP,
> > > > HANDLER(cli_setprstatus));
> > > > -    set_handler_callback(VRB_UNSETPRSTATUS | Q1_MAP,
> > > > HANDLER(cli_unsetprstatus));
> > > > +    set_handler_callback(KEY_MAP | Q1_GETPRSTATUS,
> > > > HANDLER(cli_getprstatus));
> > > > +    set_handler_callback(KEY_MAP | Q1_SETSTATUS,
> > > > HANDLER(cli_setprstatus));
> > > > +    set_handler_callback(KEY_MAP | Q1_UNSETSTATUS,
> > > > HANDLER(cli_unsetprstatus));
> > > >      set_handler_callback(VRB_FORCEQ | Q1_DAEMON,
> > > > HANDLER(cli_force_no_daemon_q));
> > > >      set_handler_callback(VRB_RESTOREQ | Q1_DAEMON,
> > > > HANDLER(cli_restore_no_daemon_q));
> > > > -    set_handler_callback(VRB_GETPRKEY | Q1_MAP,
> > > > HANDLER(cli_getprkey));
> > > > -    set_handler_callback(VRB_SETPRKEY | Q1_MAP | Q2_KEY,
> > > > HANDLER(cli_setprkey));
> > > > -    set_handler_callback(VRB_UNSETPRKEY | Q1_MAP,
> > > > HANDLER(cli_unsetprkey));
> > > > -    set_handler_callback(VRB_SETMARGINAL | Q1_PATH,
> > > > HANDLER(cli_set_marginal));
> > > > -    set_handler_callback(VRB_UNSETMARGINAL | Q1_PATH,
> > > > HANDLER(cli_unset_marginal));
> > > > -    set_handler_callback(VRB_UNSETMARGINAL | Q1_MAP,
> > > > +    set_handler_callback(KEY_MAP | Q1_GETPRKEY,
> > > > HANDLER(cli_getprkey));
> > > > +    set_handler_callback(KEY_MAP | Q1_SETKEY | Q2_KEY,
> > > > HANDLER(cli_setprkey));
> > > > +    set_handler_callback(KEY_MAP | Q1_UNSETKEY,
> > > > HANDLER(cli_unsetprkey));
> > > > +    set_handler_callback(KEY_PATH | Q1_SETMARGINAL,
> > > > HANDLER(cli_set_marginal));
> > > > +    set_handler_callback(KEY_PATH | Q1_UNSETMARGINAL,
> > > > HANDLER(cli_unset_marginal));
> > > > +    set_handler_callback(KEY_MAP | Q1_UNSETMARGINAL,
> > > >                   HANDLER(cli_unset_all_marginal));
> > > >  }
> > > > diff --git a/multipathd/cli.h b/multipathd/cli.h
> > > > index c6b79c9d..08ee5c8d 100644
> > > > --- a/multipathd/cli.h
> > > > +++ b/multipathd/cli.h
> > > > @@ -80,7 +80,14 @@ enum {
> > > >      Q1_ALL            = KEY_ALL << 8,
> > > >      Q1_DAEMON        = KEY_DAEMON << 8,
> > > >      Q1_STATUS        = KEY_STATUS << 8,
> > > > -
> > > > +    Q1_SETKEY        = VRB_SETPRKEY << 8,
> > > > +    Q1_UNSETKEY        = VRB_UNSETPRKEY << 8,
> > > > +    Q1_SETSTATUS        = VRB_SETPRSTATUS << 8,
> > > > +    Q1_UNSETSTATUS        = VRB_UNSETPRSTATUS << 8,
> > > > +    Q1_GETPRSTATUS        = VRB_GETPRSTATUS << 8,
> > > > +    Q1_GETPRKEY        = VRB_GETPRKEY << 8,
> > > > +    Q1_SETMARGINAL        = VRB_SETMARGINAL << 8,
> > > > +    Q1_UNSETMARGINAL    = VRB_UNSETMARGINAL << 8,
> > > >      /* byte 2: qualifier 2 */
> > > >      Q2_FMT            = KEY_FMT << 16,
> > > >      Q2_RAW            = KEY_RAW << 16,
> > 
> > .
> > 



More information about the dm-devel mailing list