Index: /trunk/docs/Changelog
===================================================================
--- /trunk/docs/Changelog	(revision 35)
+++ /trunk/docs/Changelog	(revision 36)
@@ -1,3 +1,6 @@
-	* Code cleanup
+	* patch by Yoann: fix an issue when setting the idmef_inode_t object
+	* fix memory leaks in error paths in sh_prelude.c
+	* fix concurrent inserts with postgres in sh_database.c
+	* code cleanup
 	* fix manual version in spec file, noticed by Imre Gergely
 	
Index: /trunk/src/sh_prelude.c
===================================================================
--- /trunk/src/sh_prelude.c	(revision 35)
+++ /trunk/src/sh_prelude.c	(revision 36)
@@ -27,12 +27,17 @@
  *       include libprelude 0.9 code from Yoann Vandoorselaere
  */
- 
+
+
+/*
+ * for strptime()
+ */
+#define _GNU_SOURCE 1 
+
 #include "config_xor.h"
-
-#define _XOPEN_SOURCE 500 /* glibc2 needs this */
 
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 
 #if TIME_WITH_SYS_TIME
@@ -49,4 +54,12 @@
 # endif
 
+#endif
+
+#ifdef MAJOR_IN_MKDEV
+# include <sys/mkdev.h>
+#else
+# ifdef MAJOR_IN_SYSMACROS
+#  include <sys/sysmacros.h>
+# endif
 #endif
 
@@ -390,6 +403,8 @@
                  */
                 ret = idmef_file_new_path(file, &str);
-                if ( ret < 0 )
+                if ( ret < 0 ) {
+		        free(ptr);
                         return;
+		}
                 prelude_string_set_nodup(str, ptr);
 
@@ -413,6 +428,8 @@
         if ( ptr ) {
                 ret = idmef_time_from_samhain(&time, ptr);
-                if ( ret < 0 )
+                if ( ret < 0 ) {
+                        free(ptr);
                         return;
+		}
                 
                 idmef_file_set_modify_time(file, time);
@@ -423,7 +440,9 @@
         if ( ptr ) {
                 ret = idmef_time_from_samhain(&time, ptr);
-                if ( ret < 0 )
+                if ( ret < 0 ) {
+                        free(ptr);
                         return;
-                
+		}
+
                 idmef_file_set_create_time(file, time);
                 free(ptr);
@@ -432,8 +451,20 @@
         ptr = get_value(msg, _("inode"), suffix);
         if ( ptr ) {
+                struct stat st;
+
+                ret = stat(prelude_string_get_string(idmef_file_get_path(file)), &st);
+                if ( ret < 0 ) {
+                        free(ptr);
+                        return;
+		}
+
                 ret = idmef_file_new_inode(file, &inode);
-                if ( ret < 0 )
+                if ( ret < 0 ) {
+                        free(ptr);
                         return;
-                
+		}
+                
+                idmef_inode_set_major_device(inode, major(st.st_dev));
+                idmef_inode_set_minor_device(inode, minor(st.st_dev));
                 idmef_inode_set_number(inode, strtoul(ptr, NULL, 10));
                 free(ptr);
@@ -443,6 +474,8 @@
         if ( ptr ) {
                 ret = idmef_file_new_checksum(file, &checksum, IDMEF_LIST_APPEND);
-                if ( ret < 0 )
+                if ( ret < 0 ) {
+                        free(ptr);
                         return;
+		}
 
 		hashtype = sh_tiger_get_hashtype();
@@ -462,6 +495,8 @@
 
                 ret = idmef_checksum_new_value(checksum, &str);
-                if ( ret < 0 )
+                if ( ret < 0 ) {
+                        free(ptr);
                         return;
+		}
 
 		/* will be freed on destroy()
@@ -475,10 +510,10 @@
                 ret = idmef_file_new_file_access(file, &access, IDMEF_LIST_APPEND);
                 if ( ret < 0 )
-                        return;
+                        goto mode_free;
 
 	        /* flawfinder: ignore *//* is part of name, not access() */
                 ret = idmef_file_access_new_user_id(access, &userid);
                 if ( ret < 0 )
-                        return;
+                        goto mode_free;
                 idmef_user_id_set_type(userid, IDMEF_USER_ID_TYPE_OTHER_PRIVS);
 
@@ -493,22 +528,27 @@
 	        /* flawfinder: ignore *//* is part of name, not access() */
                 ret = idmef_file_new_file_access(file, &access, IDMEF_LIST_APPEND);
-                if ( ret < 0 )
-                        return;
+                if ( ret < 0 ) {
+                        free(ptr);
+                        goto mode_free;
+		}
 
 	        /* flawfinder: ignore *//* is part of name, not access() */
                 ret = idmef_file_access_new_user_id(access, &userid);
-                if ( ret < 0 )
-                        return;
+                if ( ret < 0 ) {
+                        free(ptr);
+                        goto mode_free;
+		}
                 idmef_user_id_set_type(userid, IDMEF_USER_ID_TYPE_USER_PRIVS);
                 
                 ret = idmef_user_id_new_name(userid, &str);
-                if ( ret < 0 )
-                        return;
-                
+                if ( ret < 0 ) {
+                        free(ptr);
+                        goto mode_free;
+                }
                 prelude_string_set_nodup(str, ptr);
                 
                 pw = getpwnam(ptr);
                 if ( ! pw )
-                        return;
+                        goto mode_free;
                 
                 idmef_user_id_set_number(userid, pw->pw_uid);
@@ -526,16 +566,22 @@
 	        /* flawfinder: ignore *//* is part of name, not access() */
                 ret = idmef_file_new_file_access(file, &access, IDMEF_LIST_APPEND);
-                if ( ret < 0 )
-                        return;
-
-	        /* flawfinder: ignore *//* is part of name, not access() */
-                ret = idmef_file_access_new_user_id(access, &userid);
-                if ( ret < 0 )
-                        return;
+                if ( ret < 0 ) {
+                        free(ptr);
+                        goto mode_free;
+		}
+
+                ret = idmef_file_access_new_user_id(access, &userid);/* flawfinder: ignore *//* is part of name, not access() */
+                if ( ret < 0 ) {
+                        free(ptr);
+                        goto mode_free;
+		}
+
                 idmef_user_id_set_type(userid, IDMEF_USER_ID_TYPE_GROUP_PRIVS);
                 
                 ret = idmef_user_id_new_name(userid, &str);
-                if ( ret < 0 )
-                        return;
+                if ( ret < 0 ) {
+                        free(ptr);
+                        goto mode_free;
+		}
                 
                 prelude_string_set_nodup(str, ptr);
@@ -543,5 +589,5 @@
                 gr = getgrnam(ptr);
                 if ( ! gr )
-                        return;
+                        goto mode_free;
 
                 idmef_user_id_set_number(userid, gr->gr_gid);
@@ -551,8 +597,12 @@
 		}
         }
+
+ mode_free:
 
 	if ( mode ) {
 	        free ( mode );
 	}
+
+	return;
 }
 
