gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r2330 - GNUnet/src/server


From: durner
Subject: [GNUnet-SVN] r2330 - GNUnet/src/server
Date: Thu, 15 Dec 2005 12:40:10 -0800 (PST)

Author: durner
Date: 2005-12-15 12:39:11 -0800 (Thu, 15 Dec 2005)
New Revision: 2330

Modified:
   GNUnet/src/server/connection.c
Log:
prevent segfault

Modified: GNUnet/src/server/connection.c
===================================================================
--- GNUnet/src/server/connection.c      2005-12-15 20:07:04 UTC (rev 2329)
+++ GNUnet/src/server/connection.c      2005-12-15 20:39:11 UTC (rev 2330)
@@ -640,6 +640,9 @@
   max = 0;
 
   for (i=0;i<count;i++) {
+    if (!entries[i])
+      continue;
+    
     if (entries[i]->len <= left) {
       entries[i]->knapsackSolution = YES;
       left -= entries[i]->len;
@@ -690,14 +693,16 @@
   /* fast test: schedule everything? */
   max = 0;
   for (i=0;i<count;i++)
-    max += entries[i]->len;
+    if (entries[i])
+      max += entries[i]->len;
   if (max <= available) {
     /* short cut: take everything! */
-    for (i=0;i<count;i++)
-      entries[i]->knapsackSolution = YES;
     max = 0;
     for (i=0;i<count;i++)
-      max += entries[i]->pri;
+      if (entries[i]) {
+        entries[i]->knapsackSolution = YES;
+        max += entries[i]->pri;
+      }
     return max;
   }
 
@@ -708,13 +713,14 @@
   efflen = MALLOC(sizeof(int)*count);
   max = available;
   for (i=0;i<count;i++) {
-    if (entries[i]->len > 0)
+    if (entries && entries[i]->len > 0)
       max = gcd(max, entries[i]->len);
   }
   GNUNET_ASSERT(max != 0);
   available = available / max;
   for (i=0;i<count;i++)
-    efflen[i] = entries[i]->len / max;
+    if (entries)
+      efflen[i] = entries[i]->len / max;
 
   /* dynamic programming:
      VARR(i,j) stores the maximum value of any subset
@@ -734,13 +740,13 @@
       take_val = -1;
       leave_val = VARR(i-1,j);
       if (j >= efflen[i-1]) {
-       take_val = entries[i-1]->pri + VARR(i-1, j-efflen[i-1]);
-       if (leave_val > take_val)
-         VARR(i,j) = leave_val;
-       else
-         VARR(i,j) = take_val;
+        take_val = entries ? entries[i-1]->pri : 0 + VARR(i-1, j-efflen[i-1]);
+        if (leave_val > take_val)
+          VARR(i,j) = leave_val;
+        else
+          VARR(i,j) = take_val;
       } else
-       VARR(i,j) = leave_val;
+        VARR(i,j) = leave_val;
       /*
       printf("i: %d j: %d (of %d) efflen: %d take: %d "
              "leave %d e[i-1]->pri %d VAR(i-1,j-eff) %lld VAR(i,j) %lld\n",
@@ -768,13 +774,14 @@
   }
 
   /* reconstruct selection */
-  for (i=0;i<count;i++)
-    entries[i]->knapsackSolution = NO;
-  for (i=count;i>0;i--) {
-    if (j >= efflen[i-1]) {
-      if (VARR(i-1, j-efflen[i-1]) + entries[i-1]->pri == VARR(i,j)) {
-       j -= efflen[i-1];
-       entries[i-1]->knapsackSolution = YES;
+  for(i = 0; i < count; i++)
+    if (entries[i])
+      entries[i]->knapsackSolution = NO;
+  for(i = count; i > 0; i--) {
+    if(entries[i] && j >= efflen[i - 1]) {
+      if(VARR(i - 1, j - efflen[i - 1]) + entries[i - 1]->pri == VARR(i, j)) {
+        j -= efflen[i - 1];
+        entries[i - 1]->knapsackSolution = YES;
       }
     }
   }
@@ -898,7 +905,8 @@
   (*priority) = 0;
 
   for (i=be->sendBufferSize-1;i>=0;i--)
-    be->sendBuffer[i]->knapsackSolution = NO;
+    if (be->sendBuffer[i])
+      be->sendBuffer[i]->knapsackSolution = NO;
 
   if(be->session.mtu == 0) {
     totalMessageSize = sizeof(P2P_PACKET_HEADER);
@@ -906,6 +914,10 @@
     /* assumes entries are sorted by priority! */
     while(i < be->sendBufferSize) {
       entry = be->sendBuffer[i];
+      
+      if (!entry)
+        continue;
+      
       if((totalMessageSize + entry->len < MAX_BUFFER_SIZE) &&
          (entry->pri >= EXTREME_PRIORITY)) {
         entry->knapsackSolution = YES;
@@ -921,13 +933,17 @@
       }
       i++;
     }
-    if((i == 0) && (be->sendBuffer[i]->len > be->available_send_window))
+    if((i == 0) && (be->sendBuffer[i] && (be->sendBuffer[i]->len > 
be->available_send_window)))
       return 0;                 /* always wait for the highest-priority
                                    message (otherwise large messages may
                                    starve! */
     while((i < be->sendBufferSize) &&
           (be->available_send_window > totalMessageSize)) {
       entry = be->sendBuffer[i];
+      
+      if (!entry)
+        continue;
+      
       if((entry->len + totalMessageSize <=
           be->available_send_window) &&
          (totalMessageSize + entry->len < MAX_BUFFER_SIZE)) {
@@ -995,7 +1011,7 @@
     }
     j = 0;
     for(i = 0; i < be->sendBufferSize; i++)
-      if(be->sendBuffer[i]->knapsackSolution == YES)
+      if(be->sendBuffer[i] && be->sendBuffer[i]->knapsackSolution == YES)
         j++;
     if(j == 0) {
       LOG(LOG_ERROR,
@@ -1004,9 +1020,10 @@
           j, be->sendBufferSize, be->session.mtu - sizeof(P2P_PACKET_HEADER));
 
       for(j = 0; j < be->sendBufferSize; j++)
-        LOG(LOG_ERROR,
-            _("Message details: %u: length %d, priority: %d\n"),
-            j, be->sendBuffer[j]->len, be->sendBuffer[j]->pri);
+        if (be->sendBuffer[j])
+          LOG(LOG_ERROR,
+              _("Message details: %u: length %d, priority: %d\n"),
+              j, be->sendBuffer[j]->len, be->sendBuffer[j]->pri);
       return 0;
     }
 
@@ -1134,6 +1151,9 @@
   for (i=0;i<be->sendBufferSize;i++) {
     entry = be->sendBuffer[i];
 
+    if (entry)
+      continue;
+
     if (entry->knapsackSolution == YES) {
       if (entry->callback != NULL) {
        tmpMsg = MALLOC(entry->len);
@@ -1273,7 +1293,7 @@
        ret = be->sendBufferSize;
        while (i < ret) {
          entry = entries[i];
-         if (entry->len > be->session.mtu - sizeof(P2P_PACKET_HEADER)) {
+         if (entry && entry->len > be->session.mtu - 
sizeof(P2P_PACKET_HEADER)) {
            ret--;
            for (j=i;j<ret;j++)
              entries[j] = entries[j+1]; /* preserve ordering */
@@ -1572,7 +1592,8 @@
   }
   queueSize = 0;
   for (i=0;i<be->sendBufferSize;i++)
-    queueSize += be->sendBuffer[i]->len;
+    if (be->sendBuffer[i])
+      queueSize += be->sendBuffer[i]->len;
 
   if (queueSize >= MAX_SEND_BUFFER_SIZE) {
     /* first, try to remedy! */
@@ -1581,7 +1602,8 @@
 
     queueSize = 0;
     for (i=0;i<be->sendBufferSize;i++)
-      queueSize += be->sendBuffer[i]->len;
+      if (be->sendBuffer[i])
+        queueSize += be->sendBuffer[i]->len;
 
     if (queueSize >= MAX_SEND_BUFFER_SIZE) {
       /* we need to enforce some hard limit here, otherwise we may take
@@ -1603,6 +1625,7 @@
   apri = (float) se->pri / (float) se->len;
   i=0;
   while ( (i < be->sendBufferSize) &&
+          (be->sendBuffer[i]) &&
          ( ((float)be->sendBuffer[i]->pri /
             (float)be->sendBuffer[i]->len) >= apri) ) {
     ne[i] = be->sendBuffer[i];
@@ -1836,8 +1859,10 @@
     be->session.tsession = NULL;
   }
   for (i=0;i<be->sendBufferSize;i++) {
-    FREENONNULL(be->sendBuffer[i]->closure);
-    FREE(be->sendBuffer[i]);
+    if (be->sendBuffer[i]) {
+      FREENONNULL(be->sendBuffer[i]->closure);
+      FREE(be->sendBuffer[i]);
+    }
   }
   GROW(be->sendBuffer,
        be->sendBufferSize,





reply via email to

[Prev in Thread] Current Thread [Next in Thread]