1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-16 22:50:10 +03:00

development: Check lock value, prevent memory leak on lock serialization

This commit is contained in:
Ruben S. Montero 2019-01-04 14:40:55 +01:00
parent 69db2923d9
commit 5afdaf4e74

View File

@ -593,6 +593,11 @@ bool PoolObjectSQL::name_is_valid(const string& obj_name,
int PoolObjectSQL::lock_db(const int owner, const int req_id, const int level)
{
if ( level < ST_NONE || level > ST_ADMIN )
{
return -1;
}
locked = static_cast<LockStates>(level);
lock_time = time(0);
lock_owner = owner;
@ -626,18 +631,23 @@ int PoolObjectSQL::unlock_db(const int owner, const int req_id)
string& PoolObjectSQL::lock_db_to_xml(string& xml) const
{
ostringstream oss;
if (locked != LockStates::ST_NONE)
if (locked == LockStates::ST_NONE)
{
oss << "<LOCK>"
<< "<LOCKED>" << static_cast<int>(locked) << "</LOCKED>"
<< "<OWNER>" << lock_owner << "</OWNER>"
<< "<TIME>" << lock_time << "</TIME>"
<< "<REQ_ID>" << lock_req_id << "</REQ_ID>"
<< "</LOCK>";
xml.clear();
return xml;
}
ostringstream oss;
oss << "<LOCK>"
<< "<LOCKED>" << static_cast<int>(locked) << "</LOCKED>"
<< "<OWNER>" << lock_owner << "</OWNER>"
<< "<TIME>" << lock_time << "</TIME>"
<< "<REQ_ID>" << lock_req_id << "</REQ_ID>"
<< "</LOCK>";
xml = oss.str();
return xml;
}
@ -648,17 +658,25 @@ int PoolObjectSQL::lock_db_from_xml()
{
int rc = 0;
int locked_int;
vector<xmlNodePtr> content;
if (ObjectXML::get_nodes("/*/LOCK/LOCKED", content) > 0)
{
rc += xpath(locked_int, "/*/LOCK/LOCKED", 0);
rc += xpath(lock_req_id, "/*/LOCK/REQ_ID", -1);
rc += xpath(lock_owner, "/*/LOCK/OWNER", -1);
xpath<time_t>(lock_time, "/*/LOCK/TIME", time(0));
ObjectXML::get_nodes("/*/LOCK/LOCKED", content);
locked = static_cast<LockStates>(locked_int);
if ( content.empty() )
{
return 0;
}
rc += xpath(locked_int, "/*/LOCK/LOCKED", 0);
rc += xpath(lock_req_id, "/*/LOCK/REQ_ID", -1);
rc += xpath(lock_owner, "/*/LOCK/OWNER", -1);
xpath<time_t>(lock_time, "/*/LOCK/TIME", time(0));
locked = static_cast<LockStates>(locked_int);
ObjectXML::free_nodes(content);
return rc;
}