cgit 1.2.3: lighttpd 1.4.57, AlpineLinux [edge]: using cache breaks delivery

Steffen Nurpmeso steffen at sdaoden.eu
Tue Dec 22 16:09:57 CET 2020


Hello!

Steffen Nurpmeso wrote in
 <20201222135537.ovyl4%steffen at sdaoden.eu>:
 |gs-cgit-lists.zx2c4.com at gluelogic.com wrote in
 | <20201222061206.GA54419 at xps13>:
 ||>Steffen Nurpmeso wrote in
 ||> <20201221193127.zbZeP%steffen at sdaoden.eu>:
 ||>|John Keeping wrote in
 ||>| <X+DiDgGaPaynnocI at john.keeping.me.uk>:
 ||>||On Mon, Dec 21, 2020 at 05:26:19PM +0100, Steffen Nurpmeso wrote:
 ||>||> I discovered today that cgit no longer delivers pages, and it must
 ||>||> have been like that for some time.  The server looks show
 ||>||> successful delivery, the cgit cache is populated and rotated just
 ||>||> correctly, but all cgit delivers is that final error of main() as
 ||>||> 
 ||>||>   <div class='error'>Error processing page: Invalid argument \
 ||>||>   (22)</div\
 ||>||>>
 ||> ...
 ||>||> I am pretty sure cgit delivered some weeks ago, the most notable
 ||>||> difference is that AlpineLinux switched to Lighttpd 1.4.56 then
 ||>||> .57, which seems to have brought tremendous changes under the
 ||> ...
 ||>|But the file was generated normally:
 ||>|
 ||>|  # ll /var/lib/lighttpd/cgit/b1000000
 ||>|  -rw-------    1 lighttpd lighttpd     23417 Dec 21 20:22 /var/lib/ligh\
 ||>|  t\
 ||>|  tpd/cgit/b1000000
 ||> ...
 ||>
 ||>Slightly resorted:
 ||>
 ||> ...
 ||>||Have you looked at the log output?
 ||>|  [cgit] error printing cache /var/lib/lighttpd/cgit/b1000000: Invalid \
 ||>|  argument (22)
 ||> ...
 ||>||and this may be caused by sendfile(2) failing due to some difference in
 ||>||how the web server is setting up the output file descriptor.  You may
 ||>||want to rebuild CGit without HAVE_LINUX_SENDFILE and see if that works.
 ||>
 ||>So i build it with
 | ...
 ||>  -       CGIT_CFLAGS += -DHAVE_LINUX_SENDFILE
 ||>  +       #CGIT_CFLAGS += -DHAVE_LINUX_SENDFILE
 | ...
 ||>and .. it works.
 ||>
 ||>Thank you, i will open an AlpineLinux bug report.  And lighttpd.
 | ...
 |
 ||I would like to propose an alternative and more portable solution:
 ||
 ||cgit cache should fallback to lseek, xread, xwrite if sendfile fails.
 |
 |(Yes.)
 ....

  diff --git a/cache.c b/cache.c
  index 2c70be7..7fbab66 100644
  --- a/cache.c
  +++ b/cache.c
  @@ -85,6 +85,7 @@ static int close_slot(struct cache_slot *slot)
   /* Print the content of the active cache slot (but skip the key). */
   static int print_slot(struct cache_slot *slot)
   {
  +       ssize_t i, j;
   #ifdef HAVE_LINUX_SENDFILE
          off_t start_off;
          int ret;
  @@ -97,12 +98,13 @@ static int print_slot(struct cache_slot *slot)
                  if (ret < 0) {
                          if (errno == EAGAIN || errno == EINTR)
                                  continue;
  +                       if (start_off == slot->keylen + 1)
  +                               break;

I can confirm this hunk fixes the bug.
If i remove it i get the error, with it you are fine.

                          return errno;
                  }
                  return 0;
          } while (1);
  -#else
  -       ssize_t i, j;
  +#endif
  
          i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET);
          if (i != slot->keylen + 1)
  @@ -118,7 +120,6 @@ static int print_slot(struct cache_slot *slot)
                  return errno;
          else
                  return 0;
  -#endif
   }
  
   /* Check if the slot has expired */
  
Thanks :), and ciao from Germany,

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)


More information about the CGit mailing list