mirror of
https://github.com/moparisthebest/minetest
synced 2024-12-23 16:08:51 -05:00
Add missing checks to texture caching
This commit is contained in:
parent
f9d7e399b2
commit
bc743ca7ce
@ -1277,6 +1277,13 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
|||||||
std::string name = deSerializeString(is);
|
std::string name = deSerializeString(is);
|
||||||
std::string sha1_texture = deSerializeString(is);
|
std::string sha1_texture = deSerializeString(is);
|
||||||
|
|
||||||
|
// if name contains illegal characters, ignore the texture
|
||||||
|
if(!string_allowed(name, TEXTURENAME_ALLOWED_CHARS)){
|
||||||
|
errorstream<<"Client: ignoring illegal texture name "
|
||||||
|
<<"sent by server: \""<<name<<"\""<<std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
std::string tpath = getTextureCacheDir() + DIR_DELIM + name;
|
std::string tpath = getTextureCacheDir() + DIR_DELIM + name;
|
||||||
// Read data
|
// Read data
|
||||||
std::ifstream fis(tpath.c_str(), std::ios_base::binary);
|
std::ifstream fis(tpath.c_str(), std::ios_base::binary);
|
||||||
@ -1371,8 +1378,6 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
|||||||
for each texture {
|
for each texture {
|
||||||
u16 length of name
|
u16 length of name
|
||||||
string name
|
string name
|
||||||
u16 length of path
|
|
||||||
string path
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
std::ostringstream os(std::ios_base::binary);
|
std::ostringstream os(std::ios_base::binary);
|
||||||
@ -1439,6 +1444,14 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
|||||||
for(int i=0; i<num_textures; i++){
|
for(int i=0; i<num_textures; i++){
|
||||||
std::string name = deSerializeString(is);
|
std::string name = deSerializeString(is);
|
||||||
std::string data = deSerializeLongString(is);
|
std::string data = deSerializeLongString(is);
|
||||||
|
|
||||||
|
// if name contains illegal characters, ignore the texture
|
||||||
|
if(!string_allowed(name, TEXTURENAME_ALLOWED_CHARS)){
|
||||||
|
errorstream<<"Client: ignoring illegal texture name "
|
||||||
|
<<"sent by server: \""<<name<<"\""<<std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Silly irrlicht's const-incorrectness
|
// Silly irrlicht's const-incorrectness
|
||||||
Buffer<char> data_rw(data.c_str(), data.size());
|
Buffer<char> data_rw(data.c_str(), data.size());
|
||||||
// Create an irrlicht memory file
|
// Create an irrlicht memory file
|
||||||
|
@ -48,6 +48,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#define PASSWORD_SIZE 28 // Maximum password length. Allows for
|
#define PASSWORD_SIZE 28 // Maximum password length. Allows for
|
||||||
// base64-encoded SHA-1 (27+\0).
|
// base64-encoded SHA-1 (27+\0).
|
||||||
|
|
||||||
|
#define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_."
|
||||||
|
|
||||||
enum ToClientCommand
|
enum ToClientCommand
|
||||||
{
|
{
|
||||||
TOCLIENT_INIT = 0x10,
|
TOCLIENT_INIT = 0x10,
|
||||||
|
@ -4273,6 +4273,12 @@ void Server::PrepareTextures() {
|
|||||||
if(dirlist[j].dir) // Ignode dirs
|
if(dirlist[j].dir) // Ignode dirs
|
||||||
continue;
|
continue;
|
||||||
std::string tname = dirlist[j].name;
|
std::string tname = dirlist[j].name;
|
||||||
|
// if name contains illegal characters, ignore the texture
|
||||||
|
if(!string_allowed(tname, TEXTURENAME_ALLOWED_CHARS)){
|
||||||
|
errorstream<<"Server: ignoring illegal texture name: \""
|
||||||
|
<<tname<<"\""<<std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
std::string tpath = texturepath + DIR_DELIM + tname;
|
std::string tpath = texturepath + DIR_DELIM + tname;
|
||||||
// Read data
|
// Read data
|
||||||
std::ifstream fis(tpath.c_str(), std::ios_base::binary);
|
std::ifstream fis(tpath.c_str(), std::ios_base::binary);
|
||||||
@ -4300,6 +4306,11 @@ void Server::PrepareTextures() {
|
|||||||
<<tname<<"\""<<std::endl;
|
<<tname<<"\""<<std::endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if(tmp_os.str().length() == 0){
|
||||||
|
errorstream<<"Server::PrepareTextures(): Empty file \""
|
||||||
|
<<tpath<<"\""<<std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
SHA1 sha1;
|
SHA1 sha1;
|
||||||
sha1.addBytes(tmp_os.str().c_str(), tmp_os.str().length());
|
sha1.addBytes(tmp_os.str().c_str(), tmp_os.str().length());
|
||||||
@ -4332,7 +4343,7 @@ struct SendableTextureAnnouncement
|
|||||||
void Server::SendTextureAnnouncement(u16 peer_id){
|
void Server::SendTextureAnnouncement(u16 peer_id){
|
||||||
DSTACK(__FUNCTION_NAME);
|
DSTACK(__FUNCTION_NAME);
|
||||||
|
|
||||||
infostream<<"Server::SendTextureAnnouncement(): Calculate sha1 sums of textures and send to client"<<std::endl;
|
infostream<<"Server::SendTextureAnnouncement()"<<std::endl;
|
||||||
|
|
||||||
core::list<SendableTextureAnnouncement> texture_announcements;
|
core::list<SendableTextureAnnouncement> texture_announcements;
|
||||||
|
|
||||||
@ -4407,6 +4418,11 @@ void Server::SendTexturesRequested(u16 peer_id,core::list<TextureRequest> tosend
|
|||||||
u32 texture_size_bunch_total = 0;
|
u32 texture_size_bunch_total = 0;
|
||||||
|
|
||||||
for(core::list<TextureRequest>::Iterator i = tosend.begin(); i != tosend.end(); i++) {
|
for(core::list<TextureRequest>::Iterator i = tosend.begin(); i != tosend.end(); i++) {
|
||||||
|
if(m_Textures.find(i->name) == m_Textures.end()){
|
||||||
|
errorstream<<"Server::SendTexturesRequested(): Client asked for "
|
||||||
|
<<"unknown texture \""<<(i->name)<<"\""<<std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
//TODO get path + name
|
//TODO get path + name
|
||||||
std::string tpath = m_Textures[(*i).name].path;
|
std::string tpath = m_Textures[(*i).name].path;
|
||||||
|
Loading…
Reference in New Issue
Block a user