Fix gjs_context_eval() for non-zero-terminated strings
Calling gjs_context_eval()
with a non-zero-terminated string has apparently been broken for quite a long time. I guess nobody ever does that.
This is a surprisingly complicated fix for a simple-sounding problem. The complication is due to the passed-in strlen being ignored in more than one place: both in gjs_strip_unix_shebang()
and in the code that converts UTF-8 to UTF-16.
In addition, gjs_strip_unix_shebang()
would access invalid memory if given a 1-length string or a non-zero-terminated string.
We fix the UTF-16 conversion code, and replace gjs_strip_unix_shebang()
with a safer version using C++ strings (which we have anyway after converting to UTF-16.) This new function, gjs_unix_shebang_len()
, returns the offset that must be added to the string's starting position, in order to skip the shebang line.
It would be better in the future to return a std::u16string_view
from gjs_unix_shebang_len()
, but that is not yet available in C++14.
This bug was found by compiling with -Wunused-parameter!