1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Fixed potential NULL pointer and leak when setting node metadata

This commit is contained in:
MetaDucky 2013-11-20 22:11:57 +01:00 committed by kwolekr
parent 747bc40840
commit 5be786c804
5 changed files with 56 additions and 19 deletions

View file

@ -42,10 +42,12 @@ NodeMetaRef* NodeMetaRef::checkobject(lua_State *L, int narg)
NodeMetadata* NodeMetaRef::getmeta(NodeMetaRef *ref, bool auto_create)
{
NodeMetadata *meta = ref->m_env->getMap().getNodeMetadata(ref->m_p);
if(meta == NULL && auto_create)
{
if(meta == NULL && auto_create) {
meta = new NodeMetadata(ref->m_env->getGameDef());
ref->m_env->getMap().setNodeMetadata(ref->m_p, meta);
if(!ref->m_env->getMap().setNodeMetadata(ref->m_p, meta)) {
delete meta;
return NULL;
}
}
return meta;
}
@ -227,17 +229,21 @@ int NodeMetaRef::l_from_table(lua_State *L)
NodeMetaRef *ref = checkobject(L, 1);
int base = 2;
// clear old metadata first
ref->m_env->getMap().removeNodeMetadata(ref->m_p);
if(lua_isnil(L, base)){
// No metadata
ref->m_env->getMap().removeNodeMetadata(ref->m_p);
lua_pushboolean(L, true);
return 1;
}
// Has metadata; clear old one first
ref->m_env->getMap().removeNodeMetadata(ref->m_p);
// Create new metadata
NodeMetadata *meta = getmeta(ref, true);
if(meta == NULL){
lua_pushboolean(L, false);
return 1;
}
// Set fields
lua_getfield(L, base, "fields");
int fieldstable = lua_gettop(L);

View file

@ -39,6 +39,19 @@ private:
static NodeMetaRef *checkobject(lua_State *L, int narg);
/**
* Retrieve metadata for a node.
* If @p auto_create is set and the specified node has no metadata information
* associated with it yet, the method attempts to attach a new metadata object
* to the node and returns a pointer to the metadata when successful.
*
* However, it is NOT guaranteed that the method will return a pointer,
* and @c NULL may be returned in case of an error regardless of @p auto_create.
*
* @param ref specifies the node for which the associated metadata is retrieved.
* @param auto_create when true, try to create metadata information for the node if it has none.
* @return pointer to a @c NodeMetadata object or @c NULL in case of error.
*/
static NodeMetadata* getmeta(NodeMetaRef *ref, bool auto_create);
static void reportMetadataChange(NodeMetaRef *ref);