diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-04-06 10:05:59 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-04-06 22:16:41 +0200 |
| commit | 452e5f40f84231346e53c013c601d83d31677954 (patch) | |
| tree | e5596890af30580069436fbb9ed63aca5e143b68 /sam.c | |
| parent | 01aac39a29ecd70136fa091f6de2b46181422a37 (diff) | |
| download | vis-452e5f40f84231346e53c013c601d83d31677954.tar.gz vis-452e5f40f84231346e53c013c601d83d31677954.tar.xz | |
sam: properly free transcript in error case
Diffstat (limited to 'sam.c')
| -rw-r--r-- | sam.c | 23 |
1 files changed, 19 insertions, 4 deletions
@@ -1105,6 +1105,7 @@ enum SamError sam_cmd(Vis *vis, const char *s) { Transcript *t = &file->transcript; if (t->error != SAM_ERR_OK) { err = t->error; + sam_transcript_free(t); continue; } vis_file_snapshot(vis, file); @@ -1211,7 +1212,11 @@ static bool cmd_insert(Vis *vis, Win *win, Command *cmd, const char *argv[], Cur return false; Buffer buf = text(vis, argv[1]); size_t len = buffer_length(&buf); - return sam_insert(win, cur, range->start, buffer_move(&buf), len); + char *data = buffer_move(&buf); + bool ret = sam_insert(win, cur, range->start, data, len); + if (!ret) + free(data); + return ret; } static bool cmd_append(Vis *vis, Win *win, Command *cmd, const char *argv[], Cursor *cur, Filerange *range) { @@ -1219,7 +1224,11 @@ static bool cmd_append(Vis *vis, Win *win, Command *cmd, const char *argv[], Cur return false; Buffer buf = text(vis, argv[1]); size_t len = buffer_length(&buf); - return sam_insert(win, cur, range->end, buffer_move(&buf), len); + char *data = buffer_move(&buf); + bool ret = sam_insert(win, cur, range->end, data, len); + if (!ret) + free(data); + return ret; } static bool cmd_change(Vis *vis, Win *win, Command *cmd, const char *argv[], Cursor *cur, Filerange *range) { @@ -1227,7 +1236,11 @@ static bool cmd_change(Vis *vis, Win *win, Command *cmd, const char *argv[], Cur return false; Buffer buf = text(vis, argv[1]); size_t len = buffer_length(&buf); - return sam_change(win, cur, range, buffer_move(&buf), len); + char *data = buffer_move(&buf); + bool ret = sam_change(win, cur, range, data, len); + if (!ret) + free(data); + return ret; } static bool cmd_delete(Vis *vis, Win *win, Command *cmd, const char *argv[], Cursor *cur, Filerange *range) { @@ -1547,7 +1560,9 @@ static bool cmd_filter(Vis *vis, Win *win, Command *cmd, const char *argv[], Cur vis_info_show(vis, "Command cancelled"); } else if (status == 0) { size_t len = buffer_length(&bufout); - sam_change(win, cur, range, buffer_move(&bufout), len); + char *data = buffer_move(&bufout); + if (!sam_change(win, cur, range, data, len)) + free(data); } else { vis_info_show(vis, "Command failed %s", buffer_content0(&buferr)); } |
