From 11ab5600d352e86e97c531c93ff03074191e419d Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Tue, 7 Dec 2010 19:37:59 +0100 Subject: [PATCH] Correctly handle embedded zeros in thread names and ThreadVariants (bug #128) --- src/modules/thread/sdl/Thread.cpp | 27 +++++++++++++++----------- src/modules/thread/sdl/Thread.h | 12 ++++++++---- src/modules/thread/sdl/wrap_Thread.cpp | 10 ++++++---- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp index 2ff9de136..2c2143da6 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/sdl/Thread.cpp @@ -42,7 +42,11 @@ namespace sdl luaopen_love(L); #endif // LOVE_BUILD_STANDALONE luaopen_love_thread(L); - lua_pushstring(L, comm->getName()); + { + size_t len; + const char *name = comm->getName(&len); + lua_pushlstring(L, name, len); + } luax_convobj(L, lua_gettop(L), "thread", "getThread"); lua_getglobal(L, "love"); lua_pushvalue(L, -2); @@ -72,14 +76,14 @@ namespace sdl data.number = number; } - ThreadVariant::ThreadVariant(const char *string) + ThreadVariant::ThreadVariant(const char *string, size_t len) { type = STRING; - size_t len = strlen(string); char *buf = new char[len+1]; memset(buf, 0, len+1); memcpy(buf, string, len); - data.string = buf; + data.string.str = buf; + data.string.len = len; } ThreadVariant::ThreadVariant(void *userdata) @@ -103,7 +107,7 @@ namespace sdl switch(type) { case STRING: - delete[] data.string; + delete[] data.string.str; break; case FUSERDATA: ((love::Object *) data.userdata)->release(); @@ -113,10 +117,9 @@ namespace sdl } } - ThreadData::ThreadData(const char *name, const char *code, void *mutex, void *cond) - : mutex(mutex), cond(cond) + ThreadData::ThreadData(const char *name, size_t len, const char *code, void *mutex, void *cond) + : mutex(mutex), cond(cond), len(len) { - size_t len = strlen(name); this->name = new char[len+1]; memset(this->name, 0, len+1); memcpy(this->name, name, len); @@ -142,8 +145,10 @@ namespace sdl return code; } - const char *ThreadData::getName() + const char *ThreadData::getName(size_t *len) { + if (len) + *len = this->len; return name; } @@ -180,7 +185,7 @@ namespace sdl memcpy(this->data, data->getData(), len); mutex = SDL_CreateMutex(); cond = SDL_CreateCond(); - comm = new ThreadData(name.c_str(), this->data, mutex, cond); + comm = new ThreadData(name.c_str(), name.length(), this->data, mutex, cond); } Thread::Thread(love::thread::ThreadModule *module, const std::string & name) @@ -189,7 +194,7 @@ namespace sdl module->retain(); mutex = SDL_CreateMutex(); cond = SDL_CreateCond(); - comm = new ThreadData(name.c_str(), NULL, mutex, cond); + comm = new ThreadData(name.c_str(), name.length(), NULL, mutex, cond); } Thread::~Thread() diff --git a/src/modules/thread/sdl/Thread.h b/src/modules/thread/sdl/Thread.h index 165b744d3..b7240b103 100644 --- a/src/modules/thread/sdl/Thread.h +++ b/src/modules/thread/sdl/Thread.h @@ -55,7 +55,7 @@ namespace sdl public: ThreadVariant(bool boolean); ThreadVariant(double number); - ThreadVariant(const char *string); + ThreadVariant(const char *string, size_t len); ThreadVariant(void *userdata); ThreadVariant(Type udatatype, void *userdata); virtual ~ThreadVariant(); @@ -64,7 +64,10 @@ namespace sdl { bool boolean; double number; - const char *string; + struct { + const char *str; + size_t len; + } string; void *userdata; } data; Type udatatype; @@ -77,12 +80,13 @@ namespace sdl char *code; char *name; std::map shared; + size_t len; public: - ThreadData(const char *name, const char *code, void *mutex, void *cond); + ThreadData(const char *name, size_t len, const char *code, void *mutex, void *cond); ~ThreadData(); const char *getCode(); - const char *getName(); + const char *getName(size_t *len = 0); ThreadVariant* getValue(const std::string & name); void clearValue(const std::string & name); void setValue(const std::string & name, ThreadVariant *v); diff --git a/src/modules/thread/sdl/wrap_Thread.cpp b/src/modules/thread/sdl/wrap_Thread.cpp index b588d8a65..2553907c0 100644 --- a/src/modules/thread/sdl/wrap_Thread.cpp +++ b/src/modules/thread/sdl/wrap_Thread.cpp @@ -80,7 +80,7 @@ namespace sdl lua_pushnumber(L, v->data.number); break; case STRING: - lua_pushstring(L, v->data.string); + lua_pushlstring(L, v->data.string.str, v->data.string.len); break; case LUSERDATA: lua_pushlightuserdata(L, v->data.userdata); @@ -122,7 +122,7 @@ namespace sdl lua_pushnumber(L, v->data.number); break; case STRING: - lua_pushstring(L, v->data.string); + lua_pushlstring(L, v->data.string.str, v->data.string.len); break; case LUSERDATA: lua_pushlightuserdata(L, v->data.userdata); @@ -163,7 +163,7 @@ namespace sdl lua_pushnumber(L, v->data.number); break; case STRING: - lua_pushstring(L, v->data.string); + lua_pushlstring(L, v->data.string.str, v->data.string.len); break; case LUSERDATA: lua_pushlightuserdata(L, v->data.userdata); @@ -215,7 +215,9 @@ namespace sdl } else if (lua_isstring(L, 3)) { - v = new ThreadVariant(lua_tostring(L, 3)); + size_t len; + const char *str = lua_tolstring(L, 3, &len); + v = new ThreadVariant(str, len); } else if (lua_islightuserdata(L, 3)) {