public:
Endianness() = default;
virtual ~Endianness() { }
- virtual bool get_offset_endianness(int32_t offset, int8_t& endian) = 0;
+ virtual bool get_offset_endianness(int32_t offset, uint8_t& endian) = 0;
};
#endif
#include "extract.h"
+#include "log/messages.h"
#include "utils/snort_bounds.h"
#include "utils/util_cstring.h"
+void set_byte_order(uint8_t& order, uint8_t flag, const char* opt)
+{
+ if ( order )
+ ParseWarning(WARN_RULES, "%s specifies multiple byte orders, using last", opt);
+
+ order = flag;
+}
+
#define TEXTLEN (PARSELEN + 1)
/**
#include "main/snort_types.h"
-#define ENDIAN_BIG 0x0
-#define ENDIAN_LITTLE 0x1
-#define ENDIAN_FUNC 0x2
+#define ENDIAN_BIG 0x1
+#define ENDIAN_LITTLE 0x2
+#define ENDIAN_FUNC 0x4
#define PARSELEN 10
int endianess, int bytes_to_grab, const uint8_t* ptr,
const uint8_t* start, const uint8_t* end, uint32_t* value);
+SO_PUBLIC void set_byte_order(uint8_t& order, uint8_t flag, const char* opt);
+
#endif
uint8_t relative_flag;
uint8_t data_string_convert_flag;
uint8_t align;
- int8_t endianess;
+ uint8_t endianess;
uint32_t base;
uint32_t multiplier;
int8_t var_number;
if (ptr < start || ptr >= end)
return DETECTION_OPTION_NO_MATCH;
- int8_t endian = data->endianess;
+ uint8_t endian = data->endianess;
if (data->endianess == ENDIAN_FUNC)
{
if (!p->endianness ||
"argument.");
return false;
}
- unsigned e1 = ffs(data->endianess);
- unsigned e2 = ffs(data->endianess >> e1);
-
- if ( e1 && e2 )
- {
- ParseError("byte_extract rule option has multiple arguments "
- "specifying endianness. Use only "
- "one of 'big', 'little', or 'dce'.");
- return false;
- }
return true;
}
bool ExtractModule::end(const char*, int, SnortConfig*)
{
+ if ( !data.endianess )
+ data.endianess = ENDIAN_BIG;
return ByteExtractVerify(&data);
}
data.multiplier = v.get_long();
else if ( v.is("big") )
- data.endianess |= ENDIAN_BIG;
+ set_byte_order(data.endianess, ENDIAN_BIG, "byte_extract");
else if ( v.is("little") )
- data.endianess |= ENDIAN_LITTLE;
+ set_byte_order(data.endianess, ENDIAN_LITTLE, "byte_extract");
else if ( v.is("dce") )
- data.endianess |= ENDIAN_FUNC;
+ set_byte_order(data.endianess, ENDIAN_FUNC, "byte_extract");
else if ( v.is("string") )
{
uint8_t data_string_convert_flag;
uint8_t from_beginning_flag;
uint8_t align_flag;
- int8_t endianess;
+ uint8_t endianess;
uint32_t base;
uint32_t multiplier;
int32_t post_offset;
uint32_t jump = 0;
uint32_t payload_bytes_grabbed = 0;
- int8_t endian = bjd->endianess;
+ uint8_t endian = bjd->endianess;
if (endian == ENDIAN_FUNC)
{
if (!p->endianness ||
return false;
}
}
- unsigned e1 = ffs(data.endianess);
- unsigned e2 = ffs(data.endianess >> e1);
-
- if ( e1 && e2 )
- {
- ParseError("byte_jump has multiple arguments "
- "specifying endianness. Use only "
- "one of 'big', 'little', or 'dce'.");
- return false;
- }
+ if ( !data.endianess )
+ data.endianess = ENDIAN_BIG;
return true;
}
data.post_offset = v.get_long();
else if ( v.is("big") )
- data.endianess |= ENDIAN_BIG;
+ set_byte_order(data.endianess, ENDIAN_BIG, "byte_jump");
else if ( v.is("little") )
- data.endianess |= ENDIAN_LITTLE;
+ set_byte_order(data.endianess, ENDIAN_LITTLE, "byte_jump");
else if ( v.is("dce") )
- data.endianess |= ENDIAN_FUNC;
+ set_byte_order(data.endianess, ENDIAN_FUNC, "byte_jump");
else if ( v.is("string") )
{
uint8_t not_flag;
uint8_t relative_flag;
uint8_t data_string_convert_flag;
- int8_t endianess;
+ uint8_t endianess;
uint32_t base;
int8_t cmp_value_var;
int8_t offset_var;
const uint8_t* start_ptr = btd->relative_flag ? c.start() : c.buffer();
start_ptr += offset;
- int8_t endian = btd->endianess;
+ uint8_t endian = btd->endianess;
if (endian == ENDIAN_FUNC)
{
if (!p->endianness ||
return false;
}
}
- unsigned e1 = ffs(data.endianess);
- unsigned e2 = ffs(data.endianess >> e1);
-
- if ( e1 && e2 )
- {
- ParseError("byte_test has multiple arguments "
- "specifying endianness. Use only "
- "one of 'big', 'little', or 'dce'.");
- return false;
- }
+ if ( !data.endianess )
+ data.endianess = ENDIAN_BIG;
return true;
}
data.relative_flag = 1;
else if ( v.is("big") )
- data.endianess |= ENDIAN_BIG;
+ set_byte_order(data.endianess, ENDIAN_BIG, "byte_test");
else if ( v.is("little") )
- data.endianess |= ENDIAN_LITTLE;
+ set_byte_order(data.endianess, ENDIAN_LITTLE, "byte_test");
else if ( v.is("dce") )
- data.endianess |= ENDIAN_FUNC;
+ set_byte_order(data.endianess, ENDIAN_FUNC, "byte_test");
else if ( v.is("string") )
{
stub_data_offset = DCE2_SENTINEL;
}
-bool DceEndianness::get_offset_endianness(int32_t offset, int8_t& endian)
+bool DceEndianness::get_offset_endianness(int32_t offset, uint8_t& endian)
{
int byte_order;
public:
DceEndianness();
- virtual bool get_offset_endianness(int32_t offset, int8_t& endian);
+ virtual bool get_offset_endianness(int32_t offset, uint8_t& endian);
void reset();
};