<!DOCTYPE HTML PUBLIC "-//FreeBSD//DTD HTML 4.01 Transitional-Based Extension//EN" [
<!ENTITY base CDATA "../..">
<!ENTITY email 'freebsd-qa'>
<!ENTITY date "$FreeBSD$">
<!ENTITY title "FreeBSD 5.3 Open Issues">
<!ENTITY % navinclude.download "INCLUDE">
<!ENTITY % developers PUBLIC "-//FreeBSD//ENTITIES FreeBSD Developers Entities//EN"> %developers;
<!-- Status levels -->
<!ENTITY status.na "<font color=green>N/A</font>">
<!ENTITY status.done "<font color=green>Done</font>">
<!ENTITY status.wip "<font color=blue>In&nbsp;progress</font>">
<!ENTITY status.untested "<font color=orange>Needs&nbsp;testing</font>">
<!ENTITY status.new "<font color=red>Not&nbsp;done</font>">
<!ENTITY status.unknown "<font color=red>Unknown</font>">

<!ENTITY url.cvsweb "http://www.freebsd.org/cgi/cvsweb.cgi">
<!ENTITY url.mid "http://docs.freebsd.org/cgi/mid.cgi?">
<!ENTITY url.pr "http://www.freebsd.org/cgi/query-pr.cgi?">
]>

<!--

  Changes to this list MUST NOT be committed without approval of
  Release Engineering Team (re@FreeBSD.org) (for general items) or
  Documentation Engineering Team (doceng@FreeBSD.org) (for doc-related
  items).

-->

<html>
&header;

<h1>Open Issues</h1>

<p>This is a list of open issues that need to be resolved for FreeBSD
  5.3.  If you have any updates for this list, please e-mail
  re@FreeBSD.org.</p>

<h3>Issues that require investigation</h3>

<table class="tblbasic">
  <tr><th>Issue</th><th>Status</th><th>Responsible</th><th>Description</th>
      </tr>

</table>

<h3>Show stopper defects for 5.3-RELEASE</h3>

<table class="tblbasic">
  <tr><th>Issue</th><th>Status</th><th>Responsible</th><th>Description</th>
      </tr>

</table>

<h3>Required features for 5.3-RELEASE</h3>

<table class="tblbasic">
  <tr><th>Issue</th><th>Status</th><th>Responsible</th><th>Description</th></tr>

</table>

<h3>Desired features and bugfixes for 5.3-RELEASE</h3>

