I have investigated the problem more and found a simple workaround, but
not a fix:

When creating or removing a queue, the printer is (un)registered for
DNS-SD broadcasting this queue and CUPS (all in scheduler/dirsvc.c)
keeps in an array (DNSSDPrinters) which queues are broadcasting. CUPS
adds the DNS-SD service name to the printer's record (reg_name in
cupsd_printer_s, scheduler/printers.h) and then adds the record to the
array (scheduler/dirsvc.c, line 2903), with the service name as
sorting/searching criteria (dnssdComparePrinters() function).

When it removes a queue, CUPS searches the record in the array to remove
it and afterwards sets the service name in the record to NULL
(scheduler/dirsvc.c, line 2680). When creating a queue CUPS searches the
array to find the correct place for the new record, so that they keep
sorted. All this is done by CUPS' own array infrastructure in
cups/array.c.

On this array search (it does a binary search, function
cups_array_find() in cups/array.c) it chokes on a record in the array
where the pointer to the service name (p->reg_name) is neither the start
address of a string nor 0 (NULL), but 1 (!), so it is a pointer to the
memory address 0x1 (see variable t in step #0 of the back trace). I did
not find out how this happened, but I can work around it by defining the
array without comparison function (set it to NULL in line 1653 of
scheduler/dirsvc.c), getting an unsorted array which is searched
linearly with only pointer comparisons (cups/array.c, line 104):

    for (current = 0; current < a->num_elements; current ++)
      if (a->elements[current] == e)
      {
        diff = 0;
        break;
      }

Array size is the number of locally defined queues. Most users have less
than 100. If it comes high a server has around 10000 queues. So
searching linearly here should not introduce a too high delay and the
workaround therefore should not be a problem.

Applying the workaround at least for Oneiric ...

** Changed in: cups (Ubuntu)
       Status: Confirmed => Triaged

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/855445

Title:
  cupsd crashed with SIGSEGV in _cups_strcasecmp()

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/cups/+bug/855445/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to