libprelude/master: Prevent IDMEF copy from failing if a required children is unavailable

[email protected] Wed, 20 Jan 2010 16:16:09 +0100 (CET)
Newsgroups gmane.comp.security.ids.prelude.cvs
Message-ID <[email protected]>
commit 2a5c07f93ca963760b303b383e3adec0304443c9
Author: Yoann Vandoorselaere <[email protected]>
Date:   Wed Jan 20 15:37:43 2010 +0100

    Prevent IDMEF copy from failing if a required children is unavailable
    
    The previous behavior when copying an IDMEF object was to fail if
    one of the children to be copied was required but unavailable.
    
    Since we don't want to make assumption in the API (the caller could
    temporarily destroy a required children, to recreate it later), carry
    on with the copy if one of the required children is not available.


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

 src/idmef-tree-wrap.c                            |  176 ++++++++++++++--------
 src/idmef-wrappers-gen/GenerateIDMEFTreeWrapC.pm |    8 +-
 2 files changed, 115 insertions(+), 69 deletions(-)

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

diff --git a/src/idmef-tree-wrap.c b/src/idmef-tree-wrap.c
index a5a6b42..c015098 100644
--- a/src/idmef-tree-wrap.c
+++ b/src/idmef-tree-wrap.c
@@ -2234,9 +2234,11 @@ int idmef_additional_data_copy(const idmef_additional_data_t *src, idmef_additio
                         return ret;
         }
 
-        ret = idmef_data_copy(src->data, dst->data);
-        if ( ret < 0 )
-                return ret;
+        if ( src->data ) {
+                ret = idmef_data_copy(src->data, dst->data);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         return 0;
 }
@@ -2742,13 +2744,17 @@ int idmef_reference_copy(const idmef_reference_t *src, idmef_reference_t *dst)
 
         dst->origin = src->origin;
 
-        ret = prelude_string_copy(src->name, dst->name);
-        if ( ret < 0 )
-                return ret;
+        if ( src->name ) {
+                ret = prelude_string_copy(src->name, dst->name);
+                if ( ret < 0 )
+                        return ret;
+        }
 
