libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

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:
MChangeLog | 4++++
Msrc/main/extractor.c | 1+
Msrc/main/extractor_ipc.c | 28++++++++++++++++++++--------
Msrc/main/extractor_ipc_gnu.c | 6+++---
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;