On Mon, 12 Oct 2020 15:18:06 -0500
Tom Zanussi <zanu...@kernel.org> wrote:

> +static int cmdstr_append(char *buf, const char *str, int *remaining)
> +{
> +     int len = strlen(str);
> +
> +     if (len + 1 >= *remaining) {
> +             synth_err(SYNTH_ERR_CMD_TOO_LONG, 0);
> +             return -EINVAL;
> +     }
> +
> +     strcat(buf, str);
> +     strcat(buf, " ");
> +     *remaining -= len + 1;
> +
> +     return 0;
> +}
> +
> +static int save_cmdstr(int argc, const char *name, const char **argv)
> +{
> +     int i, ret, remaining = MAX_DYNEVENT_CMD_LEN;
> +     char *buf;
> +
> +     synth_err_clear();
> +
> +     buf = kzalloc(MAX_DYNEVENT_CMD_LEN, GFP_KERNEL);
> +     if (!buf)
> +             return -ENOMEM;
> +
> +     ret = cmdstr_append(buf, name, &remaining);
> +     if (ret) {
> +             kfree(buf);
> +             return ret;
> +     }
> +
> +     for (i = 0; i < argc; i++) {
> +             ret = cmdstr_append(buf, argv[i], &remaining);
> +             if (ret) {
> +                     kfree(buf);
> +                     return ret;
> +             }
> +     }
> +
> +     last_cmd_set(buf);
> +
> +     kfree(buf);
> +
> +     return ret;
> +}
> +

Hmm, the above could easily be replaced with:

        struct seq_buf s;

        buf = kzalloc(MAX_DYNEVENT_CMD_LEN, GFP_KERNEL);
        if (!buf)
                return -ENOMEM;

        seq_buf_init(&s, buf, MAX_DYNEVENT_CMD_LEN);

        seq_buf_puts(&s, name);

        for (i = 0; i < argc; i++) {
                seq_buf_putc(&s, ' ');
                seq_buf_puts(&s, argv[i]);
        }

        if (!seq_buf_buffer_left(&s)) {
                synth_err(SYNTH_ERR_CMD_TOO_LONG, 0);
                kfree(buf);
                return -EINVAL;
        }
        buf[s.len] = 0;
        last_cmd_set(buf);

        kfree(buf);
        return 0;


-- Steve

Reply via email to