[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r18371 - in Extractor: doc src/main
From: |
gnunet |
Subject: |
[GNUnet-SVN] r18371 - in Extractor: doc src/main |
Date: |
Tue, 29 Nov 2011 12:55:37 +0100 |
Author: grothoff
Date: 2011-11-29 12:55:37 +0100 (Tue, 29 Nov 2011)
New Revision: 18371
Modified:
Extractor/doc/version.texi
Extractor/src/main/extractor.c
Log:
LRN:
1) Use PATH_SEPARATOR_STR instead of ":" to tokenize prefix
2) Correctly close cpipe_out and cpipe_in on W32
3) Use page-backed memory mapping instead of a file-backed one (give
the child process a name of the mapping instead of a file name).
4) Add RundllEntryPointA() (which calls RundllEntryPoint() anyway),
doesn't work on NT 6.1 without it.
5) Pass duplicated HANDLEs to the child, not CRT file IDs (apparently,
CRT file IDs are not inherited).
6) Call CreateProcess correctly (so that it finds rundll32 in PATH).
7) Write data into the child's input pipe AFTER the child starts
(otherwise there is a probability of making a blocking write and
hanging up).
AFAICS, passing the test requires LIBEXTRACTOR_PREFIX to be set and
pointing to $GNUNET_PREFIX/lib/libextractor directory
Modified: Extractor/doc/version.texi
===================================================================
--- Extractor/doc/version.texi 2011-11-29 11:47:40 UTC (rev 18370)
+++ Extractor/doc/version.texi 2011-11-29 11:55:37 UTC (rev 18371)
@@ -1,4 +1,4 @@
address@hidden UPDATED 17 May 2010
address@hidden UPDATED-MONTH May 2010
address@hidden UPDATED 1 April 2010
address@hidden UPDATED-MONTH April 2010
@set EDITION 0.6.3
@set VERSION 0.6.3
Modified: Extractor/src/main/extractor.c
===================================================================
--- Extractor/src/main/extractor.c 2011-11-29 11:47:40 UTC (rev 18370)
+++ Extractor/src/main/extractor.c 2011-11-29 11:55:37 UTC (rev 18371)
@@ -449,11 +449,11 @@
d = strdup (p);
if (d == NULL)
return;
- prefix = strtok (d, ":");
+ prefix = strtok (d, PATH_SEPARATOR_STR);
while (NULL != prefix)
{
pp (pp_cls, prefix);
- prefix = strtok (NULL, ":");
+ prefix = strtok (NULL, PATH_SEPARATOR_STR);
}
free (d);
return;
@@ -982,8 +982,8 @@
TerminateProcess (plugin->hProcess, 0);
CloseHandle (plugin->hProcess);
plugin->hProcess = INVALID_HANDLE_VALUE;
- CloseHandle (plugin->cpipe_out);
- CloseHandle (plugin->cpipe_in);
+ close (plugin->cpipe_out);
+ fclose (plugin->cpipe_in);
#endif
plugin->cpipe_out = -1;
plugin->cpipe_in = NULL;
@@ -1186,6 +1186,7 @@
int do_break;
#ifdef WINDOWS
HANDLE map;
+ MEMORY_BASIC_INFORMATION mi;
#endif
if (plugin == NULL)
@@ -1262,9 +1263,23 @@
(NULL != (ptr = mmap (NULL, size, PROT_READ, MAP_SHARED, shmid, 0)))
&&
(ptr != (void*) -1) )
#else
- map = OpenFileMapping (PAGE_READONLY, FALSE, fn);
+ /* Despite the obvious, this must be READWRITE, not READONLY */
+ map = OpenFileMapping (PAGE_READWRITE, FALSE, fn);
ptr = MapViewOfFile (map, FILE_MAP_READ, 0, 0, 0);
if (ptr != NULL)
+ {
+ size = VirtualQuery (ptr, &mi, sizeof (mi));
+ if (size == 0)
+ {
+ UnmapViewOfFile (ptr);
+ ptr = NULL;
+ }
+ else
+ {
+ size = mi.RegionSize;
+ }
+ }
+ if (ptr != NULL)
#endif
{
if ( ( (plugin->extractMethod != NULL) &&
@@ -1382,20 +1397,32 @@
void CALLBACK
-RundllEntryPoint(HWND hwnd,
- HINSTANCE hinst,
- LPSTR lpszCmdLine,
- int nCmdShow)
+RundllEntryPoint (HWND hwnd,
+ HINSTANCE hinst,
+ LPSTR lpszCmdLine,
+ int nCmdShow)
{
- int in;
- int out;
+ intptr_t in_h;
+ intptr_t out_h;
+ int in, out;
- sscanf(lpszCmdLine, "%u %u", &in, &out);
+ sscanf(lpszCmdLine, "%lu %lu", &in_h, &out_h);
+ in = _open_osfhandle (in_h, _O_RDONLY);
+ out = _open_osfhandle (out_h, 0);
setmode (in, _O_BINARY);
setmode (out, _O_BINARY);
process_requests (read_plugin_data (in),
in, out);
}
+
+void CALLBACK
+RundllEntryPointA (HWND hwnd,
+ HINSTANCE hinst,
+ LPSTR lpszCmdLine,
+ int nCmdShow)
+{
+ return RundllEntryPoint(hwnd, hinst, lpszCmdLine, nCmdShow);
+}
#endif
@@ -1405,58 +1432,123 @@
static void
start_process (struct EXTRACTOR_PluginList *plugin)
{
+#if !WINDOWS
int p1[2];
int p2[2];
pid_t pid;
int status;
-#ifdef WINDOWS
- HANDLE process;
-#endif
-#ifndef WINDOWS
plugin->cpid = -1;
if (0 != pipe (p1))
-#else
- plugin->hProcess = NULL;
- if (0 != _pipe (p1, 0, _O_BINARY))
-#endif
{
plugin->flags = EXTRACTOR_OPTION_DISABLED;
return;
}
-#ifndef WINDOWS
if (0 != pipe (p2))
-#else
- if (0 != _pipe (p2, 0, _O_BINARY))
-#endif
{
close (p1[0]);
close (p1[1]);
plugin->flags = EXTRACTOR_OPTION_DISABLED;
return;
}
-#ifndef WINDOWS
pid = fork ();
plugin->cpid = pid;
if (pid == -1)
+ {
+ close (p1[0]);
+ close (p1[1]);
+ close (p2[0]);
+ close (p2[1]);
+ plugin->flags = EXTRACTOR_OPTION_DISABLED;
+ return;
+ }
+ if (pid == 0)
+ {
+ close (p1[1]);
+ close (p2[0]);
+ process_requests (plugin, p1[0], p2[1]);
+ _exit (0);
+ }
+ close (p1[0]);
+ close (p2[1]);
+ plugin->cpipe_in = fdopen (p1[1], "w");
+ if (plugin->cpipe_in == NULL)
+ {
+ perror ("fdopen");
+ (void) kill (plugin->cpid, SIGKILL);
+ waitpid (plugin->cpid, &status, 0);
+ close (p1[1]);
+ close (p2[0]);
+ plugin->cpid = -1;
+ plugin->flags = EXTRACTOR_OPTION_DISABLED;
+ return;
+ }
+ plugin->cpipe_out = p2[0];
#else
+ int p1[2];
+ int p2[2];
STARTUPINFO startup;
PROCESS_INFORMATION proc;
- char cmd[100];
+ char cmd[MAX_PATH + 1];
char arg1[10], arg2[10];
+ HANDLE p10_os = INVALID_HANDLE_VALUE, p21_os = INVALID_HANDLE_VALUE;
+ HANDLE p10_os_inh = INVALID_HANDLE_VALUE, p21_os_inh = INVALID_HANDLE_VALUE;
+ plugin->hProcess = NULL;
+ if (0 != _pipe (p1, 0, _O_BINARY))
+ {
+ plugin->flags = EXTRACTOR_OPTION_DISABLED;
+ return;
+ }
+ if (0 != _pipe (p2, 0, _O_BINARY))
+ {
+ close (p1[0]);
+ close (p1[1]);
+ plugin->flags = EXTRACTOR_OPTION_DISABLED;
+ return;
+ }
+
memset (&startup, 0, sizeof (STARTUPINFO));
- write_plugin_data (p1[1], plugin);
- sprintf(cmd, "libextractor-3.dll,address@hidden %u %u", p1[0], p1[1]);
- if (CreateProcess("rundll32.exe", "libextractor-3.dll,address@hidden", NULL,
NULL, TRUE, 0, NULL, NULL,
+ p10_os = (HANDLE) _get_osfhandle (p1[0]);
+ p21_os = (HANDLE) _get_osfhandle (p2[1]);
+
+ if (p10_os == INVALID_HANDLE_VALUE || p21_os == INVALID_HANDLE_VALUE)
+ {
+ close (p1[0]);
+ close (p1[1]);
+ close (p2[0]);
+ close (p2[1]);
+ plugin->flags = EXTRACTOR_OPTION_DISABLED;
+ return;
+ }
+
+ if (!DuplicateHandle (GetCurrentProcess (), p10_os, GetCurrentProcess (),
+ &p10_os_inh, 0, TRUE, DUPLICATE_SAME_ACCESS)
+ || !DuplicateHandle (GetCurrentProcess (), p21_os, GetCurrentProcess (),
+ &p21_os_inh, 0, TRUE, DUPLICATE_SAME_ACCESS))
+ {
+ if (p10_os_inh != INVALID_HANDLE_VALUE)
+ CloseHandle (p10_os_inh);
+ if (p21_os_inh != INVALID_HANDLE_VALUE)
+ CloseHandle (p21_os_inh);
+ close (p1[0]);
+ close (p1[1]);
+ close (p2[0]);
+ close (p2[1]);
+ plugin->flags = EXTRACTOR_OPTION_DISABLED;
+ return;
+ }
+
+ snprintf(cmd, MAX_PATH + 1, "rundll32.exe libextractor-3.dll,address@hidden
%lu %lu", p10_os_inh, p21_os_inh);
+ cmd[MAX_PATH] = '\0';
+ if (CreateProcessA (NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL,
&startup, &proc))
{
plugin->hProcess = proc.hProcess;
CloseHandle (proc.hThread);
}
else
-#endif
{
close (p1[0]);
close (p1[1]);
@@ -1465,40 +1557,28 @@
plugin->flags = EXTRACTOR_OPTION_DISABLED;
return;
}
-#ifndef WINDOWS
- if (pid == 0)
- {
- close (p1[1]);
- close (p2[0]);
- process_requests (plugin, p1[0], p2[1]);
- _exit (0);
- }
-#endif
close (p1[0]);
close (p2[1]);
+ CloseHandle (p10_os_inh);
+ CloseHandle (p21_os_inh);
+
+ write_plugin_data (p1[1], plugin);
+
plugin->cpipe_in = fdopen (p1[1], "w");
if (plugin->cpipe_in == NULL)
{
perror ("fdopen");
-#ifndef WINDOWS
- (void) kill (plugin->cpid, SIGKILL);
- waitpid (plugin->cpid, &status, 0);
-#else
TerminateProcess (plugin->hProcess, 0);
- WaitForSingleObject (process, INFINITE);
+ WaitForSingleObject (plugin->hProcess, INFINITE);
CloseHandle (plugin->hProcess);
-#endif
close (p1[1]);
close (p2[0]);
-#ifndef WINDOWS
- plugin->cpid = -1;
-#else
plugin->hProcess = INVALID_HANDLE_VALUE;
-#endif
plugin->flags = EXTRACTOR_OPTION_DISABLED;
return;
}
plugin->cpipe_out = p2[0];
+#endif
}
@@ -1650,7 +1730,6 @@
#ifndef WINDOWS
int *shmid,
#else
- HANDLE *mappedFile,
HANDLE *map,
#endif
char *fn,
@@ -1658,10 +1737,10 @@
size_t size)
{
const char *tpath;
-
#ifdef WINDOWS
- tpath = "%TEMP%\\";
+ tpath = "Local\\";
#elif SOMEBSD
+ const char *tpath;
/* this works on FreeBSD, not sure about others... */
tpath = getenv ("TMPDIR");
if (tpath == NULL)
@@ -1692,16 +1771,11 @@
}
return 0;
#else
- *mappedFile = CreateFile (fn,
- GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
CREATE_ALWAYS,
- FILE_FLAG_DELETE_ON_CLOSE, NULL);
- *map = CreateFileMapping (*mappedFile, NULL, PAGE_READWRITE, 1, 0, NULL);
- ptr = MapViewOfFile (*map, FILE_MAP_READ, 0, 0, 0);
- if (ptr == NULL)
+ *map = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0,
size, fn);
+ *ptr = MapViewOfFile (*map, FILE_MAP_WRITE, 0, 0, size);
+ if (*ptr == NULL)
{
CloseHandle (*map);
- CloseHandle (*mappedFile);
return 1;
}
return 0;
@@ -1742,9 +1816,7 @@
int tshmid;
#else
HANDLE map;
- HANDLE mappedFile;
HANDLE tmap;
- HANDLE tmappedFile;
#endif
want_shm = 0;
@@ -1790,7 +1862,6 @@
#ifndef WINDOWS
&shmid,
#else
- &mappedFile,
&map,
#endif
fn, sizeof(fn), size))
@@ -1802,7 +1873,6 @@
#ifndef WINDOWS
&tshmid,
#else
- &tmappedFile,
&tmap,
#endif
tfn, sizeof(tfn), tsize)) )
@@ -1924,12 +1994,10 @@
#else
UnmapViewOfFile (ptr);
CloseHandle (map);
- CloseHandle (mappedFile);
if (tptr != NULL)
{
UnmapViewOfFile (tptr);
CloseHandle (tmap);
- CloseHandle (tmappedFile);
}
#endif
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18371 - in Extractor: doc src/main,
gnunet <=