From 63e60314b2122f5c29a938082130e714a80a56bb Mon Sep 17 00:00:00 2001
From: swym <0xfd000000@gmail.com>
Date: Thu, 22 Aug 2019 00:06:00 +0200
Subject: [PATCH] pycardium: check file-blacklist in os.unlink and os.rename,
 too

---
 pycardium/modules/fat_file.c | 23 +++--------------------
 pycardium/modules/os.c       | 34 +++++++++++++++++++++++++++++++---
 pycardium/modules/os.h       |  6 ++++++
 3 files changed, 40 insertions(+), 23 deletions(-)
 create mode 100644 pycardium/modules/os.h

diff --git a/pycardium/modules/fat_file.c b/pycardium/modules/fat_file.c
index b030466fa..ce89e32e8 100644
--- a/pycardium/modules/fat_file.c
+++ b/pycardium/modules/fat_file.c
@@ -11,24 +11,7 @@
 #include "py/mperrno.h"
 
 #include "epicardium.h"
-
-#include <strings.h>
-
-bool filename_restricted(const char *fname)
-{
-	// files that cannot be opened in write modes
-	const char *const forbidden_files[] = {
-		"cardio.bin", "menu.py", "main.py", "cardio.cfg"
-	};
-	for (int i = 0;
-	     i < sizeof(forbidden_files) / sizeof(forbidden_files[0]);
-	     i++) {
-		if (strcasecmp(fname, forbidden_files[i]) == 0) {
-			return true;
-		}
-	}
-	return false;
-}
+#include "os.h"
 
 extern const mp_obj_type_t mp_type_textio;
 #if MICROPY_PY_IO_FILEIO
@@ -167,8 +150,8 @@ STATIC mp_obj_t file_open(const mp_obj_type_t *type, mp_arg_val_t *args)
 
 	const char *fname = mp_obj_str_get_str(args[0].u_obj);
 
-	if (potentially_critical_access && filename_restricted(fname)) {
-		mp_raise_OSError(-EPERM);
+	if (potentially_critical_access && pycrd_filename_restricted(fname)) {
+		mp_raise_OSError(-EACCES);
 	}
 
 	int res = epic_file_open(fname, modeString);
diff --git a/pycardium/modules/os.c b/pycardium/modules/os.c
index a693420b1..0bbfc05cf 100644
--- a/pycardium/modules/os.c
+++ b/pycardium/modules/os.c
@@ -4,6 +4,27 @@
 #include "py/runtime.h"
 
 #include <string.h>
+#include <strings.h>
+
+#include <stdbool.h>
+
+#include "os.h"
+
+bool pycrd_filename_restricted(const char *fname)
+{
+	// files that cannot be opened in write modes
+	const char *const forbidden_files[] = {
+		"card10.bin", "menu.py", "main.py", "card10.cfg"
+	};
+	for (int i = 0;
+	     i < sizeof(forbidden_files) / sizeof(forbidden_files[0]);
+	     i++) {
+		if (strcasecmp(fname, forbidden_files[i]) == 0) {
+			return true;
+		}
+	}
+	return false;
+}
 
 static mp_obj_t mp_os_exit(size_t n_args, const mp_obj_t *args)
 {
@@ -89,7 +110,10 @@ static MP_DEFINE_CONST_FUN_OBJ_1(listdir_obj, mp_os_listdir);
 static mp_obj_t mp_os_unlink(mp_obj_t py_path)
 {
 	const char *path = mp_obj_str_get_str(py_path);
-	int rc           = epic_file_unlink(path);
+	if (pycrd_filename_restricted(path)) {
+		mp_raise_OSError(-EACCES);
+	}
+	int rc = epic_file_unlink(path);
 
 	if (rc < 0) {
 		mp_raise_OSError(-rc);
@@ -114,7 +138,11 @@ static mp_obj_t mp_os_rename(mp_obj_t py_oldp, mp_obj_t py_newp)
 {
 	const char *oldp = mp_obj_str_get_str(py_oldp);
 	const char *newp = mp_obj_str_get_str(py_newp);
-	int rc           = epic_file_rename(oldp, newp);
+	if (pycrd_filename_restricted(oldp) ||
+	    pycrd_filename_restricted(newp)) {
+		mp_raise_OSError(-EACCES);
+	}
+	int rc = epic_file_rename(oldp, newp);
 
 	if (rc < 0) {
 		mp_raise_OSError(-rc);
@@ -141,7 +169,7 @@ static mp_obj_t mp_os_urandom(mp_obj_t size_in)
 	vstr_t vstr;
 
 	vstr_init_len(&vstr, size);
-	epic_trng_read((uint8_t*)vstr.buf, size);
+	epic_trng_read((uint8_t *)vstr.buf, size);
 
 	return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
 }
diff --git a/pycardium/modules/os.h b/pycardium/modules/os.h
new file mode 100644
index 000000000..ac9c72899
--- /dev/null
+++ b/pycardium/modules/os.h
@@ -0,0 +1,6 @@
+#ifndef PYCARDIUM_MODULES_OS_H_INCLUDED
+#define PYCARDIUM_MODULES_OS_H_INCLUDED
+
+bool pycrd_filename_restricted(const char *fname);
+
+#endif//PYCARDIUM_MODULES_OS_H_INCLUDED
-- 
GitLab