diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/dir.c b/c/meterpreter/source/extensions/stdapi/server/fs/dir.c
index c671d289..e2718fc9 100644
--- a/c/meterpreter/source/extensions/stdapi/server/fs/dir.c
+++ b/c/meterpreter/source/extensions/stdapi/server/fs/dir.c
@@ -2,21 +2,11 @@
 
 #include "fs_local.h"
 
-void request_fs_ls_cb(void *arg, char *name, const char *dir)
+void request_fs_ls_cb(void *arg, char *name, char *path)
 {
 	Packet *response = arg;
-	char path[FS_MAX_PATH];
 	struct meterp_stat s;
 
-	/*
-	 * Build the full path if we have a base directory
-	 */
-	if (dir) {
-		_snprintf(path, sizeof(path), "%s%c%s", dir, FS_SEPARATOR, name);
-	} else {
-		_snprintf(path, sizeof(path), "%s", name);
-	}
-
 	/*
 	 * Add the file name, full path and stat information
 	 */
diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/file.c b/c/meterpreter/source/extensions/stdapi/server/fs/file.c
index 026c3be1..a3b7e256 100644
--- a/c/meterpreter/source/extensions/stdapi/server/fs/file.c
+++ b/c/meterpreter/source/extensions/stdapi/server/fs/file.c
@@ -207,7 +207,7 @@ DWORD request_fs_separator(Remote *remote, Packet *packet)
 {
 	Packet *response = packet_create_response(packet);
 
-	packet_add_tlv_string(response, TLV_TYPE_STRING, FS_SEPARATOR_S);
+	packet_add_tlv_string(response, TLV_TYPE_STRING, FS_SEPARATOR);
 
 	packet_add_tlv_uint(response, TLV_TYPE_RESULT, ERROR_SUCCESS);
 
diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/fs_local.h b/c/meterpreter/source/extensions/stdapi/server/fs/fs_local.h
index 6e3369eb..e66a7876 100644
--- a/c/meterpreter/source/extensions/stdapi/server/fs/fs_local.h
+++ b/c/meterpreter/source/extensions/stdapi/server/fs/fs_local.h
@@ -5,13 +5,11 @@
 #include <stdio.h>
 
 #ifdef _WIN32
-#define FS_SEPARATOR   '\\'
-#define FS_SEPARATOR_S "\\"
-#define FS_MAX_PATH    32768
+#define FS_SEPARATOR "\\"
+#define FS_MAX_PATH  32768
 #else
-#define FS_SEPARATOR   '/'
-#define FS_SEPARATOR_S "/"
-#define FS_MAX_PATH    PATH_MAX
+#define FS_SEPARATOR "/"
+#define FS_MAX_PATH  PATH_MAX
 #endif
 
 /*
@@ -38,7 +36,7 @@ struct meterp_stat {
     uint64_t st_ctime;
 };
 
-typedef void (* fs_ls_cb_t)(void *arg, char *name, const char *path);
+typedef void (*fs_ls_cb_t)(void *arg, char *name, char *path);
 
 int fs_chdir(const char *directory);
 
diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/fs_posix.c b/c/meterpreter/source/extensions/stdapi/server/fs/fs_posix.c
index ccf3e3e1..c6064677 100644
--- a/c/meterpreter/source/extensions/stdapi/server/fs/fs_posix.c
+++ b/c/meterpreter/source/extensions/stdapi/server/fs/fs_posix.c
@@ -13,6 +13,7 @@ int fs_ls(const char *directory, fs_ls_cb_t cb, void *arg)
 {
 	struct meterp_stat s;
 	struct dirent *data;
+	char path[FS_MAX_PATH];
 
 	DIR *ctx = opendir(directory);
 	if (ctx == NULL) {
@@ -20,7 +21,10 @@ int fs_ls(const char *directory, fs_ls_cb_t cb, void *arg)
 	}
 
 	while ((data = readdir(ctx))) {
-		cb(arg, data->d_name, directory);
+
+		snprintf(path, sizeof(path), "%s/%s", directory, data->d_name);
+
+		cb(arg, data->d_name, path);
 	}
 
 	closedir(ctx);
diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/fs_win.c b/c/meterpreter/source/extensions/stdapi/server/fs/fs_win.c
index 18a8ba75..10fe1733 100644
--- a/c/meterpreter/source/extensions/stdapi/server/fs/fs_win.c
+++ b/c/meterpreter/source/extensions/stdapi/server/fs/fs_win.c
@@ -115,19 +115,35 @@ int fs_ls(const char *directory, fs_ls_cb_t cb, void *arg)
 	WIN32_FIND_DATAW data;
 	wchar_t *path_w = utf8_to_wchar(expanded);
 	if (path_w == NULL) {
-		result = ERROR_NOT_ENOUGH_MEMORY;
+		result = GetLastError();
 		goto out;
 	}
 
 	HANDLE ctx = FindFirstFileW(path_w, &data);
+	if (ctx == NULL) {
+		result = GetLastError();
+		goto out;
+	}
+
 	do {
 		if (ctx == INVALID_HANDLE_VALUE) {
 			result = GetLastError();
 			break;
 		}
 
+		/*
+		 * Build the full path if we have a base directory
+		 */
 		char *filename = wchar_to_utf8(data.cFileName);
-		cb(arg, filename, baseDirectory);
+		char path[FS_MAX_PATH];
+
+		if (baseDirectory) {
+			_snprintf(path, sizeof(path), "%s\\%s", filename, baseDirectory);
+		} else {
+			_snprintf(path, sizeof(path), "%s", data.cFileName);
+		}
+
+		cb(arg, filename, path);
 		free(filename);
 
 	} while (FindNextFileW(ctx, &data));
@@ -138,7 +154,6 @@ int fs_ls(const char *directory, fs_ls_cb_t cb, void *arg)
 	FindClose(ctx);
 	free(expanded);
 out:
-	free(tempDirectory);
 	free(baseDirectory);
 	free(path_w);
 	return result;