aboutsummaryrefslogtreecommitdiff
path: root/src/main/extractor_ipc_w32.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/extractor_ipc_w32.c')
-rw-r--r--src/main/extractor_ipc_w32.c48
1 files changed, 40 insertions, 8 deletions
diff --git a/src/main/extractor_ipc_w32.c b/src/main/extractor_ipc_w32.c
index 7b73061..8f116f0 100644
--- a/src/main/extractor_ipc_w32.c
+++ b/src/main/extractor_ipc_w32.c
@@ -129,11 +129,14 @@ struct EXTRACTOR_Channel
129 129
130 /** 130 /**
131 * Buffer for reading data from the plugin. 131 * Buffer for reading data from the plugin.
132 * FIXME: we might want to grow this
133 * buffer dynamically instead of always using 32 MB!
134 */ 132 */
135 char data[MAX_META_DATA]; 133 char *mdata;
136 134
135 /**
136 * Size of the 'mdata' buffer.
137 */
138 size_t mdata_size;
139
137 /** 140 /**
138 * Number of valid bytes in the channel's buffer. 141 * Number of valid bytes in the channel's buffer.
139 */ 142 */
@@ -443,7 +446,13 @@ EXTRACTOR_IPC_channel_create_ (struct EXTRACTOR_PluginList *plugin,
443 LOG_STRERROR ("malloc"); 446 LOG_STRERROR ("malloc");
444 return NULL; 447 return NULL;
445 } 448 }
446 channel->shm = shm; 449 channel->mdata_size = 1024;
450 if (NULL == (channel->mdata = malloc (channel->mdata_size)))
451 {
452 LOG_STRERROR ("malloc");
453 free (channel);
454 return NULL;
455 } channel->shm = shm;
447 channel->plugin = plugin; 456 channel->plugin = plugin;
448 channel->size = 0; 457 channel->size = 0;
449 458
@@ -584,6 +593,7 @@ EXTRACTOR_IPC_channel_destroy_ (struct EXTRACTOR_Channel *channel)
584 free (channel->ov_write_buffer); 593 free (channel->ov_write_buffer);
585 channel->ov_write_buffer = NULL; 594 channel->ov_write_buffer = NULL;
586 } 595 }
596 free (channel->mdata);
587 free (channel); 597 free (channel);
588} 598}
589 599
@@ -674,6 +684,7 @@ EXTRACTOR_IPC_channel_recv_ (struct EXTRACTOR_Channel **channels,
674 BOOL bresult; 684 BOOL bresult;
675 unsigned int i; 685 unsigned int i;
676 unsigned int c; 686 unsigned int c;
687 char *ndata;
677 HANDLE events[MAXIMUM_WAIT_OBJECTS]; 688 HANDLE events[MAXIMUM_WAIT_OBJECTS];
678 689
679 c = 0; 690 c = 0;
@@ -723,12 +734,33 @@ EXTRACTOR_IPC_channel_recv_ (struct EXTRACTOR_Channel **channels,
723 if (dwresult == WAIT_OBJECT_0) 734 if (dwresult == WAIT_OBJECT_0)
724 { 735 {
725 int ret; 736 int ret;
737 if (channels[i]->mdata_size == channels[i]->size)
738 {
739 /* not enough space, need to grow allocation (if allowed) */
740 if (MAX_META_DATA == channels[i]->mdata_size)
741 {
742 LOG ("Inbound message from channel too large, aborting\n");
743 EXTRACTOR_IPC_channel_destroy_ (channels[i]);
744 channels[i] = NULL;
745 }
746 channels[i]->mdata_size *= 2;
747 if (channels[i]->mdata_size > MAX_META_DATA)
748 channels[i]->mdata_size = MAX_META_DATA;
749 if (NULL == (ndata = realloc (channels[i]->mdata,
750 channels[i]->mdata_size)))
751 {
752 LOG_STRERROR ("realloc");
753 EXTRACTOR_IPC_channel_destroy_ (channels[i]);
754 channels[i] = NULL;
755 }
756 channels[i]->mdata = ndata;
757 }
726 bresult = ReadFile (channels[i]->cpipe_out, 758 bresult = ReadFile (channels[i]->cpipe_out,
727 &channels[i]->data[channels[i]->size], 759 &channels[i]->mdata[channels[i]->size],
728 MAX_META_DATA - channels[i]->size, &bytes_read, NULL); 760 channels[i]->mdata_size - channels[i]->size, &bytes_read, NULL);
729 if (bresult) 761 if (bresult)
730 ret = EXTRACTOR_IPC_process_reply_ (channels[i]->plugin, 762 ret = EXTRACTOR_IPC_process_reply_ (channels[i]->plugin,
731 channels[i]->data, channels[i]->size + bytes_read, proc, proc_cls); 763 channels[i]->mdata, channels[i]->size + bytes_read, proc, proc_cls);
732 if (!bresult || -1 == ret) 764 if (!bresult || -1 == ret)
733 { 765 {
734 DWORD error = GetLastError (); 766 DWORD error = GetLastError ();
@@ -740,7 +772,7 @@ EXTRACTOR_IPC_channel_recv_ (struct EXTRACTOR_Channel **channels,
740 } 772 }
741 else 773 else
742 { 774 {
743 memmove (channels[i]->data, &channels[i]->data[ret], 775 memmove (channels[i]->mdata, &channels[i]->mdata[ret],
744 channels[i]->size + bytes_read - ret); 776 channels[i]->size + bytes_read - ret);
745 channels[i]->size = channels[i]->size + bytes_read- ret; 777 channels[i]->size = channels[i]->size + bytes_read- ret;
746 } 778 }