Andrew Dunstan wrote:

I wrote:


I will add some trace writes when I get a chance. I was rather hoping something would jump out at you, but obviously it hasn't, so I'll have to dig into it the slow way. *sigh*



Just eyeballing the code it looks to me like the problem is this line:

       strcat(cmdline, *" --restrictedexec"*);


which is appending an option type argument after the non-option argument.


That would exactly account for the failure when we call "initdb foo" but not "initdb -D foo".

The solution would be put --restrictedexec earlier on the new command line. I'll work on that.


The probem is apparently the one I identified above, and is fixed by the attached patch, which I will apply soon unless there are objections.

As for why we saw this on loris but not snake, I suspect they might have different getopt libraries installed.

cheers

andrew
Index: initdb.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/initdb/initdb.c,v
retrieving revision 1.110
diff -c -r1.110 initdb.c
*** initdb.c	18 Feb 2006 16:15:23 -0000	1.110
--- initdb.c	22 Feb 2006 02:21:59 -0000
***************
*** 2450,2455 ****
--- 2450,2460 ----
  								 * environment */
  	char		bin_dir[MAXPGPATH];
  	char	   *pg_data_native;
+ 
+ #ifdef WIN32
+ 	char      *orig_pgdata = NULL;
+ #endif
+ 
  	static const char *subdirs[] = {
  		"global",
  		"pg_xlog",
***************
*** 2560,2565 ****
--- 2565,2573 ----
  	if (optind < argc)
  	{
  		pg_data = xstrdup(argv[optind]);
+ #ifdef WIN32
+ 		orig_pgdata = xstrdup(pg_data);
+ #endif
  		optind++;
  	}
  
***************
*** 2648,2660 ****
      {
          PROCESS_INFORMATION pi;
          char *cmdline;
!         
          ZeroMemory(&pi, sizeof(pi));
  
!         cmdline = pg_malloc(strlen(GetCommandLine()) + 19);
          strcpy(cmdline, GetCommandLine());
!         strcat(cmdline, " --restrictedexec");
          
          if (!CreateRestrictedProcess(cmdline, &pi))
          {
              fprintf(stderr,"Failed to re-exec with restricted token: %lu.\n", GetLastError());
--- 2656,2687 ----
      {
          PROCESS_INFORMATION pi;
          char *cmdline;
! 
          ZeroMemory(&pi, sizeof(pi));
  
!         cmdline = pg_malloc(strlen(GetCommandLine()) + 20);
          strcpy(cmdline, GetCommandLine());
! 
! 		if (orig_pgdata  != NULL)
! 		{
! 			/* find the LAST occurrence of the data arg on the command line */
! 			char *data_arg;
! 			char *next_pos;
! 			size_t orig_len = strlen(orig_pgdata);
! 
! 			data_arg=strstr(cmdline,orig_pgdata);
! 			while ((next_pos=strstr(data_arg+1,orig_pgdata)) != NULL)
! 				data_arg = next_pos;
! 			/* wipe it out so we can add the extra arg */
! 			*data_arg = '\0';
! 		}
! 		
!         strcat(cmdline, " --restrictedexec ");
          
+ 		/* put back original arg if we wiped it out above */
+ 		if (orig_pgdata  != NULL)
+ 			strcat(cmdline,orig_pgdata);
+ 
          if (!CreateRestrictedProcess(cmdline, &pi))
          {
              fprintf(stderr,"Failed to re-exec with restricted token: %lu.\n", GetLastError());
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to