Skip to content

Fix gjs_context_eval() for non-zero-terminated strings

Philip Chimento requested to merge ptomato/gjs:fix-gjs-context-eval into master

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!

Merge request reports