Skip to content
This repository has been archived by the owner on Jan 18, 2024. It is now read-only.

Commit

Permalink
-Fixed length of REF_TAG_LEN to 255
Browse files Browse the repository at this point in the history
-Fixed possible nexted call to Rollback issued call to dbProcessSignatureInformation,dbSignatureInformationUpdate and SignaturePopulateDatabase
-Fixed compilation issue when no database configuration flag are enabled.

-Added some debug info to some RollbackTransaction call
  • Loading branch information
binf committed Feb 13, 2012
1 parent d6bf50f commit a967256
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 96 deletions.
83 changes: 25 additions & 58 deletions src/output-plugins/spo_database.c
Expand Up @@ -1157,14 +1157,7 @@ u_int32_t dbSignatureInformationUpdate(DatabaseData *data,cacheSignatureObj *iUp
return 1;
}

if( BeginTransaction(data) )
{
/* XXX */
FatalError("ERROR database: [%s()]: Failed to Initialize transaction, bailing ... \n",
__FUNCTION__);
}



DatabaseCleanSelect(data);
DatabaseCleanInsert(data);

Expand All @@ -1179,11 +1172,9 @@ u_int32_t dbSignatureInformationUpdate(DatabaseData *data,cacheSignatureObj *iUp
iUpdateSig->obj.message))
{
/* XXX */
if(RollbackTransaction(data))
{
/* XXX */
FatalError("ERROR database: Unable to rollback transaction\n");
}
LogMessage("ERROR database: calling SnortSnprintf() on data->SQL_SELECT in [%s()] \n",
__FUNCTION__);

return 1;
}

Expand All @@ -1196,69 +1187,44 @@ u_int32_t dbSignatureInformationUpdate(DatabaseData *data,cacheSignatureObj *iUp
iUpdateSig->obj.db_id))
{
/* XXX */
if(RollbackTransaction(data))
{
/* XXX */
FatalError("ERROR database: Unable to rollback transaction\n");
}
LogMessage("ERROR database: calling SnortSnprintf() on data->SQL_INSERT in [%s()] \n",
__FUNCTION__);

return 1;
}


if(Insert(data->SQL_INSERT,data))
{
/* XXX */
if(RollbackTransaction(data))
{
/* XXX */
FatalError("ERROR database: Unable to rollback transaction\n");
}
LogMessage("ERROR database: calling Insert() in [%s()] \n",
__FUNCTION__);

return 1;
}


if(Select(data->SQL_SELECT,data,(u_int32_t *)&db_sig_id))
{
/* XXX */
if(RollbackTransaction(data))
{
/* XXX */
FatalError("ERROR database: Unable to rollback transaction\n");
}
LogMessage("ERROR database: calling Select() in [%s()] \n",
__FUNCTION__);

return 1;
}


if(db_sig_id != iUpdateSig->obj.db_id)
{
/* XXX */
if(RollbackTransaction(data))
{
/* XXX */
FatalError("ERROR database: Unable to rollback transaction\n");
}
return 1;
}


if(CommitTransaction(data))
{
/* XXX */
ErrorMessage("ERROR database: [%s()]: Error commiting transaction \n",
__FUNCTION__);

setTransactionCallFail(&data->dbRH[data->dbtype_id]);

LogMessage("ERROR database: Returned signature_id [%u] is not equal to updated signature_id [%u] in [%s()] \n",
db_sig_id,
iUpdateSig->obj.db_id,
__FUNCTION__);

if(RollbackTransaction(data))
{
/* XXX */
FatalError("ERROR database: Unable to rollback transaction\n");
}
return 1;
return 1;
}


return 0;

}
Expand Down Expand Up @@ -1405,7 +1371,7 @@ int dbProcessSignatureInformation(DatabaseData *data,void *event, u_int32_t even
sigInsertObj.sid = sid;
sigInsertObj.gid = gid;
sigInsertObj.rev = revision;
sigInsertObj.class_id = db_classification_id; /* :) */
sigInsertObj.class_id = db_classification_id;
sigInsertObj.priority_id = priority;

if( SnortSnprintf(sigInsertObj.message,SIG_MSG_LEN,"Snort Alert [%u:%u:%u]",
Expand All @@ -1431,7 +1397,7 @@ int dbProcessSignatureInformation(DatabaseData *data,void *event, u_int32_t even
complete in just a few more jiffies, also its better his way
than to query the database everytime isin't.
*/
if(SignaturePopulateDatabase(data,data->mc.cacheSignatureHead))
if(SignaturePopulateDatabase(data,data->mc.cacheSignatureHead,1))
{
/* XXX */
LogMessage("[%s()]: ERROR inserting new signature \n",
Expand Down Expand Up @@ -2175,6 +2141,7 @@ void Database(Packet *p, void *event, uint32_t event_type, void *arg)
p);
return;
}


/*
This has been refactored to simplify the workflow of the function
Expand All @@ -2186,11 +2153,11 @@ void Database(Packet *p, void *event, uint32_t event_type, void *arg)
if(checkTransactionState(&data->dbRH[data->dbtype_id]) &&
checkTransactionCall(&data->dbRH[data->dbtype_id]))
{

if(RollbackTransaction(data))
{
/* XXX */
FatalError("ERROR database: Unable to rollback transaction\n");
FatalError("ERROR database: Unable to rollback transaction in [%s()]\n",
__FUNCTION__);
}

resetTransactionState(&data->dbRH[data->dbtype_id]);
Expand Down Expand Up @@ -4199,7 +4166,7 @@ void resetTransactionState(dbReliabilityHandle *pdbRH)
}

pdbRH->checkTransaction = 0;
pdbRH->transactionCallFail=0;
pdbRH->transactionCallFail = 0;
pdbRH->transactionErrorCount = 0;

return;
Expand All @@ -4214,7 +4181,7 @@ void setTransactionState(dbReliabilityHandle *pdbRH)
}

pdbRH->checkTransaction = 1;

return;
}

Expand Down
2 changes: 1 addition & 1 deletion src/output-plugins/spo_database.h
Expand Up @@ -666,7 +666,7 @@ u_int32_t cacheEventSignatureLookup(cacheSignatureObj *iHead,
u_int32_t gid,
u_int32_t sid);
u_int32_t SignatureCacheInsertObj(dbSignatureObj *iSigObj,MasterCache *iMasterCache);
u_int32_t SignaturePopulateDatabase(DatabaseData *data,cacheSignatureObj *cacheHead);
u_int32_t SignaturePopulateDatabase(DatabaseData *data,cacheSignatureObj *cacheHead,int inTransac);
void MasterCacheFlush(DatabaseData *data);

u_int32_t dbConnectionStatusPOSTGRESQL(dbReliabilityHandle *pdbRH);
Expand Down
40 changes: 21 additions & 19 deletions src/output-plugins/spo_database_cache.c
Expand Up @@ -69,7 +69,7 @@ u_int32_t ClassificationCacheSynchronize(DatabaseData *data,cacheClassificationO
/* CLASSIFICATION FUNCTIONS */

/* SIGNATURE FUNCTIONS */
u_int32_t SignaturePopulateDatabase(DatabaseData *data,cacheSignatureObj *cacheHead);
u_int32_t SignaturePopulateDatabase(DatabaseData *data,cacheSignatureObj *cacheHead,int inTransac);
u_int32_t SignatureCacheUpdateDBid(dbSignatureObj *iDBList,u_int32_t array_length,cacheSignatureObj **cacheHead);
u_int32_t SignaturePullDataStore(DatabaseData *data, dbSignatureObj **iArrayPtr,u_int32_t *array_length);
u_int32_t SignatureCacheSynchronize(DatabaseData *data,cacheSignatureObj **cacheHead);
Expand Down Expand Up @@ -1529,7 +1529,6 @@ u_int32_t ClassificationPopulateDatabase(DatabaseData *data,cacheClassification
return 1;
}


if(checkTransactionCall(&data->dbRH[data->dbtype_id]))
{
/* A This shouldn't happen since we are in failed transaction state */
Expand All @@ -1545,7 +1544,7 @@ u_int32_t ClassificationPopulateDatabase(DatabaseData *data,cacheClassification
data->SQL_SELECT);
}

BeginTransaction(data);
BeginTransaction(data);

while(cacheHead != NULL)
{
Expand Down Expand Up @@ -1689,7 +1688,7 @@ u_int32_t ClassificationCacheSynchronize(DatabaseData *data,cacheClassificationO
* 0 OK
* 1 ERROR
*/
u_int32_t SignaturePopulateDatabase(DatabaseData *data,cacheSignatureObj *cacheHead)
u_int32_t SignaturePopulateDatabase(DatabaseData *data,cacheSignatureObj *cacheHead,int inTransac)
{
u_int32_t db_sig_id;

Expand All @@ -1715,14 +1714,15 @@ u_int32_t SignaturePopulateDatabase(DatabaseData *data,cacheSignatureObj *cache
data->SQL_SELECT);
}

if( (BeginTransaction(data)))
if(inTransac == 0)
{
/* XXX */
return 1;
if( (BeginTransaction(data)))
{
/* XXX */
return 1;
}
}




while(cacheHead != NULL)
{

Expand Down Expand Up @@ -1788,18 +1788,23 @@ u_int32_t SignaturePopulateDatabase(DatabaseData *data,cacheSignatureObj *cache
}



if(CommitTransaction(data))
if(inTransac == 0)
{
/* XXX */
return 1;
if(CommitTransaction(data))
{
/* XXX */
return 1;
}
}


return 0;

TransactionFail:
RollbackTransaction(data);
if( inTransac == 0)
{
RollbackTransaction(data);
}

return 1;
}
Expand Down Expand Up @@ -2297,7 +2302,7 @@ u_int32_t SignatureCacheSynchronize(DatabaseData *data,cacheSignatureObj **cache
}


if(SignaturePopulateDatabase(data,*cacheHead))
if(SignaturePopulateDatabase(data,*cacheHead,0))
{
LogMessage("[%s()], Call to SignaturePopulateDatabase() failed \n",
__FUNCTION__);
Expand Down Expand Up @@ -3277,7 +3282,6 @@ u_int32_t SystemPopulateDatabase(DatabaseData *data,cacheSystemObj *cacheHead)
return 0;
}


if(checkTransactionCall(&data->dbRH[data->dbtype_id]))
{
/* A This shouldn't happen since we are in failed transaction state */
Expand Down Expand Up @@ -4129,8 +4133,6 @@ u_int32_t SignatureReferencePopulateDatabase(DatabaseData *data,cacheSignatureRe
return 0;
}



if(checkTransactionCall(&data->dbRH[data->dbtype_id]))
{
/* A This shouldn't happen since we are in failed transaction state */
Expand Down
47 changes: 29 additions & 18 deletions src/output-plugins/spo_database_cache.h
Expand Up @@ -58,7 +58,7 @@
#endif /* SYSTEM_URL_LEN */

#ifndef REF_TAG_LEN
#define REF_TAG_LEN 100 /* 100 is a limit that use to be in the classic original output plugin */
#define REF_TAG_LEN 255 /* fix some issue with some ruleset */
#endif /* REF_TAG_LEN */

#ifndef SIG_NAME_LEN
Expand All @@ -83,7 +83,24 @@
#define NUM_ROW_SIGNATURE 7


#if defined(ENABLE_MYSQL) || defined (ENABLE_ODBC) || defined (ENABLE_ORACLE) || defined (ENABLE_MSSQL)
#if defined(ENABLE_POSTGRESQL)

#define SQL_INSERT_SPECIFIC_REFERENCE_SYSTEM "INSERT INTO reference_system (ref_system_name) VALUES (E'%s');"
#define SQL_SELECT_SPECIFIC_REFERENCE_SYSTEM "SELECT ref_system_id FROM reference_system WHERE ref_system_name = E'%s';"
#define SQL_INSERT_SPECIFIC_REF "INSERT INTO reference (ref_system_id,ref_tag) VALUES ('%u',E'%s');"
#define SQL_SELECT_SPECIFIC_REF "SELECT ref_id FROM reference WHERE ref_system_id = '%u' AND ref_tag = E'%s';"
#define SQL_INSERT_CLASSIFICATION "INSERT INTO sig_class (sig_class_name) VALUES (E'%s');"
#define SQL_SELECT_SPECIFIC_CLASSIFICATION "SELECT sig_class_id FROM sig_class WHERE sig_class_name = E'%s';"
#define SQL_INSERT_SIGNATURE "INSERT INTO signature (sig_sid, sig_gid, sig_rev, sig_class_id, sig_priority, sig_name) VALUES ('%u','%u','%u','%u','%u',E'%s');"
#define SQL_SELECT_SPECIFIC_SIGNATURE "SELECT sig_id FROM signature WHERE " \
"(sig_sid = '%u') AND " \
"(sig_gid = '%u') AND " \
"(sig_rev = '%u') AND " \
"(sig_class_id = '%u') AND " \
"(sig_priority = '%u') AND " \
"(sig_name = E'%s'); " \

#elif defined(ENABLE_MYSQL) || defined (ENABLE_ODBC) || defined (ENABLE_ORACLE) || defined (ENABLE_MSSQL)

#define SQL_INSERT_SPECIFIC_REFERENCE_SYSTEM "INSERT INTO reference_system (ref_system_name) VALUES ('%s');"
#define SQL_SELECT_SPECIFIC_REFERENCE_SYSTEM "SELECT ref_system_id FROM reference_system WHERE ref_system_name = '%s';"
Expand All @@ -99,23 +116,17 @@
"(sig_class_id = '%u') AND " \
"(sig_priority = '%u') AND " \
"(sig_name = '%s'); " \

#elif defined(ENABLE_POSTGRESQL)

#define SQL_INSERT_SPECIFIC_REFERENCE_SYSTEM "INSERT INTO reference_system (ref_system_name) VALUES (E'%s');"
#define SQL_SELECT_SPECIFIC_REFERENCE_SYSTEM "SELECT ref_system_id FROM reference_system WHERE ref_system_name = E'%s';"
#define SQL_INSERT_SPECIFIC_REF "INSERT INTO reference (ref_system_id,ref_tag) VALUES ('%u',E'%s');"
#define SQL_SELECT_SPECIFIC_REF "SELECT ref_id FROM reference WHERE ref_system_id = '%u' AND ref_tag = E'%s';"
#define SQL_INSERT_CLASSIFICATION "INSERT INTO sig_class (sig_class_name) VALUES (E'%s');"
#define SQL_SELECT_SPECIFIC_CLASSIFICATION "SELECT sig_class_id FROM sig_class WHERE sig_class_name = E'%s';"
#define SQL_INSERT_SIGNATURE "INSERT INTO signature (sig_sid, sig_gid, sig_rev, sig_class_id, sig_priority, sig_name) VALUES ('%u','%u','%u','%u','%u',E'%s');"
#define SQL_SELECT_SPECIFIC_SIGNATURE "SELECT sig_id FROM signature WHERE " \
"(sig_sid = '%u') AND " \
"(sig_gid = '%u') AND " \
"(sig_rev = '%u') AND " \
"(sig_class_id = '%u') AND " \
"(sig_priority = '%u') AND " \
"(sig_name = E'%s'); " \
#else

#define SQL_INSERT_SPECIFIC_REFERENCE_SYSTEM "UNDEFINED"
#define SQL_SELECT_SPECIFIC_REFERENCE_SYSTEM "UNDEFINED"
#define SQL_INSERT_SPECIFIC_REF "UNDEFINED"
#define SQL_SELECT_SPECIFIC_REF "UNDEFINED"
#define SQL_INSERT_CLASSIFICATION "UNDEFINED"
#define SQL_SELECT_SPECIFIC_CLASSIFICATION "UNDEFINED"
#define SQL_INSERT_SIGNATURE "UNDEFINED"
#define SQL_SELECT_SPECIFIC_SIGNATURE "UNDEFINED"

#endif

Expand Down

0 comments on commit a967256

Please sign in to comment.