From 452e5f40f84231346e53c013c601d83d31677954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 6 Apr 2017 10:05:59 +0200 Subject: sam: properly free transcript in error case --- sam.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'sam.c') diff --git a/sam.c b/sam.c index 20c58b8..fbfb0d1 100644 --- a/sam.c +++ b/sam.c @@ -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)); } -- cgit v1.2.3