Correctly handle embedded zeros in thread names and ThreadVariants (bug #128)

This commit is contained in:
Bart van Strien
2010-12-07 19:37:59 +01:00
parent acf94d0d6d
commit 11ab5600d3
3 changed files with 30 additions and 19 deletions
+16 -11
View File
@@ -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()
+8 -4
View File
@@ -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<std::string, ThreadVariant*> 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);
+6 -4
View File
@@ -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))
{