Browse Source

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

Bart van Strien 14 years ago
parent
commit
11ab5600d3

+ 16 - 11
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()

+ 8 - 4
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<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
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))
 		{