Messages in this thread Patch in this message | | | From | Paran Lee <> | Subject | [RESEND PATCH] perf tools: Add levenshtein ENOMEM check | Date | Wed, 15 Mar 2023 15:11:33 +0900 |
| |
The levenshtein algorithm requires exception handling when making dynamic allocations strings.
Signed-off-by: Paran Lee <p4ranlee@gmail.com> --- tools/perf/util/help-unknown-cmd.c | 6 +++++- tools/perf/util/levenshtein.c | 16 ++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/tools/perf/util/help-unknown-cmd.c b/tools/perf/util/help-unknown-cmd.c index ab9e16123626..a70ef339b8af 100644 --- a/tools/perf/util/help-unknown-cmd.c +++ b/tools/perf/util/help-unknown-cmd.c @@ -74,10 +74,14 @@ const char *help_unknown_cmd(const char *cmd) if (main_cmds.cnt) { /* This reuses cmdname->len for similarity index */ - for (i = 0; i < main_cmds.cnt; ++i) + for (i = 0; i < main_cmds.cnt; ++i) { main_cmds.names[i]->len = levenshtein(cmd, main_cmds.names[i]->name, 0, 2, 1, 4); + if(main_cmds.names[i]->len == -ENOMEM) + goto end; + } + qsort(main_cmds.names, main_cmds.cnt, sizeof(*main_cmds.names), levenshtein_compare); diff --git a/tools/perf/util/levenshtein.c b/tools/perf/util/levenshtein.c index 6a6712635aa4..0f0f244f142b 100644 --- a/tools/perf/util/levenshtein.c +++ b/tools/perf/util/levenshtein.c @@ -45,11 +45,17 @@ int levenshtein(const char *string1, const char *string2, int w, int s, int a, int d) { int len1 = strlen(string1), len2 = strlen(string2); - int *row0 = malloc(sizeof(int) * (len2 + 1)); - int *row1 = malloc(sizeof(int) * (len2 + 1)); - int *row2 = malloc(sizeof(int) * (len2 + 1)); + int *rows, *row0, *row1, *row2; int i, j; + rows = malloc(3 * sizeof(int) * (len2 + 1)); + if(!rows) + return -ENOMEM; + + row0 = &rows[0]; + row1 = &rows[1]; + row2 = &rows[2]; + for (j = 0; j <= len2; j++) row1[j] = j * a; for (i = 0; i < len1; i++) { @@ -79,9 +85,7 @@ int levenshtein(const char *string1, const char *string2, } i = row1[len2]; - free(row0); - free(row1); - free(row2); + free(rows); return i; } -- 2.34.1
| |