diff --git a/lua/def.c b/lua/def.c index 1f9ee1217b..194800ec9a 100644 --- a/lua/def.c +++ b/lua/def.c @@ -597,7 +597,7 @@ const upb_FileDef* lupb_FileDef_check(lua_State* L, int narg) { static int lupb_FileDef_Dependency(lua_State* L) { const upb_FileDef* f = lupb_FileDef_check(L, 1); - int index = luaL_checkint(L, 2); + int index = lupb_checkint32(L, 2); const upb_FileDef* dep = upb_FileDef_Dependency(f, index); lupb_wrapper_pushwrapper(L, 1, dep, LUPB_FILEDEF); return 1; @@ -611,7 +611,7 @@ static int lupb_FileDef_DependencyCount(lua_State* L) { static int lupb_FileDef_enum(lua_State* L) { const upb_FileDef* f = lupb_FileDef_check(L, 1); - int index = luaL_checkint(L, 2); + int index = lupb_checkint32(L, 2); const upb_EnumDef* e = upb_FileDef_TopLevelEnum(f, index); lupb_wrapper_pushwrapper(L, 1, e, LUPB_ENUMDEF); return 1; @@ -625,7 +625,7 @@ static int lupb_FileDef_enumcount(lua_State* L) { static int lupb_FileDef_msg(lua_State* L) { const upb_FileDef* f = lupb_FileDef_check(L, 1); - int index = luaL_checkint(L, 2); + int index = lupb_checkint32(L, 2); const upb_MessageDef* m = upb_FileDef_TopLevelMessage(f, index); lupb_wrapper_pushwrapper(L, 1, m, LUPB_MSGDEF); return 1; diff --git a/lua/upb.c b/lua/upb.c index e1e40613d4..6a0eec45df 100644 --- a/lua/upb.c +++ b/lua/upb.c @@ -41,11 +41,13 @@ /* Lua compatibility code *****************************************************/ /* Shims for upcoming Lua 5.3 functionality. */ +#if LUA_VERSION_NUM < 503 static bool lua_isinteger(lua_State* L, int argn) { LUPB_UNUSED(L); LUPB_UNUSED(argn); return false; } +#endif /* Utility functions **********************************************************/ diff --git a/lua/upbc.cc b/lua/upbc.cc index bce4b7d284..e9dff10e3f 100644 --- a/lua/upbc.cc +++ b/lua/upbc.cc @@ -5,13 +5,13 @@ // license that can be found in the LICENSE file or at // https://developers.google.com/open-source/licenses/bsd -#include "google/protobuf/descriptor.pb.h" #include "absl/strings/str_replace.h" #include "absl/strings/string_view.h" #include "absl/strings/substitute.h" #include "google/protobuf/compiler/code_generator.h" #include "google/protobuf/compiler/plugin.h" #include "google/protobuf/descriptor.h" +#include "google/protobuf/descriptor.pb.h" #include "google/protobuf/io/printer.h" namespace protoc = ::google::protobuf::compiler; @@ -50,6 +50,11 @@ static void PrintHexDigit(char digit, protobuf::io::Printer* printer) { printer->WriteRaw(&text, 1); } +static bool IsPrint(int ch) { + // isprint(ch) with negative values is UB. + return ch < 0 ? false : isprint(ch); +} + static void PrintString(int max_cols, absl::string_view* str, protobuf::io::Printer* printer) { printer->Print("\'"); @@ -61,7 +66,7 @@ static void PrintString(int max_cols, absl::string_view* str, } else if (ch == '\'') { printer->PrintRaw("\\'"); max_cols--; - } else if (isprint(ch)) { + } else if (IsPrint(ch)) { printer->WriteRaw(&ch, 1); max_cols--; } else {