diff --git a/src/syncterm/ripper.c b/src/syncterm/ripper.c
index a0ecf7dda480594912281f2493616e620cd85b25..a289c3e2938ab19d356b33734798d9515fd77d74 100644
--- a/src/syncterm/ripper.c
+++ b/src/syncterm/ripper.c
@@ -7253,6 +7253,7 @@ get_text_variable(const char * const var)
 	vardef = bsearch(var, builtins, sizeof(builtins) / sizeof(builtins[0]), sizeof(builtins[0]), bicmp);
 	if (vardef == NULL) {
 		puts("TODO: User variables");
+		return(calloc(1, 1));
 	}
 	return vardef->func(var, vardef->data);
 }
@@ -7286,6 +7287,7 @@ rv_date(const char * const var, const void * const data)
 									ctime_r(&now, str);
 									return strdup(str);
 							}
+							break;
 						case 'Y':
 							snprintf(str, sizeof(str), "%02d", nlt.tm_mday);
 							return strdup(str);
@@ -7726,10 +7728,9 @@ parse_string(const char *buf)
 	char *p;
 	int ch;
 
-	char *ret = malloc(strlen(buf));
+	char *ret = malloc(strlen(buf) + 1);
 	if (ret == NULL)
 		return ret;
-	p = ret;
 	for (p = ret; (ch = next_char(buf, &inpos)) > 0; inpos++)
 		*(p++) = ch;
 	*p = 0;
@@ -8722,6 +8723,12 @@ add_button(int x1, int y1, int x2, int y2, int hotkey, int flags, char *text)
 	}
 
 	draw_button(but, false);
+	if (!but->flags.mouse) {
+		free(but->command);
+		free(but->icon);
+		free(but->label);
+		free(but);
+	}
 }
 
 static void append_str(uint8_t **resp, size_t *size, size_t *pos, const char *str)
@@ -8790,6 +8797,8 @@ do_popup(const char * const str)
 	if (soo == NULL)
 		return NULL;
 	question = strndup(p, soo - p);
+	if (question == NULL)
+		return NULL;
 	soo += 2;
 	p = soo;
 	opts = 0;
@@ -8909,6 +8918,7 @@ do_popup(const char * const str)
 	rip.x = x;
 	rip.y = y;
 	write_text(question);
+	free(question);
 
 	for (i = 0; i < opts; i++) {
 		set_pixel(x1 + 13, y1 + 27 + (i * 13), light);
@@ -9019,13 +9029,11 @@ handle_command_str(const char *incmd)
 {
 	const char *p, *p2, *p3, *p4;
 	char str[2];
-	const char *cmd;
 
 	if (incmd == NULL)
 		return;
-	cmd = strdup(incmd);
 
-	for (p = cmd; *p; p++) {
+	for (p = incmd; *p; p++) {
 		// TODO: No way to send a ^ or a $ or a [
 		if (*p == '^' || *p == '`') {	// CTRL char
 			p++;
@@ -10125,6 +10133,7 @@ setpixel(x1, y1, xx);
 								}
 								draw_line(argv[arg1 - 1].x, argv[arg1 - 1].y, argv[0].x, argv[0].y);
 							}
+							free(argv);
 							break;
 						case 's':	// RIP_FILL_PATTERN
 							handled = true;
@@ -10505,7 +10514,7 @@ setpixel(x1, y1, xx);
 									if (fread(planes, row, 4, icn) != 4) {
 										free(planes);
 										free(pix->pixels);
-										free(pix);
+										FREE_AND_NULL(pix);
 										fclose(icn);
 										break;
 									}
@@ -10517,18 +10526,20 @@ setpixel(x1, y1, xx);
 										*(op++) = ega_colours[co];
 									}
 								}
-								fclose(icn);
-								free(planes);
+								if (pix) {
+									fclose(icn);
+									free(planes);
 
-								struct text_info ti;
-								gettextinfo(&ti);
-								setpixels(x1 + rip.viewport.sx, y1 + rip.viewport.sy, x1 + rip.viewport.sx + pix->width - 1, y1 + rip.viewport.sy + pix->height - 1, 0, 0, pix, NULL);
-								if (arg2) {
-									freepixels(rip.clipboard);
-									rip.clipboard = pix;
-								}
-								else {
-									freepixels(pix);
+									struct text_info ti;
+									gettextinfo(&ti);
+									setpixels(x1 + rip.viewport.sx, y1 + rip.viewport.sy, x1 + rip.viewport.sx + pix->width - 1, y1 + rip.viewport.sy + pix->height - 1, 0, 0, pix, NULL);
+									if (arg2) {
+										freepixels(rip.clipboard);
+										rip.clipboard = pix;
+									}
+									else {
+										freepixels(pix);
+									}
 								}
 							}
 							break;
@@ -10706,14 +10717,16 @@ setpixel(x1, y1, xx);
 									if (fwrite(planes, row, 4, icn) != 4) {
 										fclose(icn);
 										unlink(cache_path);
-										free(planes);
+										FREE_AND_NULL(planes);
 										fclose(icn);
 										break;
 									}
 								}
-								fwrite("F", 1, 1, icn);
-								fclose(icn);
-								free(planes);
+								if (planes) {
+									fwrite("F", 1, 1, icn);
+									fclose(icn);
+									free(planes);
+								}
 							}
 							break;
 					}
@@ -11096,6 +11109,11 @@ do_skypix(char *buf, size_t len)
 			}
 			strlwr(fnt->entry[i].std.name);
 			flen = flength(fnt->entry[i].std.name);
+			if (flen < 0) {
+				printf("TODO: Unable to read font %s size\n", fnt->entry[i].std.name);
+				free(fnt);
+				break;
+			}
 			font = fopen(fnt->entry[i].std.name, "rb");
 			if (font == NULL) {
 				printf("TODO: Unable to open font %s\n", fnt->entry[i].std.name);
@@ -11105,6 +11123,7 @@ do_skypix(char *buf, size_t len)
 			free(fnt);
 			amiga_font = malloc(flen);
 			if (amiga_font == NULL) {
+				fclose(font);
 				break;
 			}
 			fread(amiga_font, 1, flen, font);
@@ -11489,10 +11508,10 @@ parse_rip(BYTE *origbuf, unsigned blen, unsigned maxlen)
 						if (buf[pos] == '\b') {
 							if (rip.lchars > 0)
 								rip.lchars--;
-								if (rip.lchars == 0) {
-									rip.state = RIP_STATE_BOL;
-									break;
-								}
+							if (rip.lchars == 0) {
+								rip.state = RIP_STATE_BOL;
+								break;
+							}
 						}
 						else if (buf[pos] < 32)
 							rip.lchars = -1;