Fix memory bugs.
[fprobe-ulog.git] / src / fprobe-ulog.c
index 0dc3071..e939dab 100644 (file)
@@ -37,7 +37,7 @@
 #include <sys/vfs.h>
 
 #include <libipulog/libipulog.h>
-#include "vserver.h"
+/* #include "vserver.h" */
 
 struct ipulog_handle {
        int fd;
@@ -479,7 +479,7 @@ unsigned get_data_file_fd(char *fname, int cur_fd) {
             system(gzip_cmd);
         }
                snprintf(cur_output_file,MAX_PATH_LEN,"%s.%d",fname,cur_epoch);
-               if ((write_fd = open(cur_output_file, O_RDWR|O_CREAT|O_TRUNC)) < 0) {
+               if ((write_fd = open(cur_output_file, O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH)) < 0) {
                        my_log(LOG_ERR, "open(): %s (%s)\n", cur_output_file, strerror(errno));
                        exit(1);
                }
@@ -825,16 +825,17 @@ void *emit_thread()
 
        setuser();
         
-    //pthread_mutexattr_setprotocol(&md->MutexAttr,PTHREAD_PRIO_INHERIT);
-
        for (;;) {
                pthread_mutex_lock(&emit_mutex);
                while (!flows_emit) {
                        gettimeofday(&now, 0);
                        timeout.tv_sec = now.tv_sec + emit_timeout;
                        /* Do not wait until emit_packet will filled - it may be too long */
-                       if (pthread_cond_timedwait(&emit_cond, &emit_mutex, &timeout) && emit_count) {
-                my_log(LOG_INFO,"Timeout: %d, %d",emit_count, timeout.tv_sec);
+            int res=-1;
+            while ((res=pthread_cond_timedwait(&emit_cond, &emit_mutex, &timeout))==-1) continue;
+
+                       if (res && emit_count) {
+                //my_log(LOG_INFO,"Timeout: %d, %d",emit_count, timeout.tv_sec);
                                pthread_mutex_unlock(&emit_mutex);
                                goto sendit;
                        }
@@ -966,7 +967,8 @@ void *unpending_thread()
                while (!(pending_tail->flags & FLOW_PENDING)) {
                        gettimeofday(&now, 0);
                        timeout.tv_sec = now.tv_sec + unpending_timeout;
-                       pthread_cond_timedwait(&unpending_cond, &unpending_mutex, &timeout);
+                       while (pthread_cond_timedwait(&unpending_cond, &unpending_mutex, &timeout)==-1)
+                continue;
                }
 
 #if ((DEBUG) & (DEBUG_S | DEBUG_U))
@@ -1012,7 +1014,8 @@ void *scan_thread()
        for (;;) {
                gettime(&now);
                timeout.tv_sec = now.sec + scan_interval;
-               pthread_cond_timedwait(&scan_cond, &scan_mutex, &timeout);
+               while (pthread_cond_timedwait(&scan_cond, &scan_mutex, &timeout)==-1)
+            continue;
 
                gettime(&now);
 #if ((DEBUG) & DEBUG_S)
@@ -1164,14 +1167,10 @@ void *cap_thread()
                        /* It's going to be expensive calling this syscall on every flow.
                         * We should keep a local hash table, for now just bear the overhead... - Sapan*/
 
-                       flow->slice_id=0;
-
-                       if (ulog_msg->mark > 0) {
-                               flow->slice_id = xid_to_slice_id(ulog_msg->mark);
-                       }
+                       flow->slice_id = ulog_msg->mark;
 
-                       if (flow->slice_id < 1)
-                               flow->slice_id = ulog_msg->mark; // Couldn't look up the slice id, let's at least store the local xid
+                       /*if (flow->slice_id < 1)
+                               flow->slice_id = ulog_msg->mark; // Couldn't look up the slice id, let's at least store the local xid*/
 
 
                        if ((flow->dip.s_addr == inet_addr("10.0.0.8")) || (flow->sip.s_addr == inet_addr("10.0.0.8"))) {
@@ -1506,7 +1505,7 @@ bad_lhost:
        /* Process collectors parameters. Brrrr... :-[ */
 
        npeers = argc - optind;
-       if (npeers > 1) {
+       if (npeers >= 1) {
                /* Send to remote Netflow collector */
                if (!(peers = malloc(npeers * sizeof(struct peer)))) goto err_malloc;
                for (i = optind, npeers = 0; i < argc; i++, npeers++) {
@@ -1571,10 +1570,8 @@ bad_collector:
        }
        else if (parms[fflag].count) {
                // log into a file
-               if (!(peers = malloc(npeers * sizeof(struct peer)))) goto err_malloc;
-               if (!(peers[npeers].fname = malloc(strnlen(parms[fflag].arg,MAX_PATH_LEN)))) goto err_malloc;
-               strncpy(peers[npeers].fname, parms[fflag].arg, MAX_PATH_LEN);
-
+               if (!(peers = malloc(sizeof(struct peer)))) goto err_malloc;
+               if (!(peers[npeers].fname = strndup(parms[fflag].arg, MAX_PATH_LEN))) goto err_malloc;
                peers[npeers].write_fd = START_DATA_FD;
                peers[npeers].type = PEER_FILE;
                peers[npeers].seq = 0;
@@ -1634,7 +1631,7 @@ bad_collector:
 
        /* Initialization */
 
-    init_slice_id_hash();
+    // init_slice_id_hash();
        hash_init(); /* Actually for crc16 only */
        mem_init(sizeof(struct Flow), bulk_quantity, memory_limit);
        for (i = 0; i < 1 << HASH_BITS; i++) pthread_mutex_init(&flows_mutex[i], 0);