From: Francis Dupont Date: Thu, 23 Jun 2016 17:48:34 +0000 (+0200) Subject: [fdxhook] Fixed some empty vector dereferences X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=771ad5cb033f217408767be398f43ea18ebf5188;p=thirdparty%2Fkea.git [fdxhook] Fixed some empty vector dereferences --- diff --git a/src/hooks/external/lua/loption.cc b/src/hooks/external/lua/loption.cc index d36222c001..e4923c6c3e 100644 --- a/src/hooks/external/lua/loption.cc +++ b/src/hooks/external/lua/loption.cc @@ -115,7 +115,11 @@ int toBinary(lua_State* L) { l_option* const self = static_cast(luaL_checkudata(L, 1, LUA_KEAOPTION)); vector bin = self->object->toBinary(true); - lua_pushlstring(L, reinterpret_cast(&bin[0]), bin.size()); + char* ptr = NULL; + if (!bin.empty()) { + ptr = reinterpret_cast(&bin[0]); + } + lua_pushlstring(L, ptr, bin.size()); return (1); } @@ -148,7 +152,11 @@ int getData(lua_State* L) { l_option* const self = static_cast(luaL_checkudata(L, 1, LUA_KEAOPTION)); const OptionBuffer& data = self->object->getData(); - lua_pushlstring(L, reinterpret_cast(&data[0]), data.size()); + const char* ptr = NULL; + if (!data.empty()) { + ptr = reinterpret_cast(&data[0]); + } + lua_pushlstring(L, ptr, data.size()); return (1); } diff --git a/src/hooks/external/lua/lpkt4.cc b/src/hooks/external/lua/lpkt4.cc index 448a6c467d..18c3515517 100644 --- a/src/hooks/external/lua/lpkt4.cc +++ b/src/hooks/external/lua/lpkt4.cc @@ -250,7 +250,11 @@ int getHWAddr(lua_State* L) { if (hwaddr) { bin = hwaddr->hwaddr_; } - lua_pushlstring(L, reinterpret_cast(&bin[0]), bin.size()); + char* ptr = NULL; + if (!bin.empty()) { + ptr = reinterpret_cast(&bin[0]); + } + lua_pushlstring(L, ptr, bin.size()); return (1); } diff --git a/src/hooks/external/ocaml/dso.c b/src/hooks/external/ocaml/dso.c index 7fe21eace8..b42ad1a94b 100644 --- a/src/hooks/external/ocaml/dso.c +++ b/src/hooks/external/ocaml/dso.c @@ -51,7 +51,11 @@ int load(LibraryHandle& handle) { } // Start ocaml char* argv[2]; - argv[0] = &progname[0]; + if (!progname.empty()) { + argv[0] = &progname[0]; + } else { + argv[0] = NULL; + } argv[1] = NULL; caml_startup(argv); diff --git a/src/hooks/external/ocaml/opt.c b/src/hooks/external/ocaml/opt.c index 01040c2263..2776e28ece 100644 --- a/src/hooks/external/ocaml/opt.c +++ b/src/hooks/external/ocaml/opt.c @@ -83,7 +83,9 @@ extern "C" CAMLprim value opt_factory(value u, value typ, value bytes) { uint16_t type = static_cast(Int_val(typ)); OptionBuffer data; data.resize(static_cast(caml_string_length(bytes))); - memmove(&data[0], String_val(bytes), data.size()); + if (!data.empty()) { + memmove(&data[0], String_val(bytes), data.size()); + } result = caml_alloc_custom(opt_ops, sizeof(oc_opt), 0, 1); oc_opt* const self = static_cast(Data_custom_val(result)); self->object.reset(new Option(universe, type, data)); @@ -123,7 +125,9 @@ extern "C" CAMLprim value opt_toBinary(value opt) { oc_opt* const self = static_cast(Data_custom_val(opt)); vector bin = self->object->toBinary(true); result = caml_alloc_string(static_cast(bin.size())); - memmove(String_val(result), &bin[0], bin.size()); + if (!bin.empty()) { + memmove(String_val(result), &bin[0], bin.size()); + } CAMLreturn (result); } @@ -151,7 +155,9 @@ extern "C" CAMLprim value opt_getData(value opt) { oc_opt* const self = static_cast(Data_custom_val(opt)); vector data = self->object->getData(); result = caml_alloc_string(static_cast(data.size())); - memmove(String_val(result), &data[0], data.size()); + if (!data.empty()) { + memmove(String_val(result), &data[0], data.size()); + } CAMLreturn (result); } @@ -195,7 +201,9 @@ extern "C" CAMLprim value opt_setData(value opt, value bytes) { oc_opt* const self = static_cast(Data_custom_val(opt)); vector data; data.resize(static_cast(caml_string_length(bytes))); - memmove(&data[0], String_val(bytes), data.size()); + if (!data.empty()) { + memmove(&data[0], String_val(bytes), data.size()); + } self->object->setData(data.begin(), data.end()); CAMLreturn (Val_unit); } diff --git a/src/hooks/external/python/poption.cc b/src/hooks/external/python/poption.cc index 5dc456c39f..fbc7bd48e2 100644 --- a/src/hooks/external/python/poption.cc +++ b/src/hooks/external/python/poption.cc @@ -106,8 +106,12 @@ toBinary(PyObject* obj, PyObject* args) { py_option* const self = static_cast(obj); vector bin = self->object->toBinary(ih != 0); - return (PyBytes_FromStringAndSize(reinterpret_cast(&bin[0]), - static_cast(bin.size()))); + char* ptr = NULL; + if (!bin.empty()) { + ptr = reinterpret_cast(&bin[0]); + } + Py_ssize_t sz = static_cast(bin.size()); + return (PyBytes_FromStringAndSize(ptr, sz)); } // getType() method @@ -136,8 +140,12 @@ PyObject* getData(PyObject* obj) { py_option* const self = static_cast(obj); const OptionBuffer& data = self->object->getData(); - return (PyBytes_FromStringAndSize(reinterpret_cast(&data[0]), - static_cast(data.size()))); + const char* ptr = NULL; + if (!data.empty()) { + ptr = reinterpret_cast(&data[0]); + } + Py_ssize_t sz = static_cast(data.size()); + return (PyBytes_FromStringAndSize(ptr, sz)); } // addOption(OptionPtr opt) method diff --git a/src/hooks/external/python/ppkt4.cc b/src/hooks/external/python/ppkt4.cc index 90b90a1f12..5ff290ac86 100644 --- a/src/hooks/external/python/ppkt4.cc +++ b/src/hooks/external/python/ppkt4.cc @@ -231,8 +231,12 @@ getHWAddr(PyObject* obj) { if (hwaddr) { bin = hwaddr->hwaddr_; } - return (PyBytes_FromStringAndSize(reinterpret_cast(&bin[0]), - static_cast(bin.size()))); + char* ptr = NULL; + if (!bin.empty()) { + ptr = reinterpret_cast(&bin[0]); + } + Py_ssize_t sz = static_cast(bin.size()); + return (PyBytes_FromStringAndSize(ptr, sz)); } // Method table