diff --git a/src/sbbs3/sftp.cpp b/src/sbbs3/sftp.cpp
index f11a59f266a99343e428af9578861f8cfcd55628..d61afc4294be63332a8921efb4eeb6a84ab8534d 100644
--- a/src/sbbs3/sftp.cpp
+++ b/src/sbbs3/sftp.cpp
@@ -737,8 +737,10 @@ find_lib(sbbs_t *sbbs, const char *path)
 		if (!can_user_access_lib(&sbbs->cfg, l, &sbbs->useron, &sbbs->client))
 			continue;
 		exp = expand_slash(sbbs->cfg.lib[l]->lname);
-		if (exp == nullptr)
+		if (exp == nullptr) {
+			free(p);
 			return -1;
+		}
 		if (strcmp(p, exp)) {
 			free(exp);
 			continue;
@@ -875,6 +877,12 @@ get_attrs(sbbs_t *sbbs, const char *path, char **link)
 	return ret;
 }
 
+static sftp_file_attr_t
+get_attrs(sbbs_t *sbbs, const char *path)
+{
+	return get_attrs(sbbs, path, nullptr);
+}
+
 static void
 copy_path(char *p, const char *fp)
 {
@@ -929,7 +937,9 @@ generic_dot_entry(sbbs_t *sbbs, char *fname, const char *path, int32_t *idx)
 {
 	char *link;
 	sftp_file_attr_t attr = get_attrs(sbbs, path, &link);
-	return generic_dot_attr_entry(sbbs, fname, attr, &link, idx);
+	bool ret = generic_dot_attr_entry(sbbs, fname, attr, &link, idx);
+	free(link);
+	return ret;
 }
 
 static bool
@@ -1421,9 +1431,12 @@ sftp_readdir(sftp_dirhandle_t handle, void *cb_data)
 			sprintf(tmppath, static_files[dd->info.rootdir.idx].sftp_patt, sbbs->useron.alias);
 			remove_trailing_slash(tmppath);
 			attr = get_attrs(sbbs, tmppath, &link);
-			if (attr == nullptr)
+			if (attr == nullptr) {
+				free(link);
 				return sftps_send_error(sbbs->sftp_state, SSH_FX_FAILURE, "Attributes allocation failure");
+			}
 			lname = get_longname(sbbs, tmppath, link, attr);
+			free(link);
 			if (lname == nullptr) {
 				sftp_fattr_free(attr);
 				return sftps_send_error(sbbs->sftp_state, SSH_FX_FAILURE, "Longname allocation failure");
@@ -1514,8 +1527,10 @@ sftp_readdir(sftp_dirhandle_t handle, void *cb_data)
 				if (attr == nullptr)
 					return sftps_send_error(sbbs->sftp_state, SSH_FX_FAILURE, "Attributes allocation failure");
 				ename = expand_slash(sbbs->cfg.dir[dd->info.filebase.idx]->lname);
-				if (ename == nullptr)
+				if (ename == nullptr) {
+					sftp_fattr_free(attr);
 					return sftps_send_error(sbbs->sftp_state, SSH_FX_FAILURE, "EName allocation failure");
+				}
 				lname = get_longname(sbbs, ename, nullptr, attr);
 				if (lname == nullptr) {
 					free(ename);
@@ -1648,7 +1663,7 @@ sftp_stat(sftp_str_t path, void *cb_data)
 			return newpmap->cleanup();
 		cpmap = std::move(newpmap);
 	}
-	sftp_file_attr_t attr = get_attrs(sbbs, cpmap->sftp_path, nullptr);
+	sftp_file_attr_t attr = get_attrs(sbbs, cpmap->sftp_path);
 	if (attr == nullptr)
 		return sftps_send_error(sbbs->sftp_state, SSH_FX_FAILURE, "Unable to allocate attribute");
 	bool ret = sftps_send_attrs(sbbs->sftp_state, attr);
@@ -1665,7 +1680,7 @@ sftp_lstat(sftp_str_t path, void *cb_data)
 	path_map pmap(sbbs, path->c_str, MAP_STAT);
 	if (!pmap.success())
 		return pmap.cleanup();
-	sftp_file_attr_t attr = get_attrs(sbbs, pmap.sftp_path, nullptr);
+	sftp_file_attr_t attr = get_attrs(sbbs, pmap.sftp_path);
 	if (attr == nullptr)
 		return sftps_send_error(sbbs->sftp_state, SSH_FX_FAILURE, "Unable to allocate attribute");
 	bool ret = sftps_send_attrs(sbbs->sftp_state, attr);
diff --git a/src/sftp/sftp_server.c b/src/sftp/sftp_server.c
index 7117fa2a8b990913befcd62f5c9697684090d6da..87bc9fa097c88ba67c7b74d17c41c88995ee1295 100644
--- a/src/sftp/sftp_server.c
+++ b/src/sftp/sftp_server.c
@@ -65,20 +65,24 @@ s_open(sftps_state_t state)
 	if (!(flags & SSH_FXF_WRITE)) {
 		if (flags & SSH_FXF_CREAT) {
 			sftps_send_error(state, SSH_FX_OP_UNSUPPORTED, "Can't create unless writing");
+			free_sftp_str(fname);
 			return true;
 		}
 		if (flags & SSH_FXF_APPEND) {
 			sftps_send_error(state, SSH_FX_OP_UNSUPPORTED, "Can't append unless writing");
+			free_sftp_str(fname);
 			return true;
 		}
 	}
 	if (!(flags & SSH_FXF_CREAT)) {
 		if (flags & SSH_FXF_TRUNC) {
 			sftps_send_error(state, SSH_FX_OP_UNSUPPORTED, "Can't truncate unless creating");
+			free_sftp_str(fname);
 			return true;
 		}
 		if (flags & SSH_FXF_EXCL) {
 			sftps_send_error(state, SSH_FX_OP_UNSUPPORTED, "Can't open exclisive unless creating");
+			free_sftp_str(fname);
 			return true;
 		}
 	}