<table class="tblbasic">
  <tr><th>Issue</th><th>Status</th><th>Responsible</th><th>Description</th>
      </tr>

  <tr>
    <td>Reports of poor performance with the if_re driver (re ethernet
      interfaces)</td>
    <td>&status.wip;</td>
    <td>&a.jmg;</td>
    <td>There have been reports that specific gigabit ethernet cards
      supported by the if_re driver are experiencing poor performance; a
      patch has been posted that corrects timer and interrupt problems
      with the driver, and is believed to correct the performace problems.
      The patch will be merged to 6.x and 5.x shortly.</td>
  </tr>

  <tr>
    <td>GDB thread support</td>
    <td>&status.wip;</td>
    <td>&a.davidxu;, &a.marcel;</td>
    <td>With improved support for threading primitives, support is now
      required to ease debugging of threaded applications.  Ideally,
      this support will work for both libthr and libkse threading
      models.</td>
  </tr>

  <tr>
    <td>KSE support for sparc64</td>
    <td>&status.wip;</td>
    <td>&a.kensmith;</td>
    <td>Kernel bits implemented, userland not implemented.</td>
  </tr>

  <tr>
    <td>truss support for ptrace</td>
    <td>--</td>
    <td>--</td>
    <td>Almost all process debugging tools have been updated to use
      non-procfs kernel primitives, with the exception of truss(1).
      As procfs is considered deprecated due to its inherent security
      risks, it is highly desirable to update truss to operate in
      a post-procfs world.  &a.des; had prototype patches; &a.robert;
      is developing and testing patches now.  Support for system
      call tracing has been added to ptrace().</td>
  </tr>

  <tr>
    <td>FAST_IPSEC and KAME compatibility</td>
    <td>&status.new;</td>
    <td>--</td>
    <td>FAST_IPSEC currently cannot be used directly with the KAME IPv6
      implementation, requiring an additional level of IP tunnel
      indirection to protect IPv6 packets when using hardware crypto
      acceleration.  This issue must be resolved so that the two
      services may more easily be used together.  Among other things,
      this will require a careful review of the handling of mbuf
      header copying and m_tag support in the KAME IPv6 code.</td>
  </tr>

  <tr>
    <td>rpc.lockd(8) stability</td>
    <td>--</td>
    <td>--</td>
    <td>A process cannot be interrupted while waiting on a lock.  Fixing
      this requires that the RPC code be taught how to deal with lock
      cancellation and interruption events.</td>
  </tr>

  <tr>
    <td>Revised kld build infrastructure</td>
    <td>&status.new;</td>
    <td>&a.peter;</td>
    <td>Kernel modules are currently built independently from a kernel
      configuration, and independently from one another, resulting in
      substantially redundant compilation of objects, as well as the
      inability to easily manage compile-time options for kernel
      objects (such as MAC, PAE, etc) that may require conditional
      compilation in the kernel modules.  In order to improve build
      performance and better support options of this sort, the
      KLD build infrastructure needs to be revamped.  &a.peter; has
      done some initial prototyping, and should be contacted before
      starting on this work.</td>
  </tr>

  <tr>
  <td>Race conditions in truss</td>
  <td>Errata candidate</td>
  <td>&a.robert;</td>
  <td>Truss appears to contain a race condition during the start-up of
    debugging, which can result in truss failing to attach to the process
    before it exits.  The symptom is that truss reports that it cannot
    open the procfs node supporting the process being debugged.  A bug
    also appears to exist where in truss will hang if execve() returns
    ENOENT.  A further race appears to exist in which truss will return
    "PIOCWAIT: Input/output error" occasionally on startup.  The fix
    for this sufficiently changes process execution handling that we
    will defer the fix to post-5.0 and consider this errata.</td>
  </tr>

  <tr>
    <td>filedesc LOR</td>
    <td>&status.new;</td>
    <td>--</td>
    <td>The LOR reported in PR kern/55175 needs to be fixed.  Filedesc locking
      needs to be heavily reviewed in general.</td>
  </tr>

  <tr>
    <td>KSE support for alpha</td>
    <td>&status.wip;</td>
    <td>&a.marcel;</td>
    <td>Userland bits implemented, kernel bits not implemented.</td>
  </tr>

  <tr>
    <td>CAM locking</td>
    <td>&status.wip;</td>
    <td>&a.scottl;, &a.gibbs;</td>
    <td>For kernel API/ABI compatibility reasons, it would be desirable to
      have the CAM locking strategy determined and loosely implemented for
      5.3.</td>
  </tr>

  <tr>
    <td>syscons not working on Sparc64 Ultra-30</td>
    <td>&status.new;</td>
    <td>--</td>
    <td>When running syscons on an Ultra-30 with Creator-3D typing
      characters on the keyboard produces garbage.  Problem reported
      by &a.kris;.  Debugging difficult due to lack of this particular
      configuration among developers and problem isn't present on similar
      hardware (e.g. no problem on Ultra-60 w/Creator-3D).</td>
  </tr>
</table>

<h3>Documentation items that must be resolved for 5.3</h3>

<table class="tblbasic">
  <tr><th>Issue</th><th>Status</th><th>Responsible</th><th>Description</th>
      </tr>
  <tr>
    <td>i386 Floppy Installation Docs</td>
    <td>&status.done;</td>
    <td>Gavin Atkinson, &a.bmah;</td>
    <td>The installation documentation doesn't take into account the
      new floppy images (with a full kernel split across multiple
      disks).  This should be updated.<br>
	    <b>References:</b><br>
	    <a href="&url.pr;pr=docs/70485">docs/70485 (closed)</a>
	  </td>
  </tr>

  <tr>
    <td>Finish hardware notes trimming</td>
    <td>&status.done;</td>
    <td>&a.simon;, &a.brueffer;</td>
    <td>Finish removing mention of individual devices in the hardware
      notes and use auto-generated lists, based on driver manual pages,
      instead.</td>
  </tr>

  <tr>
    <td>sound(4) related manual pages</td>
    <td>&status.done;</td>
    <td>&a.simon;</td>
    <td>The snd(4) and pcm(4) drivers have been renamed but their
      manual pages are still outdated.  sound(4) has to be added and
      pcm(4), csa(4), gusc(4), sbc(4), and uaudio(4) should be revised.
      Other manual pages which refer to pcm(4) (if any) should possibly
      be revised, too.  In addition, supported cards list needs to be
      updated.<br>
	    <b>References:</b><br>
	    <a href="&url.mid;20040820145251.GA36893">Manpage for snd_solo on -doc@</a><br>
	    <a href="&url.mid;20040828142503.GA52613@ip.net.ua">[PATCH] sound(4) related manpages 5.3 TODO item on -doc@</a><br>
	    <a href="&url.cvsweb;/src/share/man/man4/Makefile?rev=1.279&amp;content-type=text/x-cvsweb-markup">src/share/man/man4/Makefile rev.1.279</a><br>
	  </td>
  </tr>

  <tr>
    <td>Sound section in the Handbook</td>
    <td>&status.done;</td>
    <td>&a.blackend;</td>
    <td>This section is outdated, some rewrites are needed for
      5.3-RELEASE.<br>
	    <b>References:</b><br>
	    <a
	    href="&url.cvsweb;/doc/en_US.ISO8859-1/books/handbook/multimedia/chapter.sgml?rev=1.94&amp;content-type=text/x-cvsweb-markup">doc/en_US.ISO8859-1/books/handbook/multimedia/chapter.sgml
	    rev.1.94</a><br>
	  </td>
  </tr>

  <tr>
    <td>FDP documentations related pcm(4)</td>
    <td>&status.new;</td>
    <td>--</td>
    <td>With the snd(4) and pcm(4) drivers changes, documentations
      (FAQ) regarding the use of these drivers need an update.</td>
  </tr>

  <tr>
    <td>Early Adopter's Guide</td>
    <td>&status.done;</td>
    <td>&a.bmah;, &a.trhodes;</td>
    <td>Xin LI pointed out that FreeBSD 5.3-RELEASE is the first
      stable release on 5.X and it is (hopefully) not for early
      adopters.  Early Adopter's Guide is still useful, but
      contains a bit old information.  Some parts of this guide
      need a rewrite, and this document should be published
      as "4.X to 5.X Migration Guide",  which focuses difference
      between 4.X and 5.X.<br>
	    <b>References:</b><br>
	    <a href="http://www.FreeBSD.org/relnotes/5-STABLE/early-adopter/index.html">Draft for review</a><br>
	    <a href="&url.mid;1094426835.767.50.camel@localhost">discussion on -doc@ and -current@</a><br>
	  </td>
  </tr>

  <tr>
    <td>Installation Notes</td>
    <td>&status.new;</td>
    <td>&a.trhodes;</td>
    <td>Some parts are outdated.  doc/70485 has been committed, but
      more work is needed to reflect the realities.  bmah@ pointed out
      that we should have "quick-start" installation guide for each
      platform instead of the current ones because they become too long
      and difficult to be maintained.<br>
	    <b>References:</b><br>
	    <a href="&url.pr;pr=doc/70485">doc/70485 (closed)</a><br>
	  </td>
  </tr>

  <tr>
    <td>Xorg</td>
    <td>&status.done;</td>
    <td>Ken Tom, &a.blackend;</td>
    <td>Update the X11 chapter of the Handbook for X.Org's X11
      server.<br>
	    <b>References:</b><br>
	    <a href="&url.cvsweb;/doc/en_US.ISO8859-1/books/handbook/x11/chapter.sgml?rev=1.147&amp;content-type=text/x-cvsweb-markup">books/handbook/config/chapter.sgml rev.1.147</a><br>
	  </td>
  </tr>

  <tr>
    <td>rc.d scripts</td>
    <td>&status.done;</td>
    <td>&a.trhodes;</td>
    <td>Ch.11.4 and 11.5 of the Handbook must be updated to mention
      the new rc.d scripts and some ports use /etc/rc.conf for their
      configuration.<br>
	    <b>References:</b><br>
	    <a href="&url.cvsweb;/doc/en_US.ISO8859-1/books/handbook/config/chapter.sgml?rev=1.170&amp;content-type=text/x-cvsweb-markup">books/handbook/config/chapter.sgml rev.1.170</a><br>
	    <a href="&url.cvsweb;/doc/en_US.ISO8859-1/books/handbook/config/chapter.sgml?rev=1.172&amp;content-type=text/x-cvsweb-markup">books/handbook/config/chapter.sgml rev.1.172</a><br>
	  </td>
  </tr>

  <tr>
    <td>Handbook's kernel configuration chapter</td>
    <td>&status.done;</td>
    <td>&a.ceri;</td>
    <td>Chapter 8 must be updated to match 5.3-RELEASE.<br>
	    <b>References:</b><br>
	    <a href="&url.pr;pr=70674">docs/70674 (closed)</a><br>
	    <a href="&url.cvsweb;/doc/en_US.ISO8859-1/books/handbook/kernelconfig/chapter.sgml?rev=1.135&amp;content-type=text/x-cvsweb-markup">books/handbook/kernelconfig/chapter.sgml rev.1.135</a><br>
	  </td>
  </tr>

  <tr>
    <td>Handbook's IPsec section</td>
    <td>&status.new;</td>
    <td>--</td>
    <td>Some parts of Section 14.10 are outdated and are not correct
      for 5.X systems.<br>
	    <b>References:</b><br>
	    <a href="&url.mid;1093985909.d6849c9clumsden@myrealbox.com">ipsec on -doc@</a><br>
	    <a href="&url.mid;2071E0FA-0600-11D9-9FC5-000A95908F0E@cybox.com">Problem with IPSEC in handbook on -doc@</a><br>
	  </td>
  </tr>

  <tr>
    <td>Handbook's Vinum chapter</td>
    <td>&status.new;</td>
    <td>--</td>
    <td>Vinum chapter needs to be revised for 5.X systems.</td>
  </tr>
</table>

<h3>Testing focuses for 5.3-RELEASE</h3>

<table class="tblbasic">
  <tr><th>Issue</th><th>Status</th><th>Responsible</th><th>Description</th>
      </tr>
  <tr>
    <td>KSE as the default threads library</td>
    <td>&status.untested;</td>
    <td>&a.davidxu;, &a.deischen;</td>
    <td>KSE has matured to the point of being more stable and POSIX-compliant
      than the traditional libc_r.  All Tier-1 platforms <b>MUST</b> have
      stable KSE support for 5.3 in order to support a consistent transition.
      Additionally, all ports that depend on the pthreads API must be modified
      to properly detect and support the default threading library.</td>
  </tr>

  <tr>
    <td>Updated binutils for all platforms</td>
    <td>&status.untested;</td>
    <td>&a.obrien;</td>
    <td>Binutils needs updating in order to support new platforms, newer GDB
      versions, and Thread Local Storage.</td>
  </tr>

  <tr>
    <td>gcc 3.3 floating point alignment regression</td>
    <td>&status.untested;</td>
    <td>&nbsp;</td>
    <td>The previous GCC 3.3 snapshot included regressions in alignment of
      floating point arguments, resulting in a substantial performance
      degradation.  The recent GCC 3.4.2 import should fix this, but more
      testing is needed.</td>
  </tr>

  <tr>
    <td>in6_pcbnotify() panic with TCP</td>
    <td>&status.done;</td>
    <td>&a.rwatson;</td>
    <td>&a.kuriyama; has reported a failed locking assertion with IPv6
      TCP notifications.  This problem is believed to be corrected.</td>
  </tr>

  <tr>
    <td>Per-platform Thread-Local Storage</td>
    <td>&status.untested;</td>
    <td>&a.dfr;, &a.marcel;</td>
    <td>To complete support for thread-local storage on FreeBSD,
      per-architecture changes must be made.  Currently pending
      platforms are amd64, alpha, ia64, i386, sparc64, and powerpc.</td>
  </tr>

  <tr>
    <td>SMP instability under load</td>
    <td>&status.untested;</td>
    <td>&a.dwhite;, &a.alc;</td>
    <td>High load on SMP systems appears to result in a hard hang related
      to VM IPI.  &a.dwhite; has prepared a candidate patch that appears to
      resolve this instability, which is currently in testing for merge to
      the CVS HEAD.</td>
  </tr>

  <tr>
    <td>Fine-grained network stack locking without Giant</td>
    <td>&status.untested;</td>
    <td>&a.rwatson;</td>
    <td>Significant parts of the network stack (especially IPv4, UNIX
      domain IPC, and sockets) now have fine-grained locking of their data
      structures.  It's possible to run many common network subsystems and
      services without the Giant lock.  However, a number of device drivers
      and less mainstream network subsystems are currently not MPSAFE.
      5.3 betas have shipped with Giant-free networking by default, with
      some bug reports and fixes in later betas and release candidates.
      Please report any problems to the current@ mailing list.</td>
  </tr>

  <tr>
    <td>kld support for amd64</td>
    <td>&status.untested;</td>
    <td>&a.obrien;, &a.iedowse;</td>
    <td>KLDs work when loaded from userland, but not from the loader.  kldxref
      and loader support has been committed to HEAD and RELENG_5 and needs
      final testing.</td>
  </tr>

  <tr>
    <td>ATA panics under sparc64</td>
    <td>&status.untested;</td>
    <td>&a.sos;, &a.scottl;</td>
    <td>Recent changes to the ATA driver trigger a bug on sparc64 that causes
      a panic on boot.  This was caused by bugs in busdma that have been
      hopefully fixed.</td>
  </tr>

  <tr>
    <td>ifconf() sleep warning</td>
    <td>&status.done;</td>
    <td>&a.brooks;</td>
    <td>The ifconf() ioctl for listing network interfaces performs a
      copyout() while holding the global ifnet list mutex.  This generates a
      witness warning in the event that copyout() generates a page fault,
      and risks more serious problems.  This problem is believed to be
      corrected.</td>
  </tr>

  <tr>
    <td>poll()/select() application wedge reports with debug.mpsafenet=1</td>
    <td>&status.done;</td>
    <td>&a.rwatson;</td>
    <td>There are reports of applications wedging in poll() and select()
      while running the network stack without the Giant lock.  A recent
      sleepq change appears to have caused some of the observed problems
      to go away (others are difficult to test for due to recent SMP
      instability).  This problem appears to be corrected.</td>
  </tr>

  <tr>
    <td>if_em wedging under high pps</td>
    <td>&status.done;</td>
    <td>&a.mlaier;</td>
    <td>There have been several reports of if_em cards "wedging" under high
      packets-per-second load.  This problem appears to have been
      corrected.</td>
  </tr>

  <tr>
    <td>Panic on USB detach</td>
    <td>&status.untested</td>
    <td>&a.imp;, &a.scottl;</td>
    <td>A recent regression in the USB code is causing panics when a USB
      device detaches, especially USB hubs.  A fix is in RELENG_5 now.</td>
  </tr>

  <tr>
    <td>KAME IPSEC "ENOBUFS" problem with racoon and mbuma</td>
    <td>&status.done;</td>
    <td>&a.rwatson;, &a.sam;</td>
    <td>There are reports that racoon is unable to complete IKE negotiation
      due to a send to the pfkey socket returning ENOBUFS.  This appears to
      be a result of an incorrect assumption about mbuf data size due to a
      change resulting from mbuma.  This problem appears to have been
      corrected.</td>
  </tr>

  <tr>
    <td>BIND9 import into 5-CURRENT</td>
    <td>&status.done;</td>
    <td>&a.dougb;, &a.des;, &a.trhodes;</td>
    <td>BIND9 is now in RELENG_5 and HEAD.  Testing is needed of basic
      functionality, migration from 8.x, and 3rd party packages in the ports
      tree.</td>
  </tr>

  <tr>
    <td>Synaptics touchpad problems</td>
    <td>&status.untested;</td>
    <td>&a.philip;</td>
    <td>Synaptics updates to the psm(4) driver have resulted in poor
      interactivity for taps and button press events for some users.
      Support is now disabled by default but work will procede to fix the
      underlying problems.</td>
  </tr>

  <tr>
    <td>Scheduler-related hangs involving threads</td>
    <td>&status.untested;</td>
    <td>&a.scottl;, &a.julian;</td>
    <td>Significant work has happened in the scheduler to fix stability
      problems.  More testing for UP and SMP under heavily load is needed.</td>
  </tr>

  <tr>
    <td>NFS over IPv6 problems</td>
    <td>&status.done;</td>
    <td>&a.dwhite;</td>
    <td>&a.kuriyama; has reported problems with NFS over IPv6 not functioning
      correctly as of the improved NFS support for disconnection changes.
      &a.dwhite; has tracked down the source of the problem (EMSGSIZE being
      returned by IPv6 UDP send routine due to fragmentation), and is
      currently exploring possible fixes.  This problem appears to have
      been corrected.</td>
  </tr>

  <tr>
    <td>Reports of socket buffer corruption in tcp_output()</td>
    <td>&status.done;</td>
    <td>&a.rwatson;</td>
    <td>There have been reports of occasional corruption of socket buffers.
       This may have been the result of missing socket buffer locking in
       tcp_output(), which has now been corrected in 6.x and 5.x; this
       problem is believed to be fixed.</td>
  </tr>

  <tr>
    <td>Reports of hangs using i4b (isdn4bsd)</td>
    <td>&status.done;</td>
    <td>&a.rwatson;</td>
    <td>There have been reports of system hangs while using ISDN with the
      i4b ISDN framework on SMP systems.  These likely result from
      insufficient synchronization in the i4b implementation when runnning
      without the Giant lock over the network stack.  The workaround until
      this is fixed is to re-assert the Giant lock over the stack when
      i4b is compiled into the kernel; this has been committed to 6.x and
      and 5.x.  This problem appears to have been corrected.</td>
  </tr>

  <tr>
    <td>Problems with multicast and setuid binaries/daemons</td>
    <td>&status.done;</td>
    <td>&a.rwatson;, &a.csjp;</td>
    <td>There have been reports that multicast socket options on raw sockets
      no longer work properly with daemons changing privilege or setuid
      binaries.  These symptoms have been tracked down to bugs relating to
      permitting limited use of raw sockets in jail().  A patch correcting
      these problems has been merged to 6.x and 5.x.  This problem appears
      to have been corrected.</td>
  </tr>

  <tr>
    <td>Reports of sodealloc() panic under heavy load</td>
    <td>&status.done;</td>
    <td>&a.rwatson;, &a.green;</td>
    <td>There have been reports of a so_count invariant violation in
       sofree(), which may relate to race conditions in sofree() against
       accept(), which were recently corrected in 6.x, and has been merged
       to 5.x.  This problem appears to have been corrected.</td>
  </tr>

  <tr>
    <td>Merge of Darwin msdosfs, other fixes</td>
    <td>&status.done;</td>
    <td>--</td>
    <td>Apple's Darwin operating system has fairly extensive improvements
      to msdosfs and other kernel services; these fixes must be reviewed
      and merged to the FreeBSD tree.</td>
  </tr>

  <tr>
    <td>Reports of poor performance of the if_de driver (de ethernet
      interfaces)</td>
    <td>&status.done;</td>
    <td>&a.rwatson;, &a.jmg;</td>
    <td>There have been reports that if_de ethernet cds behave poorly when
      running with debug.mpsafenet=1, even though the driver is marked to
      run all portions with the Giant lock.  This suggests a race condition
      specific to this drive, which is currently being debugged.  A patch
      has been committed to the 6.x and 5.x branches, and appears to correct
      the problem.</td>
  </tr>

  <tr>
    <td>Threaded application get stuck in an unkillable state when touched
      by GDB</td>
    <td>&status.done;</td>
    <td>&a.davidxu;</td>
    <td>Attaching GDB to a threaded process will leave the process in an
      unkillable state.  Rebooting the machine is the only way to recover
      from this.  This is easily triggered when a KDE app crashes and KDE
      automatically attaches GDB to it to extract a stack trace.  A candidate
      fix is in 6-CURRENT.  More testing and review is needed.</td>
  </tr>

  <tr>
    <td>More truss problems</td>
    <td>&status.done;</td>
    <td>&a.alfred;</td>
    <td>Truss appears to have another problem.  It is repeatable by
      running "truss -f fsck -p /", suspending it with ^Z, and then
      killing truss.  It will leave behind the fsck processes which
      will be unkillable.</td>
  </tr>

  <tr>
    <td>Reports of TCP-related instability under extremely high load;
      possibly related to SACK</td>
    <td>&status.untested;</td>
    <td>&a.gnn;, &a.rwatson;, &a.scottl</td>
    <td>There have been reports that, under extremely high load, the
      tcp_output() routine may appear to run for extended periods, resulting
      in the appearance of a hang for an extended period (up to 30 minutes),
      followed by recovery.  A fix for SACK was developed and committed that
      hopefully corrects this problem.</td>
  </tr>

</table>

    &footer;

  </body>
</html>
