commit f112dde1e7ee410bda967f08745b32a3f24b218d
parent 4cb56b610a7258812a2f9c1b6026ee339a09fc12
Author: Christian Grothoff <christian@grothoff.org>
Date: Tue, 25 Jun 2013 12:26:25 +0000
-fix IPC bug in le library
Diffstat:
4 files changed, 28 insertions(+), 11 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -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
diff --git a/src/main/extractor.c b/src/main/extractor.c
@@ -177,6 +177,7 @@ process_plugin_reply (void *cls,
value_len))
{
prp->file_finished = 1;
+ fprintf (stderr, "Sending ABRT\n");
send_discard_message (plugin);
return;
}
diff --git a/src/main/extractor_ipc.c b/src/main/extractor_ipc.c
@@ -45,37 +45,46 @@ EXTRACTOR_IPC_process_reply_ (struct EXTRACTOR_PluginList *plugin,
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 @@ EXTRACTOR_IPC_process_reply_ (struct EXTRACTOR_PluginList *plugin,
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 @@ EXTRACTOR_IPC_process_reply_ (struct EXTRACTOR_PluginList *plugin,
(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 */
diff --git a/src/main/extractor_ipc_gnu.c b/src/main/extractor_ipc_gnu.c
@@ -465,7 +465,7 @@ EXTRACTOR_IPC_channel_recv_ (struct EXTRACTOR_Channel **channels,
}
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 @@ EXTRACTOR_IPC_channel_recv_ (struct EXTRACTOR_Channel **channels,
}
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;