*/
_PUBLIC_ void dump_data_skip_zeros(int level, const uint8_t *buf, int len);
+
+/**
+check if two data blobs are equal and may debug if there's a difference
+**/
+_PUBLIC_ int _data_blob_check_diff(int dbg_lvl,
+ const char *check_name,
+ const char *a_name,
+ const DATA_BLOB *a,
+ const char *b_name,
+ const DATA_BLOB *b,
+ const char *location, const char *func);
+#define data_blob_check_diff(dbg_lvl, check_name, a_name, a, b_name, b) \
+ _data_blob_check_diff(dbg_lvl, check_name, a_name, a, b_name, b, \
+ __location__, _func__)
+
/**
malloc that aborts with smb_panic on fail or zero size.
**/
dump_data_cb(buf, len, omit_zero_bytes, fprintf_cb, f);
}
+_PUBLIC_ int _data_blob_check_diff(int dbg_lvl,
+ const char *check_name,
+ const char *a_name,
+ const DATA_BLOB *a,
+ const char *b_name,
+ const DATA_BLOB *b,
+ const char *location, const char *func)
+{
+ int cmp;
+ size_t ofs;
+ bool differ = false;
+ uint8_t byte_a = 0x00;
+ uint8_t byte_b = 0x00;
+
+ cmp = data_blob_cmp(a, b);
+ if (cmp == 0) {
+ return 0;
+ }
+
+ if (dbg_lvl < 0) {
+ return cmp;
+ }
+
+ if (a->length != b->length) {
+ DEBUG(dbg_lvl, ("%s:%s(%s): "
+ "%s->length=%zu (0x%zx) != %s->length=%zu (0x%zx)\n",
+ location, func, check_name,
+ a_name, a->length, a->length,
+ b_name, b->length, b->length));
+ }
+
+ for (ofs = 0; ofs < a->length; ofs++) {
+ byte_a = a->data[ofs];
+
+ if (ofs == b->length) {
+ byte_b = 0x00;
+ differ = true;
+ break;
+ }
+
+ byte_b = b->data[ofs];
+
+ if (byte_a != byte_b) {
+ differ = true;
+ break;
+ }
+ }
+
+ if (differ) {
+ DEBUG(dbg_lvl, ("%s:%s(%s): ofs=%zu (0x%zx) length=%zu (0x%zx) "
+ "%s->data[]=0x%x %s->data[]=0x%x\n",
+ location, func, check_name,
+ ofs, ofs,
+ a->length, a->length,
+ a_name, byte_a,
+ b_name, byte_b));
+ }
+
+ dump_data_skip_zeros(dbg_lvl, a->data, a->length);
+ dump_data_skip_zeros(dbg_lvl, b->data, b->length);
+ return cmp;
+}
+
/**
malloc that aborts with smb_panic on fail or zero size.
**/