gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r27579 - in Extractor: . src/main


From: gnunet
Subject: [GNUnet-SVN] r27579 - in Extractor: . src/main
Date: Tue, 25 Jun 2013 14:26:25 +0200

Author: grothoff
Date: 2013-06-25 14:26:25 +0200 (Tue, 25 Jun 2013)
New Revision: 27579

Modified:
   Extractor/ChangeLog
   Extractor/src/main/extractor.c
   Extractor/src/main/extractor_ipc.c
   Extractor/src/main/extractor_ipc_gnu.c
Log:
-fix IPC bug in le library

Modified: Extractor/ChangeLog
===================================================================
--- Extractor/ChangeLog 2013-06-25 12:26:14 UTC (rev 27578)
+++ Extractor/ChangeLog 2013-06-25 12:26:25 UTC (rev 27579)
@@ -1,3 +1,7 @@
+Tue Jun 25 14:24:00 CEST 2013
+       Fixing bug where LE could hang due to failure to process all
+       received data from the plugin. -CG
+
 Sun Dec  2 08:31:17 CET 2012
        Added Polish translation. -CG
 

Modified: Extractor/src/main/extractor.c
===================================================================
--- Extractor/src/main/extractor.c      2013-06-25 12:26:14 UTC (rev 27578)
+++ Extractor/src/main/extractor.c      2013-06-25 12:26:25 UTC (rev 27579)
@@ -177,6 +177,7 @@
                      value_len))
     {
       prp->file_finished = 1;
+      fprintf (stderr, "Sending ABRT\n");
       send_discard_message (plugin);
       return;
     }

Modified: Extractor/src/main/extractor_ipc.c
===================================================================
--- Extractor/src/main/extractor_ipc.c  2013-06-25 12:26:14 UTC (rev 27578)
+++ Extractor/src/main/extractor_ipc.c  2013-06-25 12:26:25 UTC (rev 27579)
@@ -45,37 +45,46 @@
                              EXTRACTOR_ChannelMessageProcessor proc,
                              void *proc_cls)
 {
-  const char *cdata = data;
+  const char *cdata;
   unsigned char code;
   struct SeekRequestMessage seek;
   struct MetaMessage meta;
   const char *mime_type;
   const char *value;
+  ssize_t ret;
 
+  ret = 0;
   while (size > 0)
     {
+      cdata = data;
       code = (unsigned char) cdata[0];
       switch (code)
        {
        case MESSAGE_DONE: /* Done */
          plugin->seek_request = -1;
          plugin->round_finished = 1;
-         return 1;
+         ret++;
+         size--;
+         data++;
+         continue;
        case MESSAGE_SEEK: /* Seek */     
          if (size < sizeof (struct SeekRequestMessage))
            {
              plugin->seek_request = -1;
-             return 0;
+             return ret;
            }
          memcpy (&seek, cdata, sizeof (seek));
          plugin->seek_request = (int64_t) seek.file_offset;
          plugin->seek_whence = seek.whence;
-         return sizeof (struct SeekRequestMessage);
+         ret += sizeof (struct SeekRequestMessage);
+         data += sizeof (struct SeekRequestMessage);
+         size -= sizeof (struct SeekRequestMessage);
+         continue;
        case MESSAGE_META: /* Meta */
          if (size < sizeof (struct MetaMessage))
            {
              plugin->seek_request = -1;
-             return 0;
+             return ret;
            }
          memcpy (&meta, cdata, sizeof (meta));
          /* check hdr for sanity */
@@ -87,7 +96,7 @@
          if (size < sizeof (meta) + meta.mime_length + meta.value_size)
            { 
              plugin->seek_request = -1;
-             return 0;
+             return ret;
            }
          if (0 == meta.mime_length)
            {
@@ -113,13 +122,16 @@
                (enum EXTRACTOR_MetaType) meta.meta_type,
                (enum EXTRACTOR_MetaFormat) meta.meta_format,
                mime_type, value, meta.value_size);
-         return sizeof (struct MetaMessage) + meta.mime_length + 
meta.value_size;
+         ret += sizeof (struct MetaMessage) + meta.mime_length + 
meta.value_size;
+         size -= sizeof (struct MetaMessage) + meta.mime_length + 
meta.value_size;
+         data += sizeof (struct MetaMessage) + meta.mime_length + 
meta.value_size;
+         continue;
        default:
          LOG ("Invalid message type %d\n", (int) code);
          return -1;
        }
     }
-  return 0;
+  return ret;
 }
 
 /* end of extractor_ipc.c */

Modified: Extractor/src/main/extractor_ipc_gnu.c
===================================================================
--- Extractor/src/main/extractor_ipc_gnu.c      2013-06-25 12:26:14 UTC (rev 
27578)
+++ Extractor/src/main/extractor_ipc_gnu.c      2013-06-25 12:26:25 UTC (rev 
27579)
@@ -465,7 +465,7 @@
     }
   tv.tv_sec = 0;
   tv.tv_usec = 100000; /* 100 ms */
-  if (-1 == select (max + 1, &to_check, NULL, NULL, &tv))
+  if (0 >= select (max + 1, &to_check, NULL, NULL, &tv))
     {
       /* an error or timeout -> something's wrong or all plugins hung up */
       if (EINTR != errno)
@@ -517,10 +517,10 @@
        }
       else
        {
+         channel->size = channel->size + iret - ret;
          memmove (channel->mdata,
                   &channel->mdata[ret],
-                  channel->size + iret - ret);
-         channel->size = channel->size + iret - ret;
+                  channel->size);
        }
     }
   return 1;




reply via email to

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