summaryrefslogtreecommitdiff
path: root/epan/uat.c
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2013-04-22 02:10:49 +0000
committerMichael Mann <mmann78@netscape.net>2013-04-22 02:10:49 +0000
commit4a1bd75b60171d781dc9f2d3ffd6d498acc74b1a (patch)
tree496db09db3b0ebcf10e9e43d19d804cd14b94a58 /epan/uat.c
parent6ea50c8d2e0a70acd6d7c759a54276c852081172 (diff)
downloadwireshark-4a1bd75b60171d781dc9f2d3ffd6d498acc74b1a.tar.gz
Add a "hidden" array of UAT entry data to allow separation between UAT file syntax errors and "syntactically correct, but invalid field". Now UAT files load all entries into the "hidden" array (raw_data), but only adds valid ones to the user_data, which is used by the dissectors.
This is a start to fixing bug 7471 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=7471) and is being committed to get the new ABI/API in before the 1.10 release. What remains is the "GUI portion" (GTK+qt) to indicate to users which UAT entries are invalid. svn path=/trunk/; revision=48960
Diffstat (limited to 'epan/uat.c')
-rw-r--r--epan/uat.c81
1 files changed, 71 insertions, 10 deletions
diff --git a/epan/uat.c b/epan/uat.c
index 87c90b27f1..ebe11c99b6 100644
--- a/epan/uat.c
+++ b/epan/uat.c
@@ -93,6 +93,8 @@ uat_t* uat_new(const char* name,
uat->post_update_cb = post_update_cb;
uat->fields = flds_array;
uat->user_data = g_array_new(FALSE,FALSE,(guint)uat->record_size);
+ uat->raw_data = g_array_new(FALSE,FALSE,(guint)uat->record_size);
+ uat->valid_data = g_array_new(FALSE,FALSE,sizeof(gboolean));
uat->changed = FALSE;
uat->loaded = FALSE;
uat->from_global = FALSE;
@@ -119,18 +121,37 @@ uat_t* uat_new(const char* name,
return uat;
}
-void* uat_add_record(uat_t* uat, const void* data) {
+void* uat_add_record(uat_t* uat, const void* data, gboolean valid_rec) {
void* rec;
+ gboolean* valid;
- g_array_append_vals (uat->user_data, data, 1);
+ /* Save a copy of the raw (possibly that may contain invalid field values) data */
+ g_array_append_vals (uat->raw_data, data, 1);
- rec = uat->user_data->data + (uat->record_size * (uat->user_data->len-1));
+ rec = uat->raw_data->data + (uat->record_size * (uat->raw_data->len-1));
if (uat->copy_cb) {
uat->copy_cb(rec, data, (unsigned int) uat->record_size);
}
- UAT_UPDATE(uat);
+ if (valid_rec) {
+ /* Add a "known good" record to the list to be used by the dissector */
+ g_array_append_vals (uat->user_data, data, 1);
+
+ rec = uat->user_data->data + (uat->record_size * (uat->user_data->len-1));
+
+ if (uat->copy_cb) {
+ uat->copy_cb(rec, data, (unsigned int) uat->record_size);
+ }
+
+ UAT_UPDATE(uat);
+ } else {
+ rec = NULL;
+ }
+
+ g_array_append_vals (uat->valid_data, &valid_rec, 1);
+ valid = (gboolean*)(uat->valid_data->data + (sizeof(gboolean) * (uat->valid_data->len-1)));
+ *valid = valid_rec;
return rec;
}
@@ -138,8 +159,9 @@ void* uat_add_record(uat_t* uat, const void* data) {
void uat_swap(uat_t* uat, guint a, guint b) {
size_t s = uat->record_size;
void* tmp = ep_alloc(s);
+ gboolean tmp_bool;
- g_assert( a < uat->user_data->len && b < uat->user_data->len );
+ g_assert( a < uat->raw_data->len && b < uat->raw_data->len );
if (a == b) return;
@@ -147,20 +169,23 @@ void uat_swap(uat_t* uat, guint a, guint b) {
memcpy(UAT_INDEX_PTR(uat,a), UAT_INDEX_PTR(uat,b), s);
memcpy(UAT_INDEX_PTR(uat,b), tmp, s);
+ tmp_bool = *(gboolean*)(uat->valid_data->data + (sizeof(gboolean) * (a)));
+ *(gboolean*)(uat->valid_data->data + (sizeof(gboolean) * (a))) = *(gboolean*)(uat->valid_data->data + (sizeof(gboolean) * (b)));
+ *(gboolean*)(uat->valid_data->data + (sizeof(gboolean) * (b))) = tmp_bool;
+
+
}
void uat_remove_record_idx(uat_t* uat, guint idx) {
- g_assert( idx < uat->user_data->len );
+ g_assert( idx < uat->raw_data->len );
if (uat->free_cb) {
uat->free_cb(UAT_INDEX_PTR(uat,idx));
}
- g_array_remove_index(uat->user_data, idx);
-
- UAT_UPDATE(uat);
-
+ g_array_remove_index(uat->raw_data, idx);
+ g_array_remove_index(uat->valid_data, idx);
}
/* The returned filename was g_malloc()'d so the caller must free it */
@@ -270,6 +295,34 @@ gboolean uat_save(uat_t* uat, const char** error) {
*error = NULL;
g_free (fname);
+ /* Ensure raw_data is synced with user_data and all "good" entries have been accounted for */
+
+ /* Start by clearing current user_data */
+ for ( i = 0 ; i < uat->user_data->len ; i++ ) {
+ if (uat->free_cb) {
+ uat->free_cb(UAT_USER_INDEX_PTR(uat,i));
+ }
+ }
+ g_array_set_size(uat->user_data,0);
+
+ *((uat)->user_ptr) = NULL;
+ *((uat)->nrows_p) = 0;
+
+ /* Now copy "good" raw_data entries to user_data */
+ for ( i = 0 ; i < uat->raw_data->len ; i++ ) {
+ void* rec = uat->raw_data->data + (uat->record_size * i);
+ gboolean* valid = (gboolean*)(uat->valid_data->data + sizeof(gboolean)*i);
+ if (*valid) {
+ g_array_append_vals(uat->user_data, rec, 1);
+ if (uat->copy_cb) {
+ uat->copy_cb(UAT_USER_INDEX_PTR(uat,i), rec, (unsigned int) uat->record_size);
+ }
+
+ UAT_UPDATE(uat);
+ }
+ }
+
+
fprintf(fp,"# This file is automatically generated, DO NOT MODIFY.\n");
for ( i = 0 ; i < uat->user_data->len ; i++ ) {
@@ -318,11 +371,19 @@ void uat_clear(uat_t* uat) {
for ( i = 0 ; i < uat->user_data->len ; i++ ) {
if (uat->free_cb) {
+ uat->free_cb(UAT_USER_INDEX_PTR(uat,i));
+ }
+ }
+
+ for ( i = 0 ; i < uat->raw_data->len ; i++ ) {
+ if (uat->free_cb) {
uat->free_cb(UAT_INDEX_PTR(uat,i));
}
}
+ g_array_set_size(uat->raw_data,0);
g_array_set_size(uat->user_data,0);
+ g_array_set_size(uat->valid_data,0);
*((uat)->user_ptr) = NULL;
*((uat)->nrows_p) = 0;