Undefined variable/garbage values encountered in snort-2.9.7.5

Bill Parker <[email protected]>
Newsgroups gmane.comp.security.ids.snort.devel
Message-ID <CAFrbyQzMFtu_NytB1z83WBzK1YKfbky0VWYP=V=5=Af1PZt3Zw@mail.gmail.com>
Hello All,

   In processing snort-2.9.7.5 through clang-analyzer 3.5.0, in
'detection-plugins', file 'sp_respond3', module/function 'Resp3_parse',
at line 213: while (i < num_toks), while i is set to zero on line
212, it would appear num_toks is declared at line 204, but it is
never assigned a value (i.e. - un-initialized) before it is compared
at line 213 (thus, it could be anything).

======================================================================

In 'detection-plugins', file 'detection_options.c', module/function
'detection_option_node_evaluate' at line 1212, the expansion of the
macro 'NODE_PROFILE_TMPEND' which is below:

if (ScProfileRules()) { { uint32_t a, d; __asm__ __volatile__
 ("rdtsc" : "=a" (a), "=d" (d)); node_ticks_end = ((uint64_t)
a) | (((uint64_t)d) << 32); }; node_ticks_delta = node_ticks_end
 - node_ticks_start; node_deltas += node_ticks_delta; }

results in the right operand of '-' is a garbage value (which
appears to be variable 'node_ticks_start'), and does not
appear to be initialized inside of the macro itself.

======================================================================

In 'detection-plugins', file 'detection_options.c', module/function
'detection_option_node_evaluate' at lines 1163, 1172, 1199, the
macro expansion of 'NODE_PROFILE_END_NOMATCH' which is below:

if (ScProfileRules()) { { uint32_t a, d; __asm__ __volatile__
 ("rdtsc" : "=a" (a), "=d" (d)); node_ticks_end = ((uint64_t)
a) | (((uint64_t)d) << 32); }; node_ticks_delta = node_ticks_end
 - node_ticks_start; node->ticks += node_ticks_delta + node_deltas
; node->ticks_no_match += node_ticks_delta + node_deltas; }

results in the right operand of '-' is a garbage value (which
appears to be variable 'node_ticks_start'), and does not
appear to be initialized inside of the macro itself.

=======================================================================

I am attaching the HTML output from clang-analyzer to this bug report.

Bill Parker
report-110a5f.html (text/html, 206 KB) - not displayed
report-212310.html (text/html, 44.7 KB)
<!doctype html>
<html>
<head>
<title>sp_respond3.c</title>
<style type="text/css">
 body { color:#000000; background-color:#ffffff }
 body { font-family:Helvetica, sans-serif; font-size:10pt }
 h1 { font-size:14pt }
 .code { border-collapse:collapse; width:100%; }
 .code { font-family: "Monospace", monospace; font-size:10pt }
 .code { line-height: 1.2em }
 .comment { color: green; font-style: oblique }
 .keyword { color: blue }
 .string_literal { color: red }
 .directive { color: darkmagenta }
 .expansion { display: none; }
 .macro:hover .expansion { display: block; border: 2px solid #FF0000; padding: 2px; background-color:#FFF0F0; font-weight: normal;   -webkit-border-radius:5px;  -webkit-box-shadow:1px 1px 7px #000; position: absolute; top: -1em; left:10em; z-index: 1 } 
 .macro { color: darkmagenta; background-color:LemonChiffon; position: relative }
 .num { width:2.5em; padding-right:2ex; background-color:#eeeeee }
 .num { text-align:right; font-size:8pt }
 .num { color:#444444 }
 .line { padding-left: 1ex; border-left: 3px solid #ccc }
 .line { white-space: pre }
 .msg { -webkit-box-shadow:1px 1px 7px #000 }
 .msg { -webkit-border-radius:5px }
 .msg { font-family:Helvetica, sans-serif; font-size:8pt }
 .msg { float:left }
 .msg { padding:0.25em 1ex 0.25em 1ex }
 .msg { margin-top:10px; margin-bottom:10px }
 .msg { font-weight:bold }
 .msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap }
 .msgT { padding:0x; spacing:0x }
 .msgEvent { background-color:#fff8b4; color:#000000 }
 .msgControl { background-color:#bbbbbb; color:#000000 }
 .mrange { background-color:#dfddf3 }
 .mrange { border-bottom:1px solid #6F9DBE }
 .PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; }
 .PathIndex { -webkit-border-radius:8px }
 .PathIndexEvent { background-color:#bfba87 }
 .PathIndexControl { background-color:#8c8c8c }
 .PathNav a { text-decoration:none; font-size: larger }
 .CodeInsertionHint { font-weight: bold; background-color: #10dd10 }
 .CodeRemovalHint { background-color:#de1010 }
 .CodeRemovalHint { border-bottom:1px solid #6F9DBE }
 table.simpletable {
   padding: 5px;
   font-size:12pt;
   margin:20px;
   border-collapse: collapse; border-spacing: 0px;
 }
 td.rowname {
   text-align:right; font-weight:bold; color:#444444;
   padding-right:2ex; }
</style>
</head>
<body>
<!-- BUGDESC The right operand of '<' is a garbage value -->

<!-- BUGTYPE Result of operation is garbage or undefined -->

<!-- BUGCATEGORY Logic error -->

<!-- BUGFILE /usr/local/src/snort-2.9.7.5/src/detection-plugins/sp_respond3.c -->

<!-- FILENAME sp_respond3.c -->

<!-- FUNCTIONNAME Resp3_Parse -->

<!-- BUGLINE 213 -->

<!-- BUGCOLUMN 14 -->

<!-- BUGPATHLENGTH 4 -->

<!-- BUGMETAEND -->
<!-- REPORTHEADER -->
<h3>Bug Summary</h3>
<table class="simpletable">
<tr><td class="rowname">File:</td><td>detection-plugins/sp_respond3.c</td></tr>
<tr><td class="rowname">Location:</td><td><a href="#EndPath">line 213, column 14</a></td></tr>
<tr><td class="rowname">Description:</td><td>The right operand of '<' is a garbage value</td></tr>
</table>
<!-- REPORTSUMMARYEXTRA -->
<h3>Annotated Source Code</h3>
<table class="code">
<tr><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* $Id: sp_respond3.c,v 1.11 2015/04/23 18:28:09 jocornet Exp $ */</span></td></tr>
<tr><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/****************************************************************************</span></td></tr>
<tr><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* Copyright (C) 2014-2015 Cisco and/or its affiliates. All rights reserved.</span></td></tr>
<tr><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* Copyright (C) 2005-2013 Sourcefire, Inc.</span></td></tr>
<tr><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or modify it</span></td></tr>
<tr><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>* under the terms of the GNU General Public License Version 2 as published by</span></td></tr>
<tr><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* the Free Software Foundation.  You may not use, modify or distribute this</span></td></tr>
<tr><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* program under any other version of the GNU General Public License.</span></td></tr>
<tr><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but WITHOUT</span></td></tr>
<tr><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or</span></td></tr>
<tr><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for</span></td></tr>
<tr><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* more details.</span></td></tr>
<tr><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License along with</span></td></tr>
<tr><td class="num" id="LN18">18</td><td class="line"> <span class='comment'>* this program; if not, write to the Free Software Foundation, Inc.,</span></td></tr>
<tr><td class="num" id="LN19">19</td><td class="line"> <span class='comment'>* 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA</span></td></tr>
<tr><td class="num" id="LN20">20</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN21">21</td><td class="line"> <span class='comment'>****************************************************************************/</span></td></tr>
<tr><td class="num" id="LN22">22</td><td class="line"><span class='comment'>/* Snort sp_resp3 Detection Plugin</span></td></tr>
<tr><td class="num" id="LN23">23</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN24">24</td><td class="line"> <span class='comment'>* Perform flexible response on packets matching conditions specified in Snort</span></td></tr>
<tr><td class="num" id="LN25">25</td><td class="line"> <span class='comment'>* rules.</span></td></tr>
<tr><td class="num" id="LN26">26</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN27">27</td><td class="line"> <span class='comment'>* Shutdown hostile network connections by injecting TCP resets or ICMP</span></td></tr>
<tr><td class="num" id="LN28">28</td><td class="line"> <span class='comment'>* unreachable packets.</span></td></tr>
<tr><td class="num" id="LN29">29</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN30">30</td><td class="line"> <span class='comment'>* flexresp3 is derived from flexresp and flexresp2.  It includes all</span></td></tr>
<tr><td class="num" id="LN31">31</td><td class="line"> <span class='comment'>* configuration options from those modules and has these differences:</span></td></tr>
<tr><td class="num" id="LN32">32</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN33">33</td><td class="line"> <span class='comment'>* - injects packets with correct encapsulations (doesn't assume</span></td></tr>
<tr><td class="num" id="LN34">34</td><td class="line"> <span class='comment'>* eth+ip+icmp/tcp).</span></td></tr>
<tr><td class="num" id="LN35">35</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN36">36</td><td class="line"> <span class='comment'>* - uses the wire packet as a prototype, not the packet generating the alert</span></td></tr>
<tr><td class="num" id="LN37">37</td><td class="line"> <span class='comment'>* (which may be reassembled or otherwise generated internally with only the</span></td></tr>
<tr><td class="num" id="LN38">38</td><td class="line"> <span class='comment'>* headers required for logging).</span></td></tr>
<tr><td class="num" id="LN39">39</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN40">40</td><td class="line"> <span class='comment'>* - queues the injection action so that it is taken only once after detection</span></td></tr>
<tr><td class="num" id="LN41">41</td><td class="line"> <span class='comment'>* regardless of multiple resp3 rules firing.</span></td></tr>
<tr><td class="num" id="LN42">42</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN43">43</td><td class="line"> <span class='comment'>* - uses the same encoding and injection mechanism as active_response and/or</span></td></tr>
<tr><td class="num" id="LN44">44</td><td class="line"> <span class='comment'>* reject actions.</span></td></tr>
<tr><td class="num" id="LN45">45</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN46">46</td><td class="line"> <span class='comment'>* - bypasses sequence strafing in inline mode.</span></td></tr>
<tr><td class="num" id="LN47">47</td><td class="line"> <span class='comment'>*</span></td></tr>
<tr><td class="num" id="LN48">48</td><td class="line"> <span class='comment'>* - if a resp3 rule is also a drop rule, the drop processing takes precedence.</span></td></tr>
<tr><td class="num" id="LN49">49</td><td class="line"> <span class='comment'>*/</span></td></tr>
<tr><td class="num" id="LN50">50</td><td class="line"> </td></tr>
<tr><td class="num" id="LN51">51</td><td class="line"><span class='comment'>// @file    sp_respond3.c</span></td></tr>
<tr><td class="num" id="LN52">52</td><td class="line"><span class='comment'>// @author  Russ Combs &lt;[email protected]&gt;</span></td></tr>
<tr><td class="num" id="LN53">53</td><td class="line"> </td></tr>
<tr><td class="num" id="LN54">54</td><td class="line"><span class='directive'>#ifdef <span class='macro'>ENABLE_RESPONSE3<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN55">55</td><td class="line"> </td></tr>
<tr><td class="num" id="LN56">56</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN57">57</td><td class="line"><span class='directive'>#include "config.h"</span></td></tr>
<tr><td class="num" id="LN58">58</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN59">59</td><td class="line"> </td></tr>
<tr><td class="num" id="LN60">60</td><td class="line"><span class='directive'>#include "sf_types.h"</span></td></tr>
<tr><td class="num" id="LN61">61</td><td class="line"><span class='directive'>#include "snort_bounds.h"</span></td></tr>
<tr><td class="num" id="LN62">62</td><td class="line"><span class='directive'>#include "checksum.h"</span></td></tr>
<tr><td class="num" id="LN63">63</td><td class="line"><span class='directive'>#include "snort_debug.h"</span></td></tr>
<tr><td class="num" id="LN64">64</td><td class="line"><span class='directive'>#include "decode.h"</span></td></tr>
<tr><td class="num" id="LN65">65</td><td class="line"><span class='directive'>#include "encode.h"</span></td></tr>
<tr><td class="num" id="LN66">66</td><td class="line"><span class='directive'>#include "detection_options.h"</span></td></tr>
<tr><td class="num" id="LN67">67</td><td class="line"><span class='directive'>#include "log.h"</span></td></tr>
<tr><td class="num" id="LN68">68</td><td class="line"><span class='directive'>#include "mstring.h"</span></td></tr>
<tr><td class="num" id="LN69">69</td><td class="line"><span class='directive'>#include "parser.h"</span></td></tr>
<tr><td class="num" id="LN70">70</td><td class="line"><span class='directive'>#include "plugbase.h"</span></td></tr>
<tr><td class="num" id="LN71">71</td><td class="line"><span class='directive'>#include "plugin_enum.h"</span></td></tr>
<tr><td class="num" id="LN72">72</td><td class="line"><span class='directive'>#include "profiler.h"</span></td></tr>
<tr><td class="num" id="LN73">73</td><td class="line"><span class='directive'>#include "active.h"</span></td></tr>
<tr><td class="num" id="LN74">74</td><td class="line"><span class='directive'>#include "rules.h"</span></td></tr>
<tr><td class="num" id="LN75">75</td><td class="line"><span class='directive'>#include "sfhashfcn.h"</span></td></tr>
<tr><td class="num" id="LN76">76</td><td class="line"><span class='directive'>#include "sfxhash.h"</span></td></tr>
<tr><td class="num" id="LN77">77</td><td class="line"><span class='directive'>#include "snort.h"</span></td></tr>
<tr><td class="num" id="LN78">78</td><td class="line"><span class='directive'>#include "sp_respond.h"</span></td></tr>
<tr><td class="num" id="LN79">79</td><td class="line"><span class='directive'>#include "util.h"</span></td></tr>
<tr><td class="num" id="LN80">80</td><td class="line"> </td></tr>
<tr><td class="num" id="LN81">81</td><td class="line"><span class='directive'>#define <span class='macro'>MOD_NAME<span class='expansion'>"sp_resp3"</span></span> "sp_resp3"     /* plugin name */</span></td></tr>
<tr><td class="num" id="LN82">82</td><td class="line"> </td></tr>
<tr><td class="num" id="LN83">83</td><td class="line"><span class='directive'>#define <span class='macro'>RESP_RST_SND<span class='expansion'>0x01</span></span>  0x01</span></td></tr>
<tr><td class="num" id="LN84">84</td><td class="line"><span class='directive'>#define <span class='macro'>RESP_RST_RCV<span class='expansion'>0x02</span></span>  0x02</span></td></tr>
<tr><td class="num" id="LN85">85</td><td class="line"><span class='directive'>#define <span class='macro'>RESP_UNR_NET<span class='expansion'>0x04</span></span>  0x04</span></td></tr>
<tr><td class="num" id="LN86">86</td><td class="line"><span class='directive'>#define <span class='macro'>RESP_UNR_HOST<span class='expansion'>0x08</span></span> 0x08</span></td></tr>
<tr><td class="num" id="LN87">87</td><td class="line"><span class='directive'>#define <span class='macro'>RESP_UNR_PORT<span class='expansion'>0x10</span></span> 0x10</span></td></tr>
<tr><td class="num" id="LN88">88</td><td class="line"> </td></tr>
<tr><td class="num" id="LN89">89</td><td class="line"><span class='directive'>#define <span class='macro'>RESP_RST<span class='expansion'>(0x01|0x02)</span></span> (<span class='macro'>RESP_RST_SND<span class='expansion'>0x01</span></span>|<span class='macro'>RESP_RST_RCV<span class='expansion'>0x02</span></span>)</span></td></tr>
<tr><td class="num" id="LN90">90</td><td class="line"><span class='directive'>#define <span class='macro'>RESP_UNR<span class='expansion'>(0x04|0x08|0x10)</span></span> (<span class='macro'>RESP_UNR_NET<span class='expansion'>0x04</span></span>|<span class='macro'>RESP_UNR_HOST<span class='expansion'>0x08</span></span>|<span class='macro'>RESP_UNR_PORT<span class='expansion'>0x10</span></span>)</span></td></tr>
<tr><td class="num" id="LN91">91</td><td class="line"> </td></tr>
<tr><td class="num" id="LN92">92</td><td class="line"><span class='directive'>#ifdef <span class='macro'>PERF_PROFILING<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN93">93</td><td class="line"><span class='keyword'>static</span> PreprocStats resp3PerfStats;</td></tr>
<tr><td class="num" id="LN94">94</td><td class="line"><span class='keyword'>extern</span> PreprocStats ruleOTNEvalPerfStats;</td></tr>
<tr><td class="num" id="LN95">95</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN96">96</td><td class="line"> </td></tr>
<tr><td class="num" id="LN97">97</td><td class="line"><span class='comment'>// instance data</span></td></tr>
<tr><td class="num" id="LN98">98</td><td class="line"><span class='keyword'>typedef</span> <span class='keyword'>struct</span> {</td></tr>
<tr><td class="num" id="LN99">99</td><td class="line">    uint32_t mask;</td></tr>
<tr><td class="num" id="LN100">100</td><td class="line">    uint32_t flags;</td></tr>
<tr><td class="num" id="LN101">101</td><td class="line">} Resp3_Data;</td></tr>
<tr><td class="num" id="LN102">102</td><td class="line"> </td></tr>
<tr><td class="num" id="LN103">103</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>int</span> s_init = 1;</td></tr>
<tr><td class="num" id="LN104">104</td><td class="line"> </td></tr>
<tr><td class="num" id="LN105">105</td><td class="line"><span class='comment'>// callback functions</span></td></tr>
<tr><td class="num" id="LN106">106</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> Resp3_Init(<span class='keyword'>struct</span> _SnortConfig *, <span class='keyword'>char</span>* data, OptTreeNode*, <span class='keyword'>int</span> protocol);</td></tr>
<tr><td class="num" id="LN107">107</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> Resp3_Cleanup(<span class='keyword'>int</span> signal, <span class='keyword'>void</span>* data);</td></tr>
<tr><td class="num" id="LN108">108</td><td class="line"> </td></tr>
<tr><td class="num" id="LN109">109</td><td class="line"><span class='comment'>// core functions</span></td></tr>
<tr><td class="num" id="LN110">110</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>int</span> Resp3_Parse(<span class='keyword'>char</span>* type);</td></tr>
<tr><td class="num" id="LN111">111</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>int</span> Resp3_Queue(Packet*, <span class='keyword'>void</span>*);</td></tr>
<tr><td class="num" id="LN112">112</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> Resp3_Send(Packet*, <span class='keyword'>void</span>*);</td></tr>
<tr><td class="num" id="LN113">113</td><td class="line"> </td></tr>
<tr><td class="num" id="LN114">114</td><td class="line"><span class='comment'>//--------------------------------------------------------------------</span></td></tr>
<tr><td class="num" id="LN115">115</td><td class="line"><span class='comment'>// public functions</span></td></tr>
<tr><td class="num" id="LN116">116</td><td class="line"><span class='comment'>// here we use the non '_' versions for consistency ...</span></td></tr>
<tr><td class="num" id="LN117">117</td><td class="line">uint32_t RespondHash(<span class='keyword'>void</span>* d)</td></tr>
<tr><td class="num" id="LN118">118</td><td class="line">{</td></tr>
<tr><td class="num" id="LN119">119</td><td class="line">    uint32_t a,b,c;</td></tr>
<tr><td class="num" id="LN120">120</td><td class="line">    Resp3_Data* data = (Resp3_Data*)d;</td></tr>
<tr><td class="num" id="LN121">121</td><td class="line"> </td></tr>
<tr><td class="num" id="LN122">122</td><td class="line">    a = data-&gt;mask;</td></tr>
<tr><td class="num" id="LN123">123</td><td class="line">    b = RULE_OPTION_TYPE_RESPOND;</td></tr>
<tr><td class="num" id="LN124">124</td><td class="line">    c = 0;</td></tr>
<tr><td class="num" id="LN125">125</td><td class="line"> </td></tr>
<tr><td class="num" id="LN126">126</td><td class="line">    <span class='macro'>final(a,b,c)<span class='expansion'>{ c ^= b; c -= (((b)&lt;&lt;(14)) | ((b)&gt;&gt;(32-(14)))); a<br> ^= c; a -= (((c)&lt;&lt;(11)) | ((c)&gt;&gt;(32-(11)))); b ^=<br> a; b -= (((a)&lt;&lt;(25)) | ((a)&gt;&gt;(32-(25)))); c ^= b<br>; c -= (((b)&lt;&lt;(16)) | ((b)&gt;&gt;(32-(16)))); a ^= c; a<br> -= (((c)&lt;&lt;(4)) | ((c)&gt;&gt;(32-(4)))); b ^= a; b -= (<br>((a)&lt;&lt;(14)) | ((a)&gt;&gt;(32-(14)))); c ^= b; c -= (((<br>b)&lt;&lt;(24)) | ((b)&gt;&gt;(32-(24)))); }</span></span>;</td></tr>
<tr><td class="num" id="LN127">127</td><td class="line"> </td></tr>
<tr><td class="num" id="LN128">128</td><td class="line">    <span class='keyword'>return</span> c;</td></tr>
<tr><td class="num" id="LN129">129</td><td class="line">}</td></tr>
<tr><td class="num" id="LN130">130</td><td class="line"> </td></tr>
<tr><td class="num" id="LN131">131</td><td class="line"><span class='keyword'>int</span> RespondCompare(<span class='keyword'>void</span>* l, <span class='keyword'>void</span>* r)</td></tr>
<tr><td class="num" id="LN132">132</td><td class="line">{</td></tr>
<tr><td class="num" id="LN133">133</td><td class="line">    Resp3_Data* left = (Resp3_Data*)l;</td></tr>
<tr><td class="num" id="LN134">134</td><td class="line">    Resp3_Data* right = (Resp3_Data*)r;</td></tr>
<tr><td class="num" id="LN135">135</td><td class="line"> </td></tr>
<tr><td class="num" id="LN136">136</td><td class="line">    <span class='keyword'>if</span> (!left || !right)</td></tr>
<tr><td class="num" id="LN137">137</td><td class="line">        <span class='keyword'>return</span> <span class='macro'>DETECTION_OPTION_NOT_EQUAL<span class='expansion'>1</span></span>;</td></tr>
<tr><td class="num" id="LN138">138</td><td class="line"> </td></tr>
<tr><td class="num" id="LN139">139</td><td class="line">    <span class='keyword'>if</span> (left-&gt;mask == right-&gt;mask)</td></tr>
<tr><td class="num" id="LN140">140</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN141">141</td><td class="line">        <span class='keyword'>return</span> <span class='macro'>DETECTION_OPTION_EQUAL<span class='expansion'>0</span></span>;</td></tr>
<tr><td class="num" id="LN142">142</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN143">143</td><td class="line"> </td></tr>
<tr><td class="num" id="LN144">144</td><td class="line">    <span class='keyword'>return</span> <span class='macro'>DETECTION_OPTION_NOT_EQUAL<span class='expansion'>1</span></span>;</td></tr>
<tr><td class="num" id="LN145">145</td><td class="line">}</td></tr>
<tr><td class="num" id="LN146">146</td><td class="line"> </td></tr>
<tr><td class="num" id="LN147">147</td><td class="line"><span class='comment'>// and here we use the functional name for consistency ...</span></td></tr>
<tr><td class="num" id="LN148">148</td><td class="line"><span class='keyword'>void</span> SetupRespond(<span class='keyword'>void</span>)</td></tr>
<tr><td class="num" id="LN149">149</td><td class="line">{</td></tr>
<tr><td class="num" id="LN150">150</td><td class="line">    RegisterRuleOption(<span class='string_literal'>"resp"</span>, Resp3_Init, <span class='macro'>NULL<span class='expansion'>((void*)0)</span></span>, OPT_TYPE_ACTION, <span class='macro'>NULL<span class='expansion'>((void*)0)</span></span>);</td></tr>
<tr><td class="num" id="LN151">151</td><td class="line"><span class='directive'>#ifdef <span class='macro'>PERF_PROFILING<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN152">152</td><td class="line">    RegisterPreprocessorProfile(<span class='string_literal'>"resp3"</span>, &amp;resp3PerfStats, 3, &amp;ruleOTNEvalPerfStats);</td></tr>
<tr><td class="num" id="LN153">153</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN154">154</td><td class="line">}</td></tr>
<tr><td class="num" id="LN155">155</td><td class="line"> </td></tr>
<tr><td class="num" id="LN156">156</td><td class="line"><span class='comment'>//--------------------------------------------------------------------</span></td></tr>
<tr><td class="num" id="LN157">157</td><td class="line"><span class='comment'>// callback functions</span></td></tr>
<tr><td class="num" id="LN158">158</td><td class="line"> </td></tr>
<tr><td class="num" id="LN159">159</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> Resp3_Init(<span class='keyword'>struct</span> _SnortConfig *sc, <span class='keyword'>char</span>* data, OptTreeNode* otn, <span class='keyword'>int</span> protocol)</td></tr>
<tr><td class="num" id="LN160">160</td><td class="line">{</td></tr>
<tr><td class="num" id="LN161">161</td><td class="line">    Resp3_Data* rd = <span class='macro'>NULL<span class='expansion'>((void*)0)</span></span>;</td></tr>
<tr><td class="num" id="LN162">162</td><td class="line">    <span class='keyword'>void</span>* idx_dup;</td></tr>
<tr><td class="num" id="LN163">163</td><td class="line"> </td></tr>
<tr><td class="num" id="LN164">164</td><td class="line">    <span class='keyword'>if</span> ( otn-&gt;ds_list[PLUGIN_RESPONSE] )</td></tr>
<tr><td class="num" id="LN165">165</td><td class="line">        FatalError(<span class='string_literal'>"%s(%d): Multiple response options in rule\n"</span>,</td></tr>
<tr><td class="num" id="LN166">166</td><td class="line">            file_name, file_line);</td></tr>
<tr><td class="num" id="LN167">167</td><td class="line"> </td></tr>
<tr><td class="num" id="LN168">168</td><td class="line">    <span class='keyword'>if</span> ( s_init )</td></tr>
<tr><td class="num" id="LN169">169</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN170">170</td><td class="line">        AddFuncToCleanExitList(Resp3_Cleanup, <span class='macro'>NULL<span class='expansion'>((void*)0)</span></span>);</td></tr>
<tr><td class="num" id="LN171">171</td><td class="line"> </td></tr>
<tr><td class="num" id="LN172">172</td><td class="line">        Active_SetEnabled(1);</td></tr>
<tr><td class="num" id="LN173">173</td><td class="line">        s_init = 0;</td></tr>
<tr><td class="num" id="LN174">174</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN175">175</td><td class="line"> </td></tr>
<tr><td class="num" id="LN176">176</td><td class="line">    rd = (Resp3_Data*)SnortAlloc(<span class='keyword'>sizeof</span>(*rd));</td></tr>
<tr><td class="num" id="LN177">177</td><td class="line">    rd-&gt;mask = Resp3_Parse(data);</td></tr>
<tr><td class="num" id="LN178">178</td><td class="line"> </td></tr>
<tr><td class="num" id="LN179">179</td><td class="line">    <span class='keyword'>if</span> ( add_detection_option(sc, RULE_OPTION_TYPE_RESPOND, rd, &amp;idx_dup)</td></tr>
<tr><td class="num" id="LN180">180</td><td class="line">        == <span class='macro'>DETECTION_OPTION_EQUAL<span class='expansion'>0</span></span>)</td></tr>
<tr><td class="num" id="LN181">181</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN182">182</td><td class="line">        free(rd);</td></tr>
<tr><td class="num" id="LN183">183</td><td class="line">        rd = idx_dup;</td></tr>
<tr><td class="num" id="LN184">184</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN185">185</td><td class="line">    <span class='comment'>// this prevents multiple response options in rule</span></td></tr>
<tr><td class="num" id="LN186">186</td><td class="line">    otn-&gt;ds_list[PLUGIN_RESPONSE] = rd;</td></tr>
<tr><td class="num" id="LN187">187</td><td class="line">    AddRspFuncToList(Resp3_Queue, otn, rd);</td></tr>
<tr><td class="num" id="LN188">188</td><td class="line">}</td></tr>
<tr><td class="num" id="LN189">189</td><td class="line"> </td></tr>
<tr><td class="num" id="LN190">190</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> Resp3_Cleanup(<span class='keyword'>int</span> signal, <span class='keyword'>void</span>* data)</td></tr>
<tr><td class="num" id="LN191">191</td><td class="line">{</td></tr>
<tr><td class="num" id="LN192">192</td><td class="line">    s_init = 1;</td></tr>
<tr><td class="num" id="LN193">193</td><td class="line">}</td></tr>
<tr><td class="num" id="LN194">194</td><td class="line"> </td></tr>
<tr><td class="num" id="LN195">195</td><td class="line"><span class='comment'>//--------------------------------------------------------------------</span></td></tr>
<tr><td class="num" id="LN196">196</td><td class="line"><span class='comment'>// core functions</span></td></tr>
<tr><td class="num" id="LN197">197</td><td class="line"><span class='comment'>// TBD conf parsing should be registered and distributed as well as rule</span></td></tr>
<tr><td class="num" id="LN198">198</td><td class="line"><span class='comment'>// option parsing</span></td></tr>
<tr><td class="num" id="LN199">199</td><td class="line"> </td></tr>
<tr><td class="num" id="LN200">200</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>int</span> Resp3_Parse(<span class='keyword'>char</span>* type)</td></tr>
<tr><td class="num" id="LN201">201</td><td class="line">{</td></tr>
<tr><td class="num" id="LN202">202</td><td class="line">    <span class='keyword'>char</span>* *toks;</td></tr>
<tr><td class="num" id="LN203">203</td><td class="line">    uint32_t flags = 0;</td></tr>
<tr><td class="num" id="LN204">204</td><td class="line">    <span class='keyword'>int</span> <span class="mrange">num_toks</span>, i;</td></tr>
<tr><td class="num"></td><td class="line"><div id="Path1" class="msg msgEvent" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">1</div></td><td>'num_toks' declared without an initial value</td><td><div class="PathNav"><a href="#Path2" title="Next event (2)">&#x2192;</a></div></td></tr></table></div></td></tr>
<tr><td class="num" id="LN205">205</td><td class="line"> </td></tr>
<tr><td class="num" id="LN206">206</td><td class="line">    <span class='keyword'>if</span> ( <span class="mrange">type</span> )</td></tr>
<tr><td class="num"></td><td class="line"><div id="Path2" class="msg msgEvent" style="margin-left:10ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">2</div></td><td><div class="PathNav"><a href="#Path1" title="Previous event (1)">&#x2190;</a></div></td></td><td>Assuming 'type' is null</td><td><div class="PathNav"><a href="#Path3" title="Next event (3)">&#x2192;</a></div></td></tr></table></div></td></tr>
<tr><td class="num"></td><td class="line"><div id="Path3" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">3</div></td><td><div class="PathNav"><a href="#Path2" title="Previous event (2)">&#x2190;</a></div></td></td><td>Taking false branch</td><td><div class="PathNav"><a href="#EndPath" title="Next event (4)">&#x2192;</a></div></td></tr></table></div></td></tr>
<tr><td class="num" id="LN207">207</td><td class="line">        toks = mSplit(type, <span class='string_literal'>","</span>, 6, &amp;num_toks, 0);</td></tr>
<tr><td class="num" id="LN208">208</td><td class="line">    <span class='keyword'>else</span></td></tr>
<tr><td class="num" id="LN209">209</td><td class="line">        FatalError(<span class='string_literal'>"%s: %s(%d): missing resp modifier"</span>,</td></tr>
<tr><td class="num" id="LN210">210</td><td class="line">            <span class='macro'>MOD_NAME<span class='expansion'>"sp_resp3"</span></span>, file_name, file_line);</td></tr>
<tr><td class="num" id="LN211">211</td><td class="line"> </td></tr>
<tr><td class="num" id="LN212">212</td><td class="line">    i = 0;</td></tr>
<tr><td class="num" id="LN213">213</td><td class="line">    <span class='keyword'>while</span> (i &lt; <span class="mrange">num_toks</span>)</td></tr>
<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:14ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">4</div></td><td><div class="PathNav"><a href="#Path3" title="Previous event (3)">&#x2190;</a></div></td></td><td>The right operand of '&lt;' is a garbage value</td></tr></table></div></td></tr>
<tr><td class="num" id="LN214">214</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN215">215</td><td class="line">        <span class='keyword'>if</span> ( !strcasecmp(toks[i], <span class='string_literal'>"reset_source"</span>) ||</td></tr>
<tr><td class="num" id="LN216">216</td><td class="line">             !strcasecmp(toks[i], <span class='string_literal'>"rst_snd"</span>) )</td></tr>
<tr><td class="num" id="LN217">217</td><td class="line">        {</td></tr>
<tr><td class="num" id="LN218">218</td><td class="line">            flags |= <span class='macro'>RESP_RST_SND<span class='expansion'>0x01</span></span>;</td></tr>
<tr><td class="num" id="LN219">219</td><td class="line">            i++;</td></tr>
<tr><td class="num" id="LN220">220</td><td class="line">        }</td></tr>
<tr><td class="num" id="LN221">221</td><td class="line">        <span class='keyword'>else</span> <span class='keyword'>if</span> ( !strcasecmp(toks[i], <span class='string_literal'>"reset_dest"</span>) ||</td></tr>
<tr><td class="num" id="LN222">222</td><td class="line">                  !strcasecmp(toks[i], <span class='string_literal'>"rst_rcv"</span>) )</td></tr>
<tr><td class="num" id="LN223">223</td><td class="line">        {</td></tr>
<tr><td class="num" id="LN224">224</td><td class="line">            flags |= <span class='macro'>RESP_RST_RCV<span class='expansion'>0x02</span></span>;</td></tr>
<tr><td class="num" id="LN225">225</td><td class="line">            i++;</td></tr>
<tr><td class="num" id="LN226">226</td><td class="line">        }</td></tr>
<tr><td class="num" id="LN227">227</td><td class="line">        <span class='keyword'>else</span> <span class='keyword'>if</span> ( !strcasecmp(toks[i], <span class='string_literal'>"reset_both"</span>) ||</td></tr>
<tr><td class="num" id="LN228">228</td><td class="line">                  !strcasecmp(toks[i], <span class='string_literal'>"rst_all"</span>) )</td></tr>
<tr><td class="num" id="LN229">229</td><td class="line">        {</td></tr>
<tr><td class="num" id="LN230">230</td><td class="line">            flags |= (<span class='macro'>RESP_RST_RCV<span class='expansion'>0x02</span></span> | <span class='macro'>RESP_RST_SND<span class='expansion'>0x01</span></span>);</td></tr>
<tr><td class="num" id="LN231">231</td><td class="line">            i++;</td></tr>
<tr><td class="num" id="LN232">232</td><td class="line">        }</td></tr>
<tr><td class="num" id="LN233">233</td><td class="line">        <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcasecmp(toks[i], <span class='string_literal'>"icmp_net"</span>))</td></tr>
<tr><td class="num" id="LN234">234</td><td class="line">        {</td></tr>
<tr><td class="num" id="LN235">235</td><td class="line">            flags |= <span class='macro'>RESP_UNR_NET<span class='expansion'>0x04</span></span>;</td></tr>
<tr><td class="num" id="LN236">236</td><td class="line">            i++;</td></tr>
<tr><td class="num" id="LN237">237</td><td class="line">        }</td></tr>
<tr><td class="num" id="LN238">238</td><td class="line">        <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcasecmp(toks[i], <span class='string_literal'>"icmp_host"</span>))</td></tr>
<tr><td class="num" id="LN239">239</td><td class="line">        {</td></tr>
<tr><td class="num" id="LN240">240</td><td class="line">            flags |= <span class='macro'>RESP_UNR_HOST<span class='expansion'>0x08</span></span>;</td></tr>
<tr><td class="num" id="LN241">241</td><td class="line">            i++;</td></tr>
<tr><td class="num" id="LN242">242</td><td class="line">        }</td></tr>
<tr><td class="num" id="LN243">243</td><td class="line">        <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcasecmp(toks[i], <span class='string_literal'>"icmp_port"</span>))</td></tr>
<tr><td class="num" id="LN244">244</td><td class="line">        {</td></tr>
<tr><td class="num" id="LN245">245</td><td class="line">            flags |= <span class='macro'>RESP_UNR_PORT<span class='expansion'>0x10</span></span>;</td></tr>
<tr><td class="num" id="LN246">246</td><td class="line">            i++;</td></tr>
<tr><td class="num" id="LN247">247</td><td class="line">        }</td></tr>
<tr><td class="num" id="LN248">248</td><td class="line">        <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcasecmp(toks[i], <span class='string_literal'>"icmp_all"</span>))</td></tr>
<tr><td class="num" id="LN249">249</td><td class="line">        {</td></tr>
<tr><td class="num" id="LN250">250</td><td class="line">            flags |= (<span class='macro'>RESP_UNR_NET<span class='expansion'>0x04</span></span> | <span class='macro'>RESP_UNR_HOST<span class='expansion'>0x08</span></span> | <span class='macro'>RESP_UNR_PORT<span class='expansion'>0x10</span></span>);</td></tr>
<tr><td class="num" id="LN251">251</td><td class="line">            i++;</td></tr>
<tr><td class="num" id="LN252">252</td><td class="line">        }</td></tr>
<tr><td class="num" id="LN253">253</td><td class="line">        <span class='keyword'>else</span></td></tr>
<tr><td class="num" id="LN254">254</td><td class="line">            FatalError(<span class='string_literal'>"%s: %s(%d): invalid resp modifier: %s\n"</span>,</td></tr>
<tr><td class="num" id="LN255">255</td><td class="line">                <span class='macro'>MOD_NAME<span class='expansion'>"sp_resp3"</span></span>, file_name, file_line, toks[i]);</td></tr>
<tr><td class="num" id="LN256">256</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN257">257</td><td class="line"> </td></tr>
<tr><td class="num" id="LN258">258</td><td class="line">    mSplitFree(&amp;toks, num_toks);</td></tr>
<tr><td class="num" id="LN259">259</td><td class="line"> </td></tr>
<tr><td class="num" id="LN260">260</td><td class="line">    <span class='keyword'>if</span> ( !flags )</td></tr>
<tr><td class="num" id="LN261">261</td><td class="line">        FatalError(<span class='string_literal'>"%s: %s(%d): invalid resp configuration: %s\n"</span>,</td></tr>
<tr><td class="num" id="LN262">262</td><td class="line">            <span class='macro'>MOD_NAME<span class='expansion'>"sp_resp3"</span></span>, file_name, file_line, <span class='string_literal'>"no response specified"</span>);</td></tr>
<tr><td class="num" id="LN263">263</td><td class="line"> </td></tr>
<tr><td class="num" id="LN264">264</td><td class="line">    <span class='keyword'>return</span> flags;</td></tr>
<tr><td class="num" id="LN265">265</td><td class="line">}</td></tr>
<tr><td class="num" id="LN266">266</td><td class="line"> </td></tr>
<tr><td class="num" id="LN267">267</td><td class="line"><span class='comment'>//--------------------------------------------------------------------</span></td></tr>
<tr><td class="num" id="LN268">268</td><td class="line"> </td></tr>
<tr><td class="num" id="LN269">269</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>int</span> Resp3_Queue (Packet* p, <span class='keyword'>void</span>* pv)</td></tr>
<tr><td class="num" id="LN270">270</td><td class="line">{</td></tr>
<tr><td class="num" id="LN271">271</td><td class="line">    Resp3_Data* rd = (Resp3_Data*)pv;</td></tr>
<tr><td class="num" id="LN272">272</td><td class="line">    <span class='macro'>PROFILE_VARS<span class='expansion'>uint64_t snort_ticks_start, snort_ticks_end</span></span>;</td></tr>
<tr><td class="num" id="LN273">273</td><td class="line"> </td></tr>
<tr><td class="num" id="LN274">274</td><td class="line">    <span class='macro'>PREPROC_PROFILE_START(resp3PerfStats)<span class='expansion'>if (ScProfilePreprocs()) { resp3PerfStats.checks++; { uint32_t<br> a, d; __asm__ __volatile__ ("rdtsc" : "=a" (a), "=d" (d)); snort_ticks_start<br> = ((uint64_t)a) | (((uint64_t)d) &lt;&lt; 32); }; resp3PerfStats<br>.ticks_start = snort_ticks_start; }</span></span>;</td></tr>
<tr><td class="num" id="LN275">275</td><td class="line">    rd-&gt;flags = 0;</td></tr>
<tr><td class="num" id="LN276">276</td><td class="line"> </td></tr>
<tr><td class="num" id="LN277">277</td><td class="line">    <span class='keyword'>if</span> ( Active_IsRSTCandidate(p) )</td></tr>
<tr><td class="num" id="LN278">278</td><td class="line">        rd-&gt;flags |= (rd-&gt;mask &amp; <span class='macro'>RESP_RST<span class='expansion'>(0x01|0x02)</span></span>);</td></tr>
<tr><td class="num" id="LN279">279</td><td class="line"> </td></tr>
<tr><td class="num" id="LN280">280</td><td class="line">    <span class='keyword'>if</span> ( Active_IsUNRCandidate(p) )</td></tr>
<tr><td class="num" id="LN281">281</td><td class="line">        rd-&gt;flags |= (rd-&gt;mask &amp; <span class='macro'>RESP_UNR<span class='expansion'>(0x04|0x08|0x10)</span></span>);</td></tr>
<tr><td class="num" id="LN282">282</td><td class="line"> </td></tr>
<tr><td class="num" id="LN283">283</td><td class="line">    <span class='keyword'>if</span> ( rd-&gt;flags )</td></tr>
<tr><td class="num" id="LN284">284</td><td class="line">        Active_QueueResponse(Resp3_Send, rd);</td></tr>
<tr><td class="num" id="LN285">285</td><td class="line"> </td></tr>
<tr><td class="num" id="LN286">286</td><td class="line">    <span class='macro'>PREPROC_PROFILE_END(resp3PerfStats)<span class='expansion'>if (ScProfilePreprocs()) { { uint32_t a, d; __asm__ __volatile__<br> ("rdtsc" : "=a" (a), "=d" (d)); snort_ticks_end = ((uint64_t<br>)a) | (((uint64_t)d) &lt;&lt; 32); }; resp3PerfStats.exits++;<br> resp3PerfStats.ticks += snort_ticks_end - resp3PerfStats.ticks_start<br>; }</span></span>;</td></tr>
<tr><td class="num" id="LN287">287</td><td class="line">    <span class='keyword'>return</span> 0;</td></tr>
<tr><td class="num" id="LN288">288</td><td class="line">}</td></tr>
<tr><td class="num" id="LN289">289</td><td class="line"> </td></tr>
<tr><td class="num" id="LN290">290</td><td class="line"><span class='comment'>//--------------------------------------------------------------------</span></td></tr>
<tr><td class="num" id="LN291">291</td><td class="line"> </td></tr>
<tr><td class="num" id="LN292">292</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> Resp3_Send (Packet* p, <span class='keyword'>void</span>* pv)</td></tr>
<tr><td class="num" id="LN293">293</td><td class="line">{</td></tr>
<tr><td class="num" id="LN294">294</td><td class="line">    Resp3_Data* rd = (Resp3_Data*)pv;</td></tr>
<tr><td class="num" id="LN295">295</td><td class="line">    <span class='macro'>PROFILE_VARS<span class='expansion'>uint64_t snort_ticks_start, snort_ticks_end</span></span>;</td></tr>
<tr><td class="num" id="LN296">296</td><td class="line"> </td></tr>
<tr><td class="num" id="LN297">297</td><td class="line">    <span class='macro'>PREPROC_PROFILE_START(resp3PerfStats)<span class='expansion'>if (ScProfilePreprocs()) { resp3PerfStats.checks++; { uint32_t<br> a, d; __asm__ __volatile__ ("rdtsc" : "=a" (a), "=d" (d)); snort_ticks_start<br> = ((uint64_t)a) | (((uint64_t)d) &lt;&lt; 32); }; resp3PerfStats<br>.ticks_start = snort_ticks_start; }</span></span>;</td></tr>
<tr><td class="num" id="LN298">298</td><td class="line">    Active_IgnoreSession(p);</td></tr>
<tr><td class="num" id="LN299">299</td><td class="line"> </td></tr>
<tr><td class="num" id="LN300">300</td><td class="line">    <span class='keyword'>if</span> ( rd-&gt;flags &amp; <span class='macro'>RESP_RST_SND<span class='expansion'>0x01</span></span> )</td></tr>
<tr><td class="num" id="LN301">301</td><td class="line">        Active_SendReset(p, 0);</td></tr>
<tr><td class="num" id="LN302">302</td><td class="line"> </td></tr>
<tr><td class="num" id="LN303">303</td><td class="line">    <span class='keyword'>if</span> ( rd-&gt;flags &amp; <span class='macro'>RESP_RST_RCV<span class='expansion'>0x02</span></span> )</td></tr>
<tr><td class="num" id="LN304">304</td><td class="line">        Active_SendReset(p, <span class='macro'>ENC_FLAG_FWD<span class='expansion'>0x80000000</span></span>);</td></tr>
<tr><td class="num" id="LN305">305</td><td class="line"> </td></tr>
<tr><td class="num" id="LN306">306</td><td class="line">    <span class='keyword'>if</span> ( rd-&gt;flags &amp; <span class='macro'>RESP_UNR_NET<span class='expansion'>0x04</span></span> )</td></tr>
<tr><td class="num" id="LN307">307</td><td class="line">        Active_SendUnreach(p, ENC_UNR_NET);</td></tr>
<tr><td class="num" id="LN308">308</td><td class="line"> </td></tr>
<tr><td class="num" id="LN309">309</td><td class="line">    <span class='keyword'>if</span> ( rd-&gt;flags &amp; <span class='macro'>RESP_UNR_HOST<span class='expansion'>0x08</span></span> )</td></tr>
<tr><td class="num" id="LN310">310</td><td class="line">        Active_SendUnreach(p, ENC_UNR_HOST);</td></tr>
<tr><td class="num" id="LN311">311</td><td class="line"> </td></tr>
<tr><td class="num" id="LN312">312</td><td class="line">    <span class='keyword'>if</span> ( rd-&gt;flags &amp; <span class='macro'>RESP_UNR_PORT<span class='expansion'>0x10</span></span> )</td></tr>
<tr><td class="num" id="LN313">313</td><td class="line">        Active_SendUnreach(p, ENC_UNR_PORT);</td></tr>
<tr><td class="num" id="LN314">314</td><td class="line"> </td></tr>
<tr><td class="num" id="LN315">315</td><td class="line">    <span class='macro'>PREPROC_PROFILE_END(resp3PerfStats)<span class='expansion'>if (ScProfilePreprocs()) { { uint32_t a, d; __asm__ __volatile__<br> ("rdtsc" : "=a" (a), "=d" (d)); snort_ticks_end = ((uint64_t<br>)a) | (((uint64_t)d) &lt;&lt; 32); }; resp3PerfStats.exits++;<br> resp3PerfStats.ticks += snort_ticks_end - resp3PerfStats.ticks_start<br>; }</span></span>;</td></tr>
<tr><td class="num" id="LN316">316</td><td class="line">}</td></tr>
<tr><td class="num" id="LN317">317</td><td class="line"> </td></tr>
<tr><td class="num" id="LN318">318</td><td class="line"><span class='directive'>#endif // ENABLE_RESPONSE3</span></td></tr>
<tr><td class="num" id="LN319">319</td><td class="line"> </td></tr>
</table></body></html>
report-4349a0.html (text/html, 203.2 KB) - not displayed
report-eeddcc.html (text/html, 206.9 KB) - not displayed
report-062183.html (text/html, 80.5 KB)
<!doctype html>
<html>
<head>
<title>detection_options.c</title>
<style type="text/css">
 body { color:#000000; background-color:#ffffff }
 body { font-family:Helvetica, sans-serif; font-size:10pt }
 h1 { font-size:14pt }
 .code { border-collapse:collapse; width:100%; }
 .code { font-family: "Monospace", monospace; font-size:10pt }
 .code { line-height: 1.2em }
 .comment { color: green; font-style: oblique }
 .keyword { color: blue }
 .string_literal { color: red }
 .directive { color: darkmagenta }
 .expansion { display: none; }
 .macro:hover .expansion { display: block; border: 2px solid #FF0000; padding: 2px; background-color:#FFF0F0; font-weight: normal;   -webkit-border-radius:5px;  -webkit-box-shadow:1px 1px 7px #000; position: absolute; top: -1em; left:10em; z-index: 1 } 
 .macro { color: darkmagenta; background-color:LemonChiffon; position: relative }
 .num { width:2.5em; padding-right:2ex; background-color:#eeeeee }
 .num { text-align:right; font-size:8pt }
 .num { color:#444444 }
 .line { padding-left: 1ex; border-left: 3px solid #ccc }
 .line { white-space: pre }
 .msg { -webkit-box-shadow:1px 1px 7px #000 }
 .msg { -webkit-border-radius:5px }
 .msg { font-family:Helvetica, sans-serif; font-size:8pt }
 .msg { float:left }
 .msg { padding:0.25em 1ex 0.25em 1ex }
 .msg { margin-top:10px; margin-bottom:10px }
 .msg { font-weight:bold }
 .msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap }
 .msgT { padding:0x; spacing:0x }
 .msgEvent { background-color:#fff8b4; color:#000000 }
 .msgControl { background-color:#bbbbbb; color:#000000 }
 .mrange { background-color:#dfddf3 }
 .mrange { border-bottom:1px solid #6F9DBE }
 .PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; }
 .PathIndex { -webkit-border-radius:8px }
 .PathIndexEvent { background-color:#bfba87 }
 .PathIndexControl { background-color:#8c8c8c }
 .PathNav a { text-decoration:none; font-size: larger }
 .CodeInsertionHint { font-weight: bold; background-color: #10dd10 }
 .CodeRemovalHint { background-color:#de1010 }
 .CodeRemovalHint { border-bottom:1px solid #6F9DBE }
 table.simpletable {
   padding: 5px;
   font-size:12pt;
   margin:20px;
   border-collapse: collapse; border-spacing: 0px;
 }
 td.rowname {
   text-align:right; font-weight:bold; color:#444444;
   padding-right:2ex; }
</style>
</head>
<body>
<!-- BUGDESC The right operand of '-' is a garbage value -->

<!-- BUGTYPE Result of operation is garbage or undefined -->

<!-- BUGCATEGORY Logic error -->

<!-- BUGFILE /usr/local/src/snort-2.9.7.5/src/detection-plugins/detection_options.c -->

<!-- FILENAME detection_options.c -->

<!-- FUNCTIONNAME detection_option_node_evaluate -->

<!-- BUGLINE 1163 -->

<!-- BUGCOLUMN 13 -->

<!-- BUGPATHLENGTH 13 -->

<!-- BUGMETAEND -->
<!-- REPORTHEADER -->
<h3>Bug Summary</h3>
<table class="simpletable">
<tr><td class="rowname">File:</td><td>detection-plugins/detection_options.c</td></tr>
<tr><td class="rowname">Location:</td><td><a href="#EndPath">line 1163, column 13</a></td></tr>
<tr><td class="rowname">Description:</td><td>The right operand of '-' is a garbage value</td></tr>
</table>
<!-- REPORTSUMMARYEXTRA -->
<h3>Annotated Source Code</h3>
<table class="code">
<tr><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* $Id: detection_options.c,v 1.39 2015/04/23 18:28:09 jocornet Exp $ */</span></td></tr>
<tr><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/*</span></td></tr>
<tr><td class="num" id="LN3">3</td><td class="line"><span class='comment'>** Copyright (C) 2014-2015 Cisco and/or its affiliates. All rights reserved.</span></td></tr>
<tr><td class="num" id="LN4">4</td><td class="line"><span class='comment'>** Copyright (C) 2007-2013 Sourcefire, Inc.</span></td></tr>
<tr><td class="num" id="LN5">5</td><td class="line"><span class='comment'>**</span></td></tr>
<tr><td class="num" id="LN6">6</td><td class="line"><span class='comment'>** This program is free software; you can redistribute it and/or modify</span></td></tr>
<tr><td class="num" id="LN7">7</td><td class="line"><span class='comment'>** it under the terms of the GNU General Public License Version 2 as</span></td></tr>
<tr><td class="num" id="LN8">8</td><td class="line"><span class='comment'>** published by the Free Software Foundation.  You may not use, modify or</span></td></tr>
<tr><td class="num" id="LN9">9</td><td class="line"><span class='comment'>** distribute this program under any other version of the GNU General</span></td></tr>
<tr><td class="num" id="LN10">10</td><td class="line"><span class='comment'>** Public License.</span></td></tr>
<tr><td class="num" id="LN11">11</td><td class="line"><span class='comment'>**</span></td></tr>
<tr><td class="num" id="LN12">12</td><td class="line"><span class='comment'>** This program is distributed in the hope that it will be useful,</span></td></tr>
<tr><td class="num" id="LN13">13</td><td class="line"><span class='comment'>** but WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr>
<tr><td class="num" id="LN14">14</td><td class="line"><span class='comment'>** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span></td></tr>
<tr><td class="num" id="LN15">15</td><td class="line"><span class='comment'>** GNU General Public License for more details.</span></td></tr>
<tr><td class="num" id="LN16">16</td><td class="line"><span class='comment'>**</span></td></tr>
<tr><td class="num" id="LN17">17</td><td class="line"><span class='comment'>** You should have received a copy of the GNU General Public License</span></td></tr>
<tr><td class="num" id="LN18">18</td><td class="line"><span class='comment'>** along with this program; if not, write to the Free Software</span></td></tr>
<tr><td class="num" id="LN19">19</td><td class="line"><span class='comment'>** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span></td></tr>
<tr><td class="num" id="LN20">20</td><td class="line"><span class='comment'>**</span></td></tr>
<tr><td class="num" id="LN21">21</td><td class="line"><span class='comment'>**/</span></td></tr>
<tr><td class="num" id="LN22">22</td><td class="line"> </td></tr>
<tr><td class="num" id="LN23">23</td><td class="line"><span class='comment'>/**</span></td></tr>
<tr><td class="num" id="LN24">24</td><td class="line"><span class='comment'>**  @file        detection_options.c</span></td></tr>
<tr><td class="num" id="LN25">25</td><td class="line"><span class='comment'>**</span></td></tr>
<tr><td class="num" id="LN26">26</td><td class="line"><span class='comment'>**  @author      Steven Sturges</span></td></tr>
<tr><td class="num" id="LN27">27</td><td class="line"><span class='comment'>**</span></td></tr>
<tr><td class="num" id="LN28">28</td><td class="line"><span class='comment'>**  @brief       Support functions for rule option tree</span></td></tr>
<tr><td class="num" id="LN29">29</td><td class="line"><span class='comment'>**</span></td></tr>
<tr><td class="num" id="LN30">30</td><td class="line"><span class='comment'>**  This implements tree processing for rule options, evaluating common</span></td></tr>
<tr><td class="num" id="LN31">31</td><td class="line"><span class='comment'>**  detection options only once per pattern match.</span></td></tr>
<tr><td class="num" id="LN32">32</td><td class="line"><span class='comment'>**</span></td></tr>
<tr><td class="num" id="LN33">33</td><td class="line"><span class='comment'>*/</span></td></tr>
<tr><td class="num" id="LN34">34</td><td class="line"> </td></tr>
<tr><td class="num" id="LN35">35</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN36">36</td><td class="line"><span class='directive'>#include "config.h"</span></td></tr>
<tr><td class="num" id="LN37">37</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN38">38</td><td class="line"> </td></tr>
<tr><td class="num" id="LN39">39</td><td class="line"><span class='directive'>#include "sfutil/sfxhash.h"</span></td></tr>
<tr><td class="num" id="LN40">40</td><td class="line"><span class='directive'>#include "sfutil/sfhashfcn.h"</span></td></tr>
<tr><td class="num" id="LN41">41</td><td class="line"><span class='directive'>#include "detection_options.h"</span></td></tr>
<tr><td class="num" id="LN42">42</td><td class="line"><span class='directive'>#include "detection_util.h"</span></td></tr>
<tr><td class="num" id="LN43">43</td><td class="line"><span class='directive'>#include "rules.h"</span></td></tr>
<tr><td class="num" id="LN44">44</td><td class="line"><span class='directive'>#include "treenodes.h"</span></td></tr>
<tr><td class="num" id="LN45">45</td><td class="line"><span class='directive'>#include "util.h"</span></td></tr>
<tr><td class="num" id="LN46">46</td><td class="line"><span class='directive'>#include "fpcreate.h"</span></td></tr>
<tr><td class="num" id="LN47">47</td><td class="line"><span class='directive'>#include "parser.h"</span></td></tr>
<tr><td class="num" id="LN48">48</td><td class="line"> </td></tr>
<tr><td class="num" id="LN49">49</td><td class="line"><span class='directive'>#include "sp_asn1.h"</span></td></tr>
<tr><td class="num" id="LN50">50</td><td class="line"><span class='directive'>#include "sp_byte_check.h"</span></td></tr>
<tr><td class="num" id="LN51">51</td><td class="line"><span class='directive'>#include "sp_byte_jump.h"</span></td></tr>
<tr><td class="num" id="LN52">52</td><td class="line"><span class='directive'>#include "sp_byte_extract.h"</span></td></tr>
<tr><td class="num" id="LN53">53</td><td class="line"><span class='directive'>#include "sp_clientserver.h"</span></td></tr>
<tr><td class="num" id="LN54">54</td><td class="line"><span class='directive'>#include "sp_cvs.h"</span></td></tr>
<tr><td class="num" id="LN55">55</td><td class="line"><span class='directive'>#include "sp_dsize_check.h"</span></td></tr>
<tr><td class="num" id="LN56">56</td><td class="line"><span class='directive'>#include "sp_flowbits.h"</span></td></tr>
<tr><td class="num" id="LN57">57</td><td class="line"><span class='directive'>#include "sp_ftpbounce.h"</span></td></tr>
<tr><td class="num" id="LN58">58</td><td class="line"><span class='directive'>#include "sp_icmp_code_check.h"</span></td></tr>
<tr><td class="num" id="LN59">59</td><td class="line"><span class='directive'>#include "sp_icmp_id_check.h"</span></td></tr>
<tr><td class="num" id="LN60">60</td><td class="line"><span class='directive'>#include "sp_icmp_seq_check.h"</span></td></tr>
<tr><td class="num" id="LN61">61</td><td class="line"><span class='directive'>#include "sp_icmp_type_check.h"</span></td></tr>
<tr><td class="num" id="LN62">62</td><td class="line"><span class='directive'>#include "sp_ip_fragbits.h"</span></td></tr>
<tr><td class="num" id="LN63">63</td><td class="line"><span class='directive'>#include "sp_ip_id_check.h"</span></td></tr>
<tr><td class="num" id="LN64">64</td><td class="line"><span class='directive'>#include "sp_ipoption_check.h"</span></td></tr>
<tr><td class="num" id="LN65">65</td><td class="line"><span class='directive'>#include "sp_ip_proto.h"</span></td></tr>
<tr><td class="num" id="LN66">66</td><td class="line"><span class='directive'>#include "sp_ip_same_check.h"</span></td></tr>
<tr><td class="num" id="LN67">67</td><td class="line"><span class='directive'>#include "sp_ip_tos_check.h"</span></td></tr>
<tr><td class="num" id="LN68">68</td><td class="line"><span class='directive'>#include "sp_file_data.h"</span></td></tr>
<tr><td class="num" id="LN69">69</td><td class="line"><span class='directive'>#include "sp_base64_decode.h"</span></td></tr>
<tr><td class="num" id="LN70">70</td><td class="line"><span class='directive'>#include "sp_isdataat.h"</span></td></tr>
<tr><td class="num" id="LN71">71</td><td class="line"><span class='directive'>#include "sp_pattern_match.h"</span></td></tr>
<tr><td class="num" id="LN72">72</td><td class="line"><span class='directive'>#include "sp_pcre.h"</span></td></tr>
<tr><td class="num" id="LN73">73</td><td class="line"><span class='directive'>#ifdef <span class='macro'>ENABLE_REACT<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN74">74</td><td class="line"><span class='directive'>#include "sp_react.h"</span></td></tr>
<tr><td class="num" id="LN75">75</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN76">76</td><td class="line"><span class='directive'>#include "sp_replace.h"</span></td></tr>
<tr><td class="num" id="LN77">77</td><td class="line"><span class='directive'>#ifdef <span class='macro'>ENABLE_RESPOND<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN78">78</td><td class="line"><span class='directive'>#include "sp_respond.h"</span></td></tr>
<tr><td class="num" id="LN79">79</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN80">80</td><td class="line"><span class='directive'>#include "sp_rpc_check.h"</span></td></tr>
<tr><td class="num" id="LN81">81</td><td class="line"><span class='directive'>#include "sp_session.h"</span></td></tr>
<tr><td class="num" id="LN82">82</td><td class="line"><span class='directive'>#include "sp_tcp_ack_check.h"</span></td></tr>
<tr><td class="num" id="LN83">83</td><td class="line"><span class='directive'>#include "sp_tcp_flag_check.h"</span></td></tr>
<tr><td class="num" id="LN84">84</td><td class="line"><span class='directive'>#include "sp_tcp_seq_check.h"</span></td></tr>
<tr><td class="num" id="LN85">85</td><td class="line"><span class='directive'>#include "sp_tcp_win_check.h"</span></td></tr>
<tr><td class="num" id="LN86">86</td><td class="line"><span class='directive'>#include "sp_ttl_check.h"</span></td></tr>
<tr><td class="num" id="LN87">87</td><td class="line"><span class='directive'>#include "sp_urilen_check.h"</span></td></tr>
<tr><td class="num" id="LN88">88</td><td class="line"><span class='directive'>#include "sp_hdr_opt_wrap.h"</span></td></tr>
<tr><td class="num" id="LN89">89</td><td class="line"><span class='directive'># include "sp_file_type.h"</span></td></tr>
<tr><td class="num" id="LN90">90</td><td class="line"> </td></tr>
<tr><td class="num" id="LN91">91</td><td class="line"><span class='directive'>#include "sp_preprocopt.h"</span></td></tr>
<tr><td class="num" id="LN92">92</td><td class="line"><span class='directive'>#include "sp_dynamic.h"</span></td></tr>
<tr><td class="num" id="LN93">93</td><td class="line"> </td></tr>
<tr><td class="num" id="LN94">94</td><td class="line"><span class='directive'>#include "fpdetect.h"</span></td></tr>
<tr><td class="num" id="LN95">95</td><td class="line"><span class='directive'>#include "ppm.h"</span></td></tr>
<tr><td class="num" id="LN96">96</td><td class="line"><span class='directive'>#include "profiler.h"</span></td></tr>
<tr><td class="num" id="LN97">97</td><td class="line"><span class='directive'>#include "sfPolicy.h"</span></td></tr>
<tr><td class="num" id="LN98">98</td><td class="line"><span class='directive'>#include "detection_filter.h"</span></td></tr>
<tr><td class="num" id="LN99">99</td><td class="line"><span class='directive'>#include "encode.h"</span></td></tr>
<tr><td class="num" id="LN100">100</td><td class="line"><span class='directive'>#if defined(FEAT_OPEN_APPID)</span></td></tr>
<tr><td class="num" id="LN101">101</td><td class="line"><span class='directive'>#include "stream_common.h"</span></td></tr>
<tr><td class="num" id="LN102">102</td><td class="line"><span class='directive'>#include "sp_appid.h"</span></td></tr>
<tr><td class="num" id="LN103">103</td><td class="line"><span class='directive'>#endif /* defined(FEAT_OPEN_APPID) */</span></td></tr>
<tr><td class="num" id="LN104">104</td><td class="line"> </td></tr>
<tr><td class="num" id="LN105">105</td><td class="line"><span class='keyword'>typedef</span> <span class='keyword'>struct</span> _detection_option_key</td></tr>
<tr><td class="num" id="LN106">106</td><td class="line">{</td></tr>
<tr><td class="num" id="LN107">107</td><td class="line">    option_type_t option_type;</td></tr>
<tr><td class="num" id="LN108">108</td><td class="line">    <span class='keyword'>void</span> *option_data;</td></tr>
<tr><td class="num" id="LN109">109</td><td class="line">} detection_option_key_t;</td></tr>
<tr><td class="num" id="LN110">110</td><td class="line"> </td></tr>
<tr><td class="num" id="LN111">111</td><td class="line"><span class='directive'>#define <span class='macro'>HASH_RULE_OPTIONS<span class='expansion'>16384</span></span> 16384</span></td></tr>
<tr><td class="num" id="LN112">112</td><td class="line"><span class='directive'>#define <span class='macro'>HASH_RULE_TREE<span class='expansion'>8192</span></span> 8192</span></td></tr>
<tr><td class="num" id="LN113">113</td><td class="line"> </td></tr>
<tr><td class="num" id="LN114">114</td><td class="line">uint32_t detection_option_hash_func(SFHASHFCN *p, <span class='keyword'>unsigned</span> <span class='keyword'>char</span> *k, <span class='keyword'>int</span> n)</td></tr>
<tr><td class="num" id="LN115">115</td><td class="line">{</td></tr>
<tr><td class="num" id="LN116">116</td><td class="line">    uint32_t hash = 0;</td></tr>
<tr><td class="num" id="LN117">117</td><td class="line">    detection_option_key_t *key = (detection_option_key_t*)k;</td></tr>
<tr><td class="num" id="LN118">118</td><td class="line"> </td></tr>
<tr><td class="num" id="LN119">119</td><td class="line">    <span class='keyword'>switch</span> (key-&gt;option_type)</td></tr>
<tr><td class="num" id="LN120">120</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN121">121</td><td class="line">        <span class='comment'>/* Call hash function specific to the key type */</span></td></tr>
<tr><td class="num" id="LN122">122</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ASN1:</td></tr>
<tr><td class="num" id="LN123">123</td><td class="line">            hash = Asn1Hash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN124">124</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN125">125</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BYTE_TEST:</td></tr>
<tr><td class="num" id="LN126">126</td><td class="line">            hash = ByteTestHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN127">127</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN128">128</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BYTE_JUMP:</td></tr>
<tr><td class="num" id="LN129">129</td><td class="line">            hash = ByteJumpHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN130">130</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN131">131</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BYTE_EXTRACT:</td></tr>
<tr><td class="num" id="LN132">132</td><td class="line">            hash = ByteExtractHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN133">133</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN134">134</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FLOW:</td></tr>
<tr><td class="num" id="LN135">135</td><td class="line">            hash = FlowHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN136">136</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN137">137</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_CVS:</td></tr>
<tr><td class="num" id="LN138">138</td><td class="line">            hash = CvsHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN139">139</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN140">140</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_DSIZE:</td></tr>
<tr><td class="num" id="LN141">141</td><td class="line">            hash = DSizeCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN142">142</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN143">143</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FLOWBIT:</td></tr>
<tr><td class="num" id="LN144">144</td><td class="line">            hash = FlowBitsHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN145">145</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN146">146</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FTPBOUNCE:</td></tr>
<tr><td class="num" id="LN147">147</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN148">148</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FILE_DATA:</td></tr>
<tr><td class="num" id="LN149">149</td><td class="line">            hash = FileDataHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN150">150</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN151">151</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BASE64_DECODE:</td></tr>
<tr><td class="num" id="LN152">152</td><td class="line">            hash = Base64DecodeHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN153">153</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN154">154</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BASE64_DATA:</td></tr>
<tr><td class="num" id="LN155">155</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN156">156</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_PKT_DATA:</td></tr>
<tr><td class="num" id="LN157">157</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN158">158</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_CODE:</td></tr>
<tr><td class="num" id="LN159">159</td><td class="line">            hash = IcmpCodeCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN160">160</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN161">161</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_ID:</td></tr>
<tr><td class="num" id="LN162">162</td><td class="line">            hash = IcmpIdCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN163">163</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN164">164</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_SEQ:</td></tr>
<tr><td class="num" id="LN165">165</td><td class="line">            hash = IcmpSeqCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN166">166</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN167">167</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_TYPE:</td></tr>
<tr><td class="num" id="LN168">168</td><td class="line">            hash = IcmpTypeCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN169">169</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN170">170</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_FRAGBITS:</td></tr>
<tr><td class="num" id="LN171">171</td><td class="line">            hash = IpFragBitsCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN172">172</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN173">173</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_FRAG_OFFSET:</td></tr>
<tr><td class="num" id="LN174">174</td><td class="line">            hash = IpFragOffsetCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN175">175</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN176">176</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_ID:</td></tr>
<tr><td class="num" id="LN177">177</td><td class="line">            hash = IpIdCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN178">178</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN179">179</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_OPTION:</td></tr>
<tr><td class="num" id="LN180">180</td><td class="line">            hash = IpOptionCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN181">181</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN182">182</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_PROTO:</td></tr>
<tr><td class="num" id="LN183">183</td><td class="line">            hash = IpProtoCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN184">184</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN185">185</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_SAME:</td></tr>
<tr><td class="num" id="LN186">186</td><td class="line">            hash = IpSameCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN187">187</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN188">188</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_TOS:</td></tr>
<tr><td class="num" id="LN189">189</td><td class="line">            hash = IpTosCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN190">190</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN191">191</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IS_DATA_AT:</td></tr>
<tr><td class="num" id="LN192">192</td><td class="line">            hash = IsDataAtHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN193">193</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN194">194</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_CONTENT:</td></tr>
<tr><td class="num" id="LN195">195</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_CONTENT_URI:</td></tr>
<tr><td class="num" id="LN196">196</td><td class="line">            hash = PatternMatchHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN197">197</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN198">198</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_PCRE:</td></tr>
<tr><td class="num" id="LN199">199</td><td class="line">            hash = PcreHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN200">200</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN201">201</td><td class="line"><span class='directive'>#ifdef <span class='macro'>ENABLE_REACT<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN202">202</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_REACT:</td></tr>
<tr><td class="num" id="LN203">203</td><td class="line">            hash = ReactHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN204">204</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN205">205</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN206">206</td><td class="line"><span class='directive'>#ifdef <span class='macro'>ENABLE_RESPOND<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN207">207</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_RESPOND:</td></tr>
<tr><td class="num" id="LN208">208</td><td class="line">            hash = RespondHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN209">209</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN210">210</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN211">211</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_RPC_CHECK:</td></tr>
<tr><td class="num" id="LN212">212</td><td class="line">            hash = RpcCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN213">213</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN214">214</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_SESSION:</td></tr>
<tr><td class="num" id="LN215">215</td><td class="line">            hash = SessionHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN216">216</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN217">217</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_ACK:</td></tr>
<tr><td class="num" id="LN218">218</td><td class="line">            hash = TcpAckCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN219">219</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN220">220</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_FLAG:</td></tr>
<tr><td class="num" id="LN221">221</td><td class="line">            hash = TcpFlagCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN222">222</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN223">223</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_SEQ:</td></tr>
<tr><td class="num" id="LN224">224</td><td class="line">            hash = TcpSeqCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN225">225</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN226">226</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_WIN:</td></tr>
<tr><td class="num" id="LN227">227</td><td class="line">            hash = TcpWinCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN228">228</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN229">229</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TTL:</td></tr>
<tr><td class="num" id="LN230">230</td><td class="line">            hash = TtlCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN231">231</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN232">232</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_URILEN:</td></tr>
<tr><td class="num" id="LN233">233</td><td class="line">            hash = UriLenCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN234">234</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN235">235</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_HDR_OPT_CHECK:</td></tr>
<tr><td class="num" id="LN236">236</td><td class="line">            hash = HdrOptCheckHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN237">237</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN238">238</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FILE_TYPE:</td></tr>
<tr><td class="num" id="LN239">239</td><td class="line">            hash = FileTypeHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN240">240</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN241">241</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_PREPROCESSOR:</td></tr>
<tr><td class="num" id="LN242">242</td><td class="line">            hash = PreprocessorRuleOptionHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN243">243</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN244">244</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_DYNAMIC:</td></tr>
<tr><td class="num" id="LN245">245</td><td class="line">            hash = DynamicRuleHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN246">246</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN247">247</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_LEAF_NODE:</td></tr>
<tr><td class="num" id="LN248">248</td><td class="line">            hash = 0;</td></tr>
<tr><td class="num" id="LN249">249</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN250">250</td><td class="line"><span class='directive'>#if defined(FEAT_OPEN_APPID)</span></td></tr>
<tr><td class="num" id="LN251">251</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_APPID:</td></tr>
<tr><td class="num" id="LN252">252</td><td class="line">            hash = optionAppIdHash(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN253">253</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN254">254</td><td class="line"><span class='directive'>#endif /* defined(FEAT_OPEN_APPID) */</span></td></tr>
<tr><td class="num" id="LN255">255</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN256">256</td><td class="line"> </td></tr>
<tr><td class="num" id="LN257">257</td><td class="line">    <span class='keyword'>return</span> hash;</td></tr>
<tr><td class="num" id="LN258">258</td><td class="line">}</td></tr>
<tr><td class="num" id="LN259">259</td><td class="line"> </td></tr>
<tr><td class="num" id="LN260">260</td><td class="line"><span class='keyword'>int</span> detection_option_key_compare_func(<span class='keyword'>const</span> <span class='keyword'>void</span> *k1, <span class='keyword'>const</span> <span class='keyword'>void</span> *k2, size_t n)</td></tr>
<tr><td class="num" id="LN261">261</td><td class="line">{</td></tr>
<tr><td class="num" id="LN262">262</td><td class="line">    <span class='keyword'>int</span> ret = <span class='macro'>DETECTION_OPTION_NOT_EQUAL<span class='expansion'>1</span></span>;</td></tr>
<tr><td class="num" id="LN263">263</td><td class="line">    <span class='keyword'>const</span> detection_option_key_t *key1 = (detection_option_key_t*)k1;</td></tr>
<tr><td class="num" id="LN264">264</td><td class="line">    <span class='keyword'>const</span> detection_option_key_t *key2 = (detection_option_key_t*)k2;</td></tr>
<tr><td class="num" id="LN265">265</td><td class="line"> </td></tr>
<tr><td class="num" id="LN266">266</td><td class="line"><span class='directive'>#ifdef KEEP_THEM_ALLOCATED</span></td></tr>
<tr><td class="num" id="LN267">267</td><td class="line">    <span class='keyword'>return</span> <span class='macro'>DETECTION_OPTION_NOT_EQUAL<span class='expansion'>1</span></span>;</td></tr>
<tr><td class="num" id="LN268">268</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN269">269</td><td class="line"> </td></tr>
<tr><td class="num" id="LN270">270</td><td class="line">    <span class='keyword'>if</span> (!key1 || !key2)</td></tr>
<tr><td class="num" id="LN271">271</td><td class="line">        <span class='keyword'>return</span> <span class='macro'>DETECTION_OPTION_NOT_EQUAL<span class='expansion'>1</span></span>;</td></tr>
<tr><td class="num" id="LN272">272</td><td class="line"> </td></tr>
<tr><td class="num" id="LN273">273</td><td class="line">    <span class='keyword'>if</span> (key1-&gt;option_type != key2-&gt;option_type)</td></tr>
<tr><td class="num" id="LN274">274</td><td class="line">        <span class='keyword'>return</span> <span class='macro'>DETECTION_OPTION_NOT_EQUAL<span class='expansion'>1</span></span>;</td></tr>
<tr><td class="num" id="LN275">275</td><td class="line"> </td></tr>
<tr><td class="num" id="LN276">276</td><td class="line">    <span class='keyword'>switch</span> (key1-&gt;option_type)</td></tr>
<tr><td class="num" id="LN277">277</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN278">278</td><td class="line">        <span class='comment'>/* Call compare function specific to the key type */</span></td></tr>
<tr><td class="num" id="LN279">279</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_LEAF_NODE:</td></tr>
<tr><td class="num" id="LN280">280</td><td class="line">            <span class='comment'>/* Leaf node always not equal. */</span></td></tr>
<tr><td class="num" id="LN281">281</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN282">282</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ASN1:</td></tr>
<tr><td class="num" id="LN283">283</td><td class="line">            ret = Asn1Compare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN284">284</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN285">285</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BYTE_TEST:</td></tr>
<tr><td class="num" id="LN286">286</td><td class="line">            ret = ByteTestCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN287">287</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN288">288</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BYTE_JUMP:</td></tr>
<tr><td class="num" id="LN289">289</td><td class="line">            ret = ByteJumpCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN290">290</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN291">291</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BYTE_EXTRACT:</td></tr>
<tr><td class="num" id="LN292">292</td><td class="line">            ret = ByteExtractCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN293">293</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN294">294</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FLOW:</td></tr>
<tr><td class="num" id="LN295">295</td><td class="line">            ret = FlowCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN296">296</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN297">297</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_CVS:</td></tr>
<tr><td class="num" id="LN298">298</td><td class="line">            ret = CvsCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN299">299</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN300">300</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_DSIZE:</td></tr>
<tr><td class="num" id="LN301">301</td><td class="line">            ret = DSizeCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN302">302</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN303">303</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FLOWBIT:</td></tr>
<tr><td class="num" id="LN304">304</td><td class="line">            ret = FlowBitsCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN305">305</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN306">306</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FTPBOUNCE:</td></tr>
<tr><td class="num" id="LN307">307</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN308">308</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FILE_DATA:</td></tr>
<tr><td class="num" id="LN309">309</td><td class="line">            ret = FileDataCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN310">310</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN311">311</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BASE64_DECODE:</td></tr>
<tr><td class="num" id="LN312">312</td><td class="line">            ret = Base64DecodeCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN313">313</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN314">314</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BASE64_DATA:</td></tr>
<tr><td class="num" id="LN315">315</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN316">316</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_PKT_DATA:</td></tr>
<tr><td class="num" id="LN317">317</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN318">318</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_CODE:</td></tr>
<tr><td class="num" id="LN319">319</td><td class="line">            ret = IcmpCodeCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN320">320</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN321">321</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_ID:</td></tr>
<tr><td class="num" id="LN322">322</td><td class="line">            ret = IcmpIdCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN323">323</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN324">324</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_SEQ:</td></tr>
<tr><td class="num" id="LN325">325</td><td class="line">            ret = IcmpSeqCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN326">326</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN327">327</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_TYPE:</td></tr>
<tr><td class="num" id="LN328">328</td><td class="line">            ret = IcmpTypeCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN329">329</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN330">330</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_FRAGBITS:</td></tr>
<tr><td class="num" id="LN331">331</td><td class="line">            ret = IpFragBitsCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN332">332</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN333">333</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_FRAG_OFFSET:</td></tr>
<tr><td class="num" id="LN334">334</td><td class="line">            ret = IpFragOffsetCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN335">335</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN336">336</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_ID:</td></tr>
<tr><td class="num" id="LN337">337</td><td class="line">            ret = IpIdCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN338">338</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN339">339</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_OPTION:</td></tr>
<tr><td class="num" id="LN340">340</td><td class="line">            ret = IpOptionCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN341">341</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN342">342</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_PROTO:</td></tr>
<tr><td class="num" id="LN343">343</td><td class="line">            ret = IpProtoCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN344">344</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN345">345</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_SAME:</td></tr>
<tr><td class="num" id="LN346">346</td><td class="line">            ret = IpSameCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN347">347</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN348">348</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_TOS:</td></tr>
<tr><td class="num" id="LN349">349</td><td class="line">            ret = IpTosCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN350">350</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN351">351</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IS_DATA_AT:</td></tr>
<tr><td class="num" id="LN352">352</td><td class="line">            ret = IsDataAtCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN353">353</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN354">354</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_CONTENT:</td></tr>
<tr><td class="num" id="LN355">355</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_CONTENT_URI:</td></tr>
<tr><td class="num" id="LN356">356</td><td class="line">            ret = PatternMatchCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN357">357</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN358">358</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_PCRE:</td></tr>
<tr><td class="num" id="LN359">359</td><td class="line">            ret = PcreCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN360">360</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN361">361</td><td class="line"><span class='directive'>#ifdef <span class='macro'>ENABLE_REACT<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN362">362</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_REACT:</td></tr>
<tr><td class="num" id="LN363">363</td><td class="line">            ret = ReactCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN364">364</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN365">365</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN366">366</td><td class="line"><span class='directive'>#ifdef <span class='macro'>ENABLE_RESPOND<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN367">367</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_RESPOND:</td></tr>
<tr><td class="num" id="LN368">368</td><td class="line">            ret = RespondCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN369">369</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN370">370</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN371">371</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_RPC_CHECK:</td></tr>
<tr><td class="num" id="LN372">372</td><td class="line">            ret = RpcCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN373">373</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN374">374</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_SESSION:</td></tr>
<tr><td class="num" id="LN375">375</td><td class="line">            ret = SessionCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN376">376</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN377">377</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_ACK:</td></tr>
<tr><td class="num" id="LN378">378</td><td class="line">            ret = TcpAckCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN379">379</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN380">380</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_FLAG:</td></tr>
<tr><td class="num" id="LN381">381</td><td class="line">            ret = TcpFlagCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN382">382</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN383">383</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_SEQ:</td></tr>
<tr><td class="num" id="LN384">384</td><td class="line">            ret = TcpSeqCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN385">385</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN386">386</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_WIN:</td></tr>
<tr><td class="num" id="LN387">387</td><td class="line">            ret = TcpWinCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN388">388</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN389">389</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TTL:</td></tr>
<tr><td class="num" id="LN390">390</td><td class="line">            ret = TtlCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN391">391</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN392">392</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_URILEN:</td></tr>
<tr><td class="num" id="LN393">393</td><td class="line">            ret = UriLenCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN394">394</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN395">395</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_HDR_OPT_CHECK:</td></tr>
<tr><td class="num" id="LN396">396</td><td class="line">            ret = HdrOptCheckCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN397">397</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN398">398</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FILE_TYPE:</td></tr>
<tr><td class="num" id="LN399">399</td><td class="line">            ret = FileTypeCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN400">400</td><td class="line">            <span class='keyword'>break</span>; </td></tr>
<tr><td class="num" id="LN401">401</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_PREPROCESSOR:</td></tr>
<tr><td class="num" id="LN402">402</td><td class="line">            ret = PreprocessorRuleOptionCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN403">403</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN404">404</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_DYNAMIC:</td></tr>
<tr><td class="num" id="LN405">405</td><td class="line">            ret = DynamicRuleCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN406">406</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN407">407</td><td class="line"><span class='directive'>#if defined(FEAT_OPEN_APPID)</span></td></tr>
<tr><td class="num" id="LN408">408</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_APPID:</td></tr>
<tr><td class="num" id="LN409">409</td><td class="line">            ret = optionAppIdCompare(key1-&gt;option_data, key2-&gt;option_data);</td></tr>
<tr><td class="num" id="LN410">410</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN411">411</td><td class="line"><span class='directive'>#endif /* defined(FEAT_OPEN_APPID) */</span></td></tr>
<tr><td class="num" id="LN412">412</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN413">413</td><td class="line"> </td></tr>
<tr><td class="num" id="LN414">414</td><td class="line">    <span class='keyword'>return</span> ret;</td></tr>
<tr><td class="num" id="LN415">415</td><td class="line">}</td></tr>
<tr><td class="num" id="LN416">416</td><td class="line"> </td></tr>
<tr><td class="num" id="LN417">417</td><td class="line"><span class='keyword'>int</span> detection_hash_free_func(<span class='keyword'>void</span> *option_key, <span class='keyword'>void</span> *data)</td></tr>
<tr><td class="num" id="LN418">418</td><td class="line">{</td></tr>
<tr><td class="num" id="LN419">419</td><td class="line">    detection_option_key_t *key = (detection_option_key_t*)option_key;</td></tr>
<tr><td class="num" id="LN420">420</td><td class="line"> </td></tr>
<tr><td class="num" id="LN421">421</td><td class="line">    <span class='keyword'>switch</span> (key-&gt;option_type)</td></tr>
<tr><td class="num" id="LN422">422</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN423">423</td><td class="line">        <span class='comment'>/* Call free function specific to the key type */</span></td></tr>
<tr><td class="num" id="LN424">424</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ASN1:</td></tr>
<tr><td class="num" id="LN425">425</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN426">426</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN427">427</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BYTE_TEST:</td></tr>
<tr><td class="num" id="LN428">428</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN429">429</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN430">430</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BYTE_JUMP:</td></tr>
<tr><td class="num" id="LN431">431</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN432">432</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN433">433</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BYTE_EXTRACT:</td></tr>
<tr><td class="num" id="LN434">434</td><td class="line">            ByteExtractFree(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN435">435</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN436">436</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FLOW:</td></tr>
<tr><td class="num" id="LN437">437</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN438">438</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN439">439</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_CVS:</td></tr>
<tr><td class="num" id="LN440">440</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN441">441</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN442">442</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_DSIZE:</td></tr>
<tr><td class="num" id="LN443">443</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN444">444</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN445">445</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FLOWBIT:</td></tr>
<tr><td class="num" id="LN446">446</td><td class="line">            FlowBitsFree(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN447">447</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN448">448</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FTPBOUNCE:</td></tr>
<tr><td class="num" id="LN449">449</td><td class="line">            <span class='comment'>/* Data is NULL, nothing to free */</span></td></tr>
<tr><td class="num" id="LN450">450</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN451">451</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FILE_DATA:</td></tr>
<tr><td class="num" id="LN452">452</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN453">453</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN454">454</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BASE64_DECODE:</td></tr>
<tr><td class="num" id="LN455">455</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN456">456</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN457">457</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_BASE64_DATA:</td></tr>
<tr><td class="num" id="LN458">458</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN459">459</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_PKT_DATA:</td></tr>
<tr><td class="num" id="LN460">460</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN461">461</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_CODE:</td></tr>
<tr><td class="num" id="LN462">462</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN463">463</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN464">464</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_ID:</td></tr>
<tr><td class="num" id="LN465">465</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN466">466</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN467">467</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_SEQ:</td></tr>
<tr><td class="num" id="LN468">468</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN469">469</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN470">470</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_ICMP_TYPE:</td></tr>
<tr><td class="num" id="LN471">471</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN472">472</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN473">473</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_FRAGBITS:</td></tr>
<tr><td class="num" id="LN474">474</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN475">475</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN476">476</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_FRAG_OFFSET:</td></tr>
<tr><td class="num" id="LN477">477</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN478">478</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN479">479</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_ID:</td></tr>
<tr><td class="num" id="LN480">480</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN481">481</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN482">482</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_OPTION:</td></tr>
<tr><td class="num" id="LN483">483</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN484">484</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN485">485</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_PROTO:</td></tr>
<tr><td class="num" id="LN486">486</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN487">487</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN488">488</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_SAME:</td></tr>
<tr><td class="num" id="LN489">489</td><td class="line">            <span class='comment'>/* Data is NULL, nothing to free */</span></td></tr>
<tr><td class="num" id="LN490">490</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN491">491</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IP_TOS:</td></tr>
<tr><td class="num" id="LN492">492</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN493">493</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN494">494</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_IS_DATA_AT:</td></tr>
<tr><td class="num" id="LN495">495</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN496">496</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN497">497</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_CONTENT:</td></tr>
<tr><td class="num" id="LN498">498</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_CONTENT_URI:</td></tr>
<tr><td class="num" id="LN499">499</td><td class="line">            PatternMatchFree(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN500">500</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN501">501</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_PCRE:</td></tr>
<tr><td class="num" id="LN502">502</td><td class="line">            PcreFree(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN503">503</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN504">504</td><td class="line"><span class='directive'>#ifdef <span class='macro'>ENABLE_REACT<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN505">505</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_REACT:</td></tr>
<tr><td class="num" id="LN506">506</td><td class="line">            ReactFree(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN507">507</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN508">508</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN509">509</td><td class="line"><span class='directive'>#ifdef <span class='macro'>ENABLE_RESPOND<span class='expansion'>1</span></span></span></td></tr>
<tr><td class="num" id="LN510">510</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_RESPOND:</td></tr>
<tr><td class="num" id="LN511">511</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN512">512</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN513">513</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN514">514</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_RPC_CHECK:</td></tr>
<tr><td class="num" id="LN515">515</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN516">516</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN517">517</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_SESSION:</td></tr>
<tr><td class="num" id="LN518">518</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN519">519</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN520">520</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_ACK:</td></tr>
<tr><td class="num" id="LN521">521</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN522">522</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN523">523</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_FLAG:</td></tr>
<tr><td class="num" id="LN524">524</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN525">525</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN526">526</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_SEQ:</td></tr>
<tr><td class="num" id="LN527">527</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN528">528</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN529">529</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TCP_WIN:</td></tr>
<tr><td class="num" id="LN530">530</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN531">531</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN532">532</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_TTL:</td></tr>
<tr><td class="num" id="LN533">533</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN534">534</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN535">535</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_URILEN:</td></tr>
<tr><td class="num" id="LN536">536</td><td class="line">            free(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN537">537</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN538">538</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_HDR_OPT_CHECK:</td></tr>
<tr><td class="num" id="LN539">539</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN540">540</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_FILE_TYPE:</td></tr>
<tr><td class="num" id="LN541">541</td><td class="line">            FileTypeFree(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN542">542</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN543">543</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_PREPROCESSOR:</td></tr>
<tr><td class="num" id="LN544">544</td><td class="line">            PreprocessorRuleOptionsFreeFunc(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN545">545</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN546">546</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_DYNAMIC:</td></tr>
<tr><td class="num" id="LN547">547</td><td class="line">            fpDynamicDataFree(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN548">548</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN549">549</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_LEAF_NODE:</td></tr>
<tr><td class="num" id="LN550">550</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN551">551</td><td class="line"><span class='directive'>#if defined(FEAT_OPEN_APPID)</span></td></tr>
<tr><td class="num" id="LN552">552</td><td class="line">        <span class='keyword'>case</span> RULE_OPTION_TYPE_APPID:</td></tr>
<tr><td class="num" id="LN553">553</td><td class="line">            optionAppIdFree(key-&gt;option_data);</td></tr>
<tr><td class="num" id="LN554">554</td><td class="line">            <span class='keyword'>break</span>;</td></tr>
<tr><td class="num" id="LN555">555</td><td class="line"><span class='directive'>#endif /* defined(FEAT_OPEN_APPID) */</span></td></tr>
<tr><td class="num" id="LN556">556</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN557">557</td><td class="line">    <span class='keyword'>return</span> 0;</td></tr>
<tr><td class="num" id="LN558">558</td><td class="line">}</td></tr>
<tr><td class="num" id="LN559">559</td><td class="line"> </td></tr>
<tr><td class="num" id="LN560">560</td><td class="line">SFXHASH * DetectionHashTableNew(<span class='keyword'>void</span>)</td></tr>
<tr><td class="num" id="LN561">561</td><td class="line">{</td></tr>
<tr><td class="num" id="LN562">562</td><td class="line">    SFXHASH *doht = sfxhash_new(<span class='macro'>HASH_RULE_OPTIONS<span class='expansion'>16384</span></span>,</td></tr>
<tr><td class="num" id="LN563">563</td><td class="line">                                <span class='keyword'>sizeof</span>(detection_option_key_t),</td></tr>
<tr><td class="num" id="LN564">564</td><td class="line">                                0,      <span class='comment'>/* Data size == 0, just store the ptr */</span></td></tr>
<tr><td class="num" id="LN565">565</td><td class="line">                                0,      <span class='comment'>/* Memcap */</span></td></tr>
<tr><td class="num" id="LN566">566</td><td class="line">                                0,      <span class='comment'>/* Auto node recovery */</span></td></tr>
<tr><td class="num" id="LN567">567</td><td class="line">                                <span class='macro'>NULL<span class='expansion'>((void*)0)</span></span>,   <span class='comment'>/* Auto free function */</span></td></tr>
<tr><td class="num" id="LN568">568</td><td class="line">                                detection_hash_free_func,   <span class='comment'>/* User free function */</span></td></tr>
<tr><td class="num" id="LN569">569</td><td class="line">                                1);     <span class='comment'>/* Recycle nodes */</span></td></tr>
<tr><td class="num" id="LN570">570</td><td class="line"> </td></tr>
<tr><td class="num" id="LN571">571</td><td class="line"> </td></tr>
<tr><td class="num" id="LN572">572</td><td class="line">    <span class='keyword'>if</span> (doht == <span class='macro'>NULL<span class='expansion'>((void*)0)</span></span>)</td></tr>
<tr><td class="num" id="LN573">573</td><td class="line">        FatalError(<span class='string_literal'>"Failed to create rule detection option hash table"</span>);</td></tr>
<tr><td class="num" id="LN574">574</td><td class="line"> </td></tr>
<tr><td class="num" id="LN575">575</td><td class="line">    sfxhash_set_keyops(doht, detection_option_hash_func,</td></tr>
<tr><td class="num" id="LN576">576</td><td class="line">                       detection_option_key_compare_func);</td></tr>
<tr><td class="num" id="LN577">577</td><td class="line"> </td></tr>
<tr><td class="num" id="LN578">578</td><td class="line">    <span class='keyword'>return</span> doht;</td></tr>
<tr><td class="num" id="LN579">579</td><td class="line">}</td></tr>
<tr><td class="num" id="LN580">580</td><td class="line"> </td></tr>
<tr><td class="num" id="LN581">581</td><td class="line"><span class='keyword'>void</span> DetectionHashTableFree(SFXHASH *doht)</td></tr>
<tr><td class="num" id="LN582">582</td><td class="line">{</td></tr>
<tr><td class="num" id="LN583">583</td><td class="line">    <span class='keyword'>if</span> (doht != <span class='macro'>NULL<span class='expansion'>((void*)0)</span></span>)</td></tr>
<tr><td class="num" id="LN584">584</td><td class="line">        sfxhash_delete(doht);</td></tr>
<tr><td class="num" id="LN585">585</td><td class="line">}</td></tr>
<tr><td class="num" id="LN586">586</td><td class="line"> </td></tr>
<tr><td class="num" id="LN587">587</td><td class="line"><span class='keyword'>int</span> add_detection_option(<span class='keyword'>struct</span> _SnortConfig *sc, option_type_t type, <span class='keyword'>void</span> *option_data, <span class='keyword'>void</span> **existing_data)</td></tr>
<tr><td class="num" id="LN588">588</td><td class="line">{</td></tr>
<tr><td class="num" id="LN589">589</td><td class="line">    detection_option_key_t key;</td></tr>
<tr><td class="num" id="LN590">590</td><td class="line"> </td></tr>
<tr><td class="num" id="LN591">591</td><td class="line">    <span class='keyword'>if</span> (sc == <span class='macro'>NULL<span class='expansion'>((void*)0)</span></span>)</td></tr>
<tr><td class="num" id="LN592">592</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN593">593</td><td class="line">        FatalError(<span class='string_literal'>"%s(%d) Snort config is NULL.\n"</span>,</td></tr>
<tr><td class="num" id="LN594">594</td><td class="line">                   <span class='macro'>__FILE__<span class='expansion'>"detection_options.c"</span></span>, <span class='macro'>__LINE__<span class='expansion'>594</span></span>);</td></tr>
<tr><td class="num" id="LN595">595</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN596">596</td><td class="line"> </td></tr>
<tr><td class="num" id="LN597">597</td><td class="line">    <span class='keyword'>if</span> (sc-&gt;detection_option_hash_table == <span class='macro'>NULL<span class='expansion'>((void*)0)</span></span>)</td></tr>
<tr><td class="num" id="LN598">598</td><td class="line">        sc-&gt;detection_option_hash_table = DetectionHashTableNew();</td></tr>
<tr><td class="num" id="LN599">599</td><td class="line"> </td></tr>
<tr><td class="num" id="LN600">600</td><td class="line">    <span class='keyword'>if</span> (!option_data)</td></tr>
<tr><td class="num" id="LN601">601</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN602">602</td><td class="line">        <span class='comment'>/* No option data, no conflict to resolve. */</span></td></tr>
<tr><td class="num" id="LN603">603</td><td class="line">        <span class='keyword'>return</span> <span class='macro'>DETECTION_OPTION_EQUAL<span class='expansion'>0</span></span>;</td></tr>
<tr><td class="num" id="LN604">604</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN605">605</td><td class="line"> </td></tr>
<tr><td class="num" id="LN606">606</td><td class="line">    key.option_type = type;</td></tr>
<tr><td class="num" id="LN607">607</td><td class="line">    key.option_data = option_data;</td></tr>
<tr><td class="num" id="LN608">608</td><td class="line"> </td></tr>
<tr><td class="num" id="LN609">609</td><td class="line">    *existing_data = sfxhash_find(sc-&gt;detection_option_hash_table, &amp;key);</td></tr>
<tr><td class="num" id="LN610">610</td><td class="line">    <span class='keyword'>if</span> (*existing_data)</td></tr>
<tr><td class="num" id="LN611">611</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN612">612</td><td class="line">        <span class='keyword'>return</span> <span class='macro'>DETECTION_OPTION_EQUAL<span class='expansion'>0</span></span>;</td></tr>
<tr><td class="num" id="LN613">613</td><td class="line">    }</td></tr>
<tr><td class="num" id="LN614">614</td><td class="line"> </td></tr>
<tr><td class="num" id="LN615">615</td><td class="line">    sfxhash_add(sc-&gt;detection_option_hash_table, &amp;key, option_data);</td></tr>
<tr><td class="num" id="LN616">616</td><td class="line">    <span class='keyword'>return</span> <span class='macro'>DETECTION_OPTION_NOT_EQUAL<span class='expansion'>1</span></span>;</td></tr>
<tr><td class="num" id="LN617">617</td><td class="line">}</td></tr>
<tr><td class="num" id="LN618">618</td><td class="line"> </td></tr>
<tr><td class="num" id="LN619">619</td><td class="line">uint32_t detection_option_tree_hash(detection_option_tree_node_t *node)</td></tr>
<tr><td class="num" id="LN620">620</td><td class="line">{</td></tr>
<tr><td class="num" id="LN621">621</td><td class="line">    uint32_t a,b,c;</td></tr>
<tr><td class="num" id="LN622">622</td><td class="line">    <span class='keyword'>int</span> i;</td></tr>
<tr><td class="num" id="LN623">623</td><td class="line"> </td></tr>
<tr><td class="num" id="LN624">624</td><td class="line">    <span class='keyword'>if</span> (!node)</td></tr>
<tr><td class="num" id="LN625">625</td><td class="line">        <span class='keyword'>return</span> 0;</td></tr>
<tr><td class="num" id="LN626">626</td><td class="line"> </td></tr>
<tr><td class="num" id="LN627">627</td><td class="line">    a = b = c = 0;</td></tr>
<tr><td class="num" id="LN628">628</td><td class="line"> </td></tr>
<tr><td class="num" id="LN629">629</td><td class="line">    <span class='keyword'>for</span> (i=0;i&lt;node-&gt;num_children;i++)</td></tr>
<tr><td class="num" id="LN630">630</td><td class="line">    {</td></tr>
<tr><td class="num" id="LN631">631</td><td class="line"><span class='directive'>#if (defined(__ia64) || defined(<span class='macro'>__amd64<span class='expansion'>1</span></span>) || defined(<span class='macro'>_LP64<span class='expansion'>1</span></span>))</span></td></tr>
<tr><td class="num" id="LN632">632</td><td class="line">        {</td></tr>
<tr><td class="num" id="LN633">633</td><td class="line">            <span class='comment'>/* Cleanup warning because of cast from 64bit ptr to 32bit int</span></td></tr>
<tr><td class="num" id="LN634">634</td><td class="line">             <span class='comment'>* warning on 64bit OSs */</span></td></tr>
<tr><td class="num" id="LN635">635</td><td class="line">            uint64_t ptr; <span class='comment'>/* Addresses are 64bits */</span></td></tr>
<tr><td class="num" id="LN636">636</td><td class="line">            ptr = (uint64_t)node-&gt;children[i]-&gt;option_data;</td></tr>
<tr><td class="num" id="LN637">637</td><td class="line">            a += (ptr &gt;&gt; 32);</td></tr>
<tr><td class="num" id="LN638">638</td><td class="line">            b += (ptr &amp; 0xFFFFFFFF);</td></tr>
<tr><td class="num" id="LN639">639</td><td class="line">        }</td></tr>
<tr><td class="num" id="LN640">640</td><td class="line"><span class='directive'>#else</span></td></tr>
<tr><td class="num" id="LN641">641</td><td class="line">        a += (uint32_t)node-&gt;children[i]-&gt;option_data;</td></tr>
<tr><td class="num" id="LN642">642</td><td class="line">        b += 0;</td></tr>
<tr><td class="num" id="LN643">643</td><td class="line"><span class='directive'>#endif</span></td></tr>
<tr><td class="num" id="LN644">644</td><td class="line">        c += detection_option_tree_hash(node-&gt;children[i]);</td></tr>
<tr><td class=
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.