diff --git a/src/fdlib.c b/src/fdlib.c
index 10c3af68caab7d9f9cc291f74a1c53a1ad2b8486..6e34aceb771462740433f6e5f886568c384ee95c 100644
--- a/src/fdlib.c
+++ b/src/fdlib.c
@@ -906,7 +906,7 @@ static int IsUncRoot(const p_wchar1 *path)
   return 0 ;
 }
 
-PMOD_EXPORT p_wchar1 *pike_dwim_utf8_to_utf16(const p_wchar0 *str)
+p_wchar1 *low_dwim_utf8_to_utf16(const p_wchar0 *str, size_t len)
 {
   /* NB: Maximum expansion factor is 2.
    *
@@ -919,7 +919,6 @@ PMOD_EXPORT p_wchar1 *pike_dwim_utf8_to_utf16(const p_wchar0 *str)
    * NB: Some extra padding at the end for NUL and adding
    *     of terminating slashes, etc.
    */
-  size_t len = strlen(str);
   p_wchar1 *res = malloc((len + 4) * sizeof(p_wchar1));
   size_t i = 0, j = 0;
 
@@ -979,6 +978,11 @@ PMOD_EXPORT p_wchar1 *pike_dwim_utf8_to_utf16(const p_wchar0 *str)
   return res;
 }
 
+PMOD_EXPORT p_wchar1 *pike_dwim_utf8_to_utf16(const p_wchar0 *str)
+{
+  return low_dwim_utf8_to_utf16(str, strlen(str));
+}
+
 PMOD_EXPORT p_wchar0 *pike_utf16_to_utf8(const p_wchar1 *str)
 {
   /* NB: Maximum expansion factor is 1.5.
diff --git a/src/fdlib.h b/src/fdlib.h
index 2d04cde6cd2e60cbbfdf98cfff9f86045e5dd888..39a1a2901706b522dc7c4d51e42fd3d6cb6d4d26 100644
--- a/src/fdlib.h
+++ b/src/fdlib.h
@@ -169,6 +169,7 @@ PMOD_EXPORT char *debug_fd_info(int fd);
 PMOD_EXPORT int debug_fd_query_properties(int fd, int guess);
 void fd_init(void);
 void fd_exit(void);
+p_wchar1 *low_dwim_utf8_to_utf16(const p_wchar0 *str, size_t len);
 PMOD_EXPORT p_wchar1 *pike_dwim_utf8_to_utf16(const p_wchar0 *str);
 PMOD_EXPORT p_wchar0 *pike_utf16_to_utf8(const p_wchar1 *str);
 PMOD_EXPORT int debug_fd_stat(const char *file, PIKE_STAT_T *buf);