diff --git a/init/devices.c b/init/devices.c
index 69f5fc8ab86a7788b866a57a0e7a0b1a1761f293..41ab85ea7346faed9c210022164b4d416a559836 100644
--- a/init/devices.c
+++ b/init/devices.c
@@ -451,6 +451,8 @@ static char **parse_platform_block_device(struct uevent *uevent)
     if (uevent->partition_name) {
         p = strdup(uevent->partition_name);
         sanitize(p);
+        if (strcmp(uevent->partition_name, p))
+            NOTICE("Linking partition '%s' as '%s'\n", uevent->partition_name, p);
         if (asprintf(&links[link_num], "%s/by-name/%s", link_path, p) > 0)
             link_num++;
         else
diff --git a/init/util.c b/init/util.c
index 918bc057ed27eb3a168a30482a171fcb7beb8688..76af9e5759fc038f245ad0e67c96f43d46e2eee8 100755
--- a/init/util.c
+++ b/init/util.c
@@ -305,14 +305,27 @@ int mkdir_recursive(const char *pathname, mode_t mode)
     return 0;
 }
 
+/*
+ * replaces any unacceptable characters with '_', the
+ * length of the resulting string is equal to the input string
+ */
 void sanitize(char *s)
 {
+    const char* accept =
+            "abcdefghijklmnopqrstuvwxyz"
+            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+            "0123456789"
+            "_-.";
+
     if (!s)
         return;
-    while (isalnum(*s))
-        s++;
-    *s = 0;
+
+    for (; *s; s++) {
+        s += strspn(s, accept);
+        if (*s) *s = '_';
+    }
 }
+
 void make_link(const char *oldpath, const char *newpath)
 {
     int ret;