jim         98/12/03 06:38:06

  Modified:    src/modules/standard mod_status.c
  Log:
  Reduce a race condition... We doubly protect against a bogus vhostrec
  pointer. The first test sets the pointer correctly no matter what
  the value of vhostrec. When it's time to print out, we check again.
  If the previous value was NULL, then no matter what, "NULL" will be
  used for the hostname, even if the new vhostrec was changed between
  the 2 tests to be valid. If the previous was OK, then the vhost value
  will only be printed if it's still OK. There's still a window between
  this final test and when the actual string is printed, since it's possible
  (maybe) that right after the test, the vhostrec is no longer valid, but
  assuming that the memory hasn't been released or overwritten, we still
  point to a good string.
  
  Revision  Changes    Path
  1.102     +6 -2      apache-1.3/src/modules/standard/mod_status.c
  
  Index: mod_status.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_status.c,v
  retrieving revision 1.101
  retrieving revision 1.102
  diff -u -r1.101 -r1.102
  --- mod_status.c      1998/12/03 01:08:00     1.101
  +++ mod_status.c      1998/12/03 14:38:05     1.102
  @@ -254,6 +254,7 @@
       char stat_buffer[HARD_SERVER_LIMIT];
       int pid_buffer[HARD_SERVER_LIMIT];
       clock_t tu, ts, tcu, tcs;
  +    char *vhost;
   
       tu = ts = tcu = tcs = 0;
   
  @@ -308,6 +309,10 @@
       for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
        score_record = ap_scoreboard_image->servers[i];
        ps_record = ap_scoreboard_image->parent[i];
  +     if (score_record.vhostrec)
  +         vhost = score_record.vhostrec->server_hostname;
  +     else
  +         vhost = "NULL";
        res = score_record.status;
        stat_buffer[i] = status_flags[res];
        pid_buffer[i] = (int) ps_record.pid;
  @@ -653,8 +658,7 @@
                            ap_rprintf(r,
                             "<td>%s<td nowrap>%s<td nowrap>%s</tr>\n\n",
                             score_record.client,
  -                          (score_record.vhostrec ? 
  -                           score_record.vhostrec->server_hostname : "NULL"),
  +                          (score_record.vhostrec ? vhost : "NULL"),
                             ap_escape_html(r->pool, score_record.request));
                    }           /* no_table_report */
                }                       /* !short_report */
  
  
  

Reply via email to