#include "hash_key_operations.h"
#include <cassert>
+#include <climits>
+#include <random>
#include "main/snort_config.h"
#include "utils/util.h"
HashKeyOperations::HashKeyOperations(int rows)
{
- static bool one = true;
+ static std::mt19937 generator(static_cast<unsigned int>(std::random_device{}()));
- if ( one ) /* one time init */
- {
- srand( (unsigned)time(nullptr) );
- one = false;
- }
-
- if ( SnortConfig::static_hash() )
+ if (SnortConfig::static_hash())
{
seed = 3193;
scale = 719;
hardener = 133824503;
- }
- else
+ }
+ else
{
- seed = nearest_prime( (rand() % rows) + 3191);
- scale = nearest_prime( (rand() % rows) + 709);
- hardener = ((unsigned) rand() * rand()) + 133824503;
+ if ( rows <= 0 )
+ rows = 1;
+
+ std::uniform_int_distribution<> distr(1, rows);
+
+ seed = nearest_prime(distr(generator) + 3191);
+ scale = nearest_prime(distr(generator) + 709);
+
+ // For hardener, use a larger range distribution
+ std::uniform_int_distribution<unsigned long long> large_distr(0, ULLONG_MAX);
+ hardener = static_cast<unsigned long long>(large_distr(generator)) * large_distr(generator) + 133824503;
}
}
auto map_iter = map.find(key);
if (map_iter == map.end())
{
+ // coverity[missing_lock]
stats.find_misses++;
return nullptr;
}
// Move entry to front of LruList
list.splice(list.begin(), list, map_iter->second);
+ // coverity[missing_lock]
stats.find_hits++;
return map_iter->second->second;
}
auto map_iter = map.find(key);
if (map_iter != map.end())
{
+ // coverity[missing_lock]
stats.find_hits++;
list.splice(list.begin(), list, map_iter->second); // update LRU
return map_iter->second->second;
}
+ // coverity[missing_lock]
stats.find_misses++;
+ // coverity[missing_lock]
stats.adds++;
if ( new_data )
*new_data = true;
auto map_iter = map.find(key);
if (map_iter != map.end())
{
+ // coverity[missing_lock]
stats.find_hits++;
if (replace)
{
map_iter->second->second.reset();
map_iter->second->second = data;
increase_size(map_iter->second->second.get());
+ // coverity[missing_lock]
stats.replaced++;
}
list.splice(list.begin(), list, map_iter->second); // update LRU
return true;
}
-
+ // coverity[missing_lock]
stats.find_misses++;
+ // coverity[missing_lock]
stats.adds++;
// Add key/data pair to front of list.
}
/* Dup the input rule list */
- if ( po.rule_list )
- {
- SF_LNODE* lpos = nullptr;
+ SF_LNODE* lpos = nullptr;
- for (int* prid = (int*)sflist_first(po.rule_list, &lpos);
- prid != nullptr;
- prid = (int*)sflist_next(&lpos) )
- {
- int* prule = (int*)snort_calloc(sizeof(int));
- *prule = *prid;
+ for (int* prid = (int*)sflist_first(po.rule_list, &lpos);
+ prid != nullptr;
+ prid = (int*)sflist_next(&lpos) )
+ {
+ int* prule = (int*)snort_calloc(sizeof(int));
+ *prule = *prid;
- if ( ponew->rule_hash->insert(prule, prule) != HASH_OK )
- snort_free(prule);
- }
+ if ( ponew->rule_hash->insert(prule, prule) != HASH_OK )
+ snort_free(prule);
}
return ponew;
SfIp DnsResponseIp::get_ip()
{
- SfIp ip;
+ SfIp ip = {};
int family = 0;
switch (type)
{
const bool accelerated_blocking;
uint8_t partial_match = 0;
- HttpEnums::CompressId compression;
+ HttpEnums::CompressId compression = HttpEnums::CompressId::CMP_NONE;
bool decompress_failed = false;
- uint8_t string_length;
+ uint8_t string_length = 0;
z_stream* compress_stream = nullptr;
ScriptFinder* const finder;
const uint8_t* match_string;
bool cleared = false;
// Pointers to related message sections in the same transaction
- HttpMsgRequest* request;
- HttpMsgStatus* status;
- HttpMsgHeader* header[2];
- HttpMsgTrailer* trailer[2];
+ HttpMsgRequest* request = nullptr;
+ HttpMsgStatus* status = nullptr;
+ HttpMsgHeader* header[2] = {nullptr, nullptr};
+ HttpMsgTrailer* trailer[2] = {nullptr, nullptr};
// Convenience methods shared by multiple subclasses
inflateReset(compress_stream);
compress_stream->next_in = const_cast<Bytef*>(zlib_header);
compress_stream->avail_in = sizeof(zlib_header);
- inflate(compress_stream, Z_SYNC_FLUSH);
-
- // Start over at the beginning
- decompress_copy(buffer, offset, data, length, compression, compress_stream, false,
- infractions, events, session_data);
+ int ret = inflate(compress_stream, Z_SYNC_FLUSH);
+ if ( ret == Z_OK or ret == Z_STREAM_END)
+ {
+ // Start over at the beginning
+ decompress_copy(buffer, offset, data, length, compression, compress_stream, false,
+ infractions, events, session_data);
+ }
return;
}
else
#include "http_enum.h"
#include "log/messages.h"
+#define MAP_SIZE 65536
+
using namespace HttpEnums;
using namespace snort;
return need_norm(uri_component, do_path, uri_param, &unused, &events_sink);
}
-void UriNormalizer::load_default_unicode_map(uint8_t map[65536])
+void UriNormalizer::load_default_unicode_map(uint8_t map[MAP_SIZE])
{
- memset(map, 0xFF, 65536);
+ memset(map, 0xFF, MAP_SIZE);
// Default unicode map is just a single string of tokens of the form
// HHHH:HH (HHHH = unicode, HH = ascii char)
static THREAD_LOCAL snort::ProfileStats http_param_ps;
std::string param; // provide buffer containing specific parameter
- bool nocase; // case insensitive match
+ bool nocase = false; // case insensitive match
snort::LiteralSearch::Handle* search_handle;
};
// LAST_PKT_SECOND - if these aren't set, assume the current wire pkt time
if (!record.first_pkt_second or !record.last_pkt_second)
{
- record.first_pkt_second = packet_time();
- record.last_pkt_second = packet_time();
+ record.first_pkt_second = static_cast<uint32_t>(packet_time());
+ record.last_pkt_second = static_cast<uint32_t>(packet_time());
}
NetFlowEvent event(p, &record, match->create_host, match->create_service, swapped, serviceID);
// Check whether this is a standard method
i_method = SIP_findMethod(cur_tokenp, StandardMethods);
- if (METHOD_NOT_FOUND != i_method )
+ if (METHOD_NOT_FOUND != i_method and StandardMethods[i_method].methodFlag > 0)
{
*methodsConfig |= 1 << (StandardMethods[i_method].methodFlag - 1);
SIP_AddMethodToList(cur_tokenp, StandardMethods[i_method].methodFlag, pmethods);
}
i++;
}
- if (currentUseDefineMethod > SIP_METHOD_USER_DEFINE_MAX)
+ if (currentUseDefineMethod > SIP_METHOD_USER_DEFINE_MAX or currentUseDefineMethod <= SIP_METHOD_NULL)
{
- ParseError("Exceeded max number of user defined methods \n");
+ ParseError("Invalid user defined methods \n");
return nullptr;
}
*methodsConfig |= 1 << (currentUseDefineMethod - 1);
static void SMTP_ResetState(Flow* ssn)
{
SMTPData* smtp_ssn = get_session_data(ssn);
- smtp_ssn->state = STATE_COMMAND;
- smtp_ssn->state_flags = (smtp_ssn->state_flags & SMTP_FLAG_ABANDON_EVT) ? SMTP_FLAG_ABANDON_EVT : 0;
+ if( smtp_ssn )
+ {
+ smtp_ssn->state = STATE_COMMAND;
+ smtp_ssn->state_flags = (smtp_ssn->state_flags & SMTP_FLAG_ABANDON_EVT) ? SMTP_FLAG_ABANDON_EVT : 0;
- delete smtp_ssn->jsn;
- smtp_ssn->jsn = nullptr;
+ delete smtp_ssn->jsn;
+ smtp_ssn->jsn = nullptr;
+ }
}
static inline int InspectPacket(Packet* p)
break;
case STATE_XEXCH50:
if (smtp_normalizing)
- SMTP_CopyToAltBuffer(p, ptr, end - ptr);
+ (void)SMTP_CopyToAltBuffer(p, ptr, end - ptr);
if (smtp_is_data_end (p->flow))
smtp_ssn->state = STATE_COMMAND;
return;
{
public:
using snort::MimeSession::MimeSession;
- SmtpProtoConf* config;
+ SmtpProtoConf* config = nullptr;
#ifndef UNIT_TEST
private:
#endif
void clear() override;
public:
- struct timeval ssn_time;
+ struct timeval ssn_time = {};
};
void udp_stats();
if ( !ut.splitter or p->ptrs.decode_flags & DECODE_SOF )
start(p, flow);
+ //coverity[forward_null]
if ( p->data && p->dsize )
ut.add_data(p);
std::list<UserSegment*> seg_list;
snort::StreamSplitter* splitter;
- PAF_State paf_state;
+ PAF_State paf_state = {};
unsigned total;
};
pos = min(pos, size);
size_t i = 0;
- for (auto chunk : chunks)
+ for (auto &chunk : chunks)
{
auto ptr = get<0>(chunk);
auto len = get<1>(chunk);
pos = min(pos, size);
int i = 0;
- for (auto chunk : chunks)
+ for (auto &chunk : chunks)
{
auto ptr = get<0>(chunk);
auto len = get<1>(chunk);
#include <cstdlib>
#include <cstring>
+#include <vector>
#include "main/thread.h"
char* cur_ptr;
int iRet = RET_OK;
uint16_t bcopied = 0;
- // FIXIT-M this is large for stack. Move elsewhere.
- char decoded_out[65535];
- char* dest = decoded_out;
+ std::vector<char> decoded_out_vec(65535);
+ char* dest = decoded_out_vec.data();
- cur_ptr = s->dest.data+ s->dest.len;
+ cur_ptr = s->dest.data + s->dest.len;
switch (a)
{
- case ACT_NOP:
- WriteJSNormChar(s, c, js);
- break;
- case ACT_SAVE:
- s->overwrite = cur_ptr;
- WriteJSNormChar(s, c, js);
- break;
- case ACT_SPACE:
- if ( s->prev_event != ' ')
- {
+ case ACT_NOP:
WriteJSNormChar(s, c, js);
- }
- s->num_spaces++;
- break;
- case ACT_UNESCAPE:
- if (s->overwrite && (s->overwrite < cur_ptr))
- {
- s->dest.len = s->overwrite - s->dest.data;
- }
- UnescapeDecode(src, srclen, ptr, &dest, sizeof(decoded_out), &bcopied, js, s->unicode_map);
- WriteJSNorm(s, dest, bcopied, js);
- break;
- case ACT_SFCC:
- if ( s->overwrite && (s->overwrite < cur_ptr))
- {
- s->dest.len = s->overwrite - s->dest.data;
- }
- StringFromCharCodeDecode(src, srclen, ptr, &dest, sizeof(decoded_out), &bcopied, js, s->unicode_map);
- WriteJSNorm(s, dest, bcopied, js);
- break;
- case ACT_QUIT:
- iRet = RET_QUIT;
- WriteJSNormChar(s, c, js);
- break;
- default:
- break;
+ break;
+ case ACT_SAVE:
+ s->overwrite = cur_ptr;
+ WriteJSNormChar(s, c, js);
+ break;
+ case ACT_SPACE:
+ if ( s->prev_event != ' ' )
+ {
+ WriteJSNormChar(s, c, js);
+ }
+ s->num_spaces++;
+ break;
+ case ACT_UNESCAPE:
+ if ( s->overwrite && (s->overwrite < cur_ptr) )
+ {
+ s->dest.len = s->overwrite - s->dest.data;
+ }
+ UnescapeDecode(src, srclen, ptr, &dest, decoded_out_vec.size(), &bcopied, js, s->unicode_map);
+ WriteJSNorm(s, dest, bcopied, js);
+ break;
+ case ACT_SFCC:
+ if ( s->overwrite && (s->overwrite < cur_ptr) )
+ {
+ s->dest.len = s->overwrite - s->dest.data;
+ }
+ StringFromCharCodeDecode(src, srclen, ptr, &dest, decoded_out_vec.size(), &bcopied, js, s->unicode_map);
+ WriteJSNorm(s, dest, bcopied, js);
+ break;
+ case ACT_QUIT:
+ iRet = RET_QUIT;
+ WriteJSNormChar(s, c, js);
+ break;
+ default:
+ break;
}
s->prev_event = c;