diff options
Diffstat (limited to 'src/main/extractor_ipc_w32.c')
-rw-r--r-- | src/main/extractor_ipc_w32.c | 48 |
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 | } |