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