You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apache-bugdb@apache.org by gilles chervy <ch...@balease.com> on 1999/07/21 14:57:08 UTC

mod_cgi/4746: duplicate output and header while forking

>Number:         4746
>Category:       mod_cgi
>Synopsis:       duplicate output and header while forking
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    apache
>State:          open
>Class:          sw-bug
>Submitter-Id:   apache
>Arrival-Date:   Wed Jul 21 07:10:02 PDT 1999
>Last-Modified:
>Originator:     chervy@balease.com
>Organization:
apache
>Release:        1.3.6
>Environment:
sco openserver 5.04 on a dell poweredge 4300
>Description:
when forking with apache 1.3.6, i experience some harsh problem with http header and content : 

if i write something to standard output before the C fork instruction, and, despite the fact i close stdout in my first child instruction line, i got a duplicate of header and bodies (I.e if i output onhting but the header text/plain, i'll get a plain text file (that's ok) but it will not be void. It will contain "Content-type: text/plain"....

and it is worse when i've done some previous output with an html page. 

////////////////
SAMPLE DUPLICATE PAGE (in french; sorry for the inconvenience)
//////////////////
<html>
<head> <title>ERROR IN SQL
</title>
</head>
<H2>MERCI DE PREVENIR BALEASE DE CETTE ERREUR AU 
</H2>
04.92.38.38.00<br>
ERROR : -1 AT INSERT INTO contract (  id, starting_date, created )  VALUES (  '999999999933', now(), now() ) 
</body></html>
Content-type: text/html

<html>
<head> <title>ERROR IN SQL
</title>
</head>
<H2>MERCI DE PREVENIR BALEASE DE CETTE ERREUR AU 
</H2>
04.92.38.38.00<br>
ERROR : -1 AT INSERT INTO contract (  id, starting_date, created )  VALUES (  '999999999933', now(), now() ) 
</body></html>
Content-type: text/html


>How-To-Repeat:
/**************************************************/
this one will do duplicate header and body

int main(int argc, char *argv[]) 
{
  printf("Content-type: text/plain\n\n");  
  switch (fork())
    {
    case 0 :
      /* child */
      fclose(stdout);
      sleep(15);
      exit (0);      
      /* Parent : return to caller */
    default :
      break;
    }
  exit (0);
}

/**************************************************/
this one will perfectly work 
int main(int argc, char *argv[]) 
{
  switch (fork())
    {
    case 0 :
      /* child */
      fclose(stdout);
      sleep(15);
      exit (0);      
      /* Parent : return to caller */
    default :
      break;
    }
  printf("Content-type: text/plain\n\n");  <----- moved after the fork process
  exit (0);
}
>Fix:
hum... don't know, bu i'd greatly appreciate any help (i will be in production status in short term and really don't want to switch to **** webserver)
>Audit-Trail:
>Unformatted:
[In order for any reply to be added to the PR database, you need]
[to include <ap...@Apache.Org> in the Cc line and make sure the]
[subject line starts with the report component and number, with ]
[or without any 'Re:' prefixes (such as "general/1098:" or      ]
["Re: general/1098:").  If the subject doesn't match this       ]
[pattern, your message will be misfiled and ignored.  The       ]
["apbugs" address is not added to the Cc line of messages from  ]
[the database automatically because of the potential for mail   ]
[loops.  If you do not include this Cc, your reply may be ig-   ]
[nored unless you are responding to an explicit request from a  ]
[developer.  Reply only with text; DO NOT SEND ATTACHMENTS!     ]