diff options
author | Michael Mann <mmann78@netscape.net> | 2013-04-22 02:10:49 +0000 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2013-04-22 02:10:49 +0000 |
commit | 4a1bd75b60171d781dc9f2d3ffd6d498acc74b1a (patch) | |
tree | 496db09db3b0ebcf10e9e43d19d804cd14b94a58 /epan/uat.c | |
parent | 6ea50c8d2e0a70acd6d7c759a54276c852081172 (diff) | |
download | wireshark-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.c | 81 |
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; |