[CRIU] [PATCH v5 2/3] Do not error out in RPC mode with wrong config file entries
Andrei Vagin
avagin at gmail.com
Thu Dec 27 00:42:56 MSK 2018
On Thu, Dec 20, 2018 at 04:18:12PM +0000, Adrian Reber wrote:
> From: Adrian Reber <areber at redhat.com>
>
> Relates: https://github.com/checkpoint-restore/criu/issues/578
>
> If the config parser finds a unknown option in the configuration file,
> the wrong option is printed out and CRIU exits.
>
> In RPC mode this is not the best thing to do, as CRIU might not be able
> to print the message to the user.
It is a bad explanation, because with your first patch the user will see
errors. I am not sure why we need to ignore unknown options in config
files. It looks dangerous, because the user can do a typo and will not
notice it.
>
> This changes CRIU's behaviour in RPC mode to write a wrong configuration
> option to the log file. In CLI mode nothing changes:
>
> $ echo test >> /etc/criu/default.conf
> $ criu check
> criu: unrecognized option '--test'
> $ runc checkpoint <container>
> $ grep Unknown dump.log
> Warn (criu/config.c:812): Unknown option encountered: --test
> $ echo test-runc >> /etc/criu/runc.conf
> $ runc restore -d <container>
> $ grep Unknown restore.log
> Warn (criu/config.c:812): Unknown option encountered: --test
> Warn (criu/config.c:812): Unknown option encountered: --test-runc
>
> This way unknown configuration file entries do not break RPC mode, but
> they are reported.
>
> Reported-by: Radostin Stoyanov <rstoyanov1 at gmail.com>
> Signed-off-by: Adrian Reber <areber at redhat.com>
> ---
> criu/config.c | 38 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 38 insertions(+)
>
> diff --git a/criu/config.c b/criu/config.c
> index f4fb39b86..3c54fa72a 100644
> --- a/criu/config.c
> +++ b/criu/config.c
> @@ -31,6 +31,8 @@
>
> struct cr_options opts;
>
> +static bool rpc_mode = false;
> +
> static int count_elements(char **to_count)
> {
> int count = 0;
> @@ -235,6 +237,20 @@ static int pre_parse(int argc, char **argv, bool *usage_error, bool *no_default_
> } else if (strstr(argv[i], "--config=") != NULL) {
> *cfg_file = argv[i] + strlen("--config=");
> *no_default_config = true;
> + } else if (!strcmp(argv[i], "swrk")) {
> + /*
> + * In RPC mode we do not want to error out if we
> + * encounter unknown options. The options can only
> + * be from a configuration file. To not error out
> + * because of wrong lines in the configuration file
> + * this just prints the wrong option into the log.
> + */
> + rpc_mode = true;
> + /*
> + * This is only needed so that getopt() does not
> + * print invalid options to stderr.
> + */
> + opterr = 0;
> }
> }
>
> @@ -787,6 +803,28 @@ int parse_options(int argc, char **argv, bool *usage_error,
> case 'h':
> *usage_error = false;
> return 2;
> + case '?':
> + /*
> + * In RPC mode we do not want to
> + * error out if an unknown option is found.
> + * This writes it to the log file and continues.
> + */
> + if (rpc_mode) {
> + pr_warn("Unknown option encountered: %s\n", _argv[optind - 1]);
> + break;
> + } else {
> + /*
> + * Only an unknown option that starts with '-' needs to be
> + * reported to the user. getopt() knows nothing about our
> + * commands (dump, check, swrk, ...). Those should be
> + * ignored.
> + */
> + if (_argv[optind - 1][0] == '-') {
> + *usage_error = true;
> + return 2;
> + }
> + }
> + break;
> default:
> return 2;
> }
> --
> 2.18.0
>
More information about the CRIU
mailing list