-        ret = prelude_string_copy(src->url, dst->url);
-        if ( ret < 0 )
-                return ret;
+        if ( src->url ) {
+                ret = prelude_string_copy(src->url, dst->url);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         if ( src->meaning ) {
                 ret = prelude_string_clone(src->meaning, &dst->meaning);
@@ -3275,9 +3281,11 @@ int idmef_classification_copy(const idmef_classification_t *src, idmef_classific
                         return ret;
         }
 
-        ret = prelude_string_copy(src->text, dst->text);
-        if ( ret < 0 )
-                return ret;
+        if ( src->text ) {
+                ret = prelude_string_copy(src->text, dst->text);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         {
                 prelude_list_t *n, *tmp;
@@ -5075,9 +5083,11 @@ int idmef_address_copy(const idmef_address_t *src, idmef_address_t *dst)
 
         dst->vlan_num = src->vlan_num;
 
-        ret = prelude_string_copy(src->address, dst->address);
-        if ( ret < 0 )
-                return ret;
+        if ( src->address ) {
+                ret = prelude_string_copy(src->address, dst->address);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         if ( src->netmask ) {
                 ret = prelude_string_clone(src->netmask, &dst->netmask);
@@ -5923,9 +5933,11 @@ int idmef_process_copy(const idmef_process_t *src, idmef_process_t *dst)
                         return ret;
         }
 
-        ret = prelude_string_copy(src->name, dst->name);
-        if ( ret < 0 )
-                return ret;
+        if ( src->name ) {
+                ret = prelude_string_copy(src->name, dst->name);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         dst->pid_is_set = src->pid_is_set;
 
@@ -6604,9 +6616,11 @@ int idmef_web_service_copy(const idmef_web_service_t *src, idmef_web_service_t *
 
         ret = 0;
 
-        ret = prelude_string_copy(src->url, dst->url);
-        if ( ret < 0 )
-                return ret;
+        if ( src->url ) {
+                ret = prelude_string_copy(src->url, dst->url);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         if ( src->cgi ) {
                 ret = prelude_string_clone(src->cgi, &dst->cgi);
@@ -10634,9 +10648,11 @@ int idmef_file_access_copy(const idmef_file_access_t *src, idmef_file_access_t *
 
         ret = 0;
 
-        ret = idmef_user_id_copy(src->user_id, dst->user_id);
-        if ( ret < 0 )
-                return ret;
+        if ( src->user_id ) {
+                ret = idmef_user_id_copy(src->user_id, dst->user_id);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         {
                 prelude_list_t *n, *tmp;
@@ -11733,9 +11749,11 @@ int idmef_checksum_copy(const idmef_checksum_t *src, idmef_checksum_t *dst)
 
         ret = 0;
 
-        ret = prelude_string_copy(src->value, dst->value);
-        if ( ret < 0 )
-                return ret;
+        if ( src->value ) {
+                ret = prelude_string_copy(src->value, dst->value);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         if ( src->key ) {
                 ret = prelude_string_clone(src->key, &dst->key);
@@ -13343,13 +13361,17 @@ int idmef_file_copy(const idmef_file_t *src, idmef_file_t *dst)
                         return ret;
         }
 
-        ret = prelude_string_copy(src->name, dst->name);
-        if ( ret < 0 )
-                return ret;
+        if ( src->name ) {
+                ret = prelude_string_copy(src->name, dst->name);
+                if ( ret < 0 )
+                        return ret;
+        }
 
-        ret = prelude_string_copy(src->path, dst->path);
-        if ( ret < 0 )
-                return ret;
+        if ( src->path ) {
+                ret = prelude_string_copy(src->path, dst->path);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         if ( src->create_time ) {
                 ret = idmef_time_clone(src->create_time, &dst->create_time);
@@ -14061,17 +14083,23 @@ int idmef_linkage_copy(const idmef_linkage_t *src, idmef_linkage_t *dst)
 
         dst->category = src->category;
 
-        ret = prelude_string_copy(src->name, dst->name);
-        if ( ret < 0 )
-                return ret;
+        if ( src->name ) {
+                ret = prelude_string_copy(src->name, dst->name);
+                if ( ret < 0 )
+                        return ret;
+        }
 
-        ret = prelude_string_copy(src->path, dst->path);
-        if ( ret < 0 )
-                return ret;
+        if ( src->path ) {
+                ret = prelude_string_copy(src->path, dst->path);
+                if ( ret < 0 )
+                        return ret;
+        }
 
-        ret = idmef_file_copy(src->file, dst->file);
-        if ( ret < 0 )
-                return ret;
+        if ( src->file ) {
+                ret = idmef_file_copy(src->file, dst->file);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         return 0;
 }
@@ -16476,9 +16504,11 @@ int idmef_alertident_copy(const idmef_alertident_t *src, idmef_alertident_t *dst
 
         ret = 0;
 
-        ret = prelude_string_copy(src->alertident, dst->alertident);
-        if ( ret < 0 )
-                return ret;
+        if ( src->alertident ) {
+                ret = prelude_string_copy(src->alertident, dst->alertident);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         if ( src->analyzerid ) {
                 ret = prelude_string_clone(src->analyzerid, &dst->analyzerid);
@@ -18647,9 +18677,11 @@ int idmef_tool_alert_copy(const idmef_tool_alert_t *src, idmef_tool_alert_t *dst
 
         ret = 0;
 
-        ret = prelude_string_copy(src->name, dst->name);
-        if ( ret < 0 )
-                return ret;
+        if ( src->name ) {
+                ret = prelude_string_copy(src->name, dst->name);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         if ( src->command ) {
                 ret = prelude_string_clone(src->command, &dst->command);
@@ -19120,9 +19152,11 @@ int idmef_correlation_alert_copy(const idmef_correlation_alert_t *src, idmef_cor
 
         ret = 0;
 
-        ret = prelude_string_copy(src->name, dst->name);
-        if ( ret < 0 )
-                return ret;
+        if ( src->name ) {
+                ret = prelude_string_copy(src->name, dst->name);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         {
                 prelude_list_t *n, *tmp;
@@ -19570,9 +19604,11 @@ int idmef_overflow_alert_copy(const idmef_overflow_alert_t *src, idmef_overflow_
 
         ret = 0;
 
-        ret = prelude_string_copy(src->program, dst->program);
-        if ( ret < 0 )
-                return ret;
+        if ( src->program ) {
+                ret = prelude_string_copy(src->program, dst->program);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         dst->size_is_set = src->size_is_set;
 
@@ -21293,13 +21329,17 @@ int idmef_alert_copy(const idmef_alert_t *src, idmef_alert_t *dst)
                 }
         }
 
-        ret = idmef_time_copy(src->create_time, dst->create_time);
-        if ( ret < 0 )
-                return ret;
+        if ( src->create_time ) {
+                ret = idmef_time_copy(src->create_time, dst->create_time);
+                if ( ret < 0 )
+                        return ret;
+        }
 
-        ret = idmef_classification_copy(src->classification, dst->classification);
-        if ( ret < 0 )
-                return ret;
+        if ( src->classification ) {
+                ret = idmef_classification_copy(src->classification, dst->classification);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         if ( src->detect_time ) {
                 ret = idmef_time_clone(src->detect_time, &dst->detect_time);
@@ -22346,9 +22386,11 @@ int idmef_heartbeat_copy(const idmef_heartbeat_t *src, idmef_heartbeat_t *dst)
                 }
         }
 
-        ret = idmef_time_copy(src->create_time, dst->create_time);
-        if ( ret < 0 )
-                return ret;
+        if ( src->create_time ) {
+                ret = idmef_time_copy(src->create_time, dst->create_time);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         if ( src->analyzer_time ) {
                 ret = idmef_time_clone(src->analyzer_time, &dst->analyzer_time);
@@ -22912,9 +22954,11 @@ int idmef_message_copy(const idmef_message_t *src, idmef_message_t *dst)
 
         ret = 0;
 
-        ret = prelude_string_copy(src->version, dst->version);
-        if ( ret < 0 )
-                return ret;
+        if ( src->version ) {
+                ret = prelude_string_copy(src->version, dst->version);
+                if ( ret < 0 )
+                        return ret;
+        }
 
         switch ( src->type ) {
 
diff --git a/src/idmef-wrappers-gen/GenerateIDMEFTreeWrapC.pm b/src/idmef-wrappers-gen/GenerateIDMEFTreeWrapC.pm
index cbcbe28..6e7c831 100644
--- a/src/idmef-wrappers-gen/GenerateIDMEFTreeWrapC.pm
+++ b/src/idmef-wrappers-gen/GenerateIDMEFTreeWrapC.pm
@@ -824,9 +824,11 @@ int idmef_$struct->{short_typename}_copy(const $struct->{typename} *src, $struct
         } elsif ( $field->{metatype} & &METATYPE_STRUCT ) {
             if ( $field->{required} ) {
                 $self->output("
-        ret = ${copy_func}(src->$field->{name}, dst->$field->{name});
-        if ( ret < 0 )
-                return ret;
+        if ( src->$field->{name} ) {
+                ret = ${copy_func}(src->$field->{name}, dst->$field->{name});
+                if ( ret < 0 )
+                        return ret;
+        }
 ");
 
             }
_______________________________________________
Prelude-cvslog site list
[email protected]
http://lists.prelude-ids.org/mailman/listinfo/prelude-cvslog