Comment 9 for bug 961904

Revision history for this message
James E. Flemer (jflemer) wrote :

In the case above,
  packet->universal = NULL
So trying to update the (linked list) "packet_list" pointer causes the segfault:
  if (packet->universal->packet_list == packet)

Is the call to gearman_packet_free() (libgearman/worker.cc:788) correct for "NO_JOB"?

Here's the whole "packet":
$4 = {options = {allocated = false, complete = false, free_data = false}, magic = GEARMAN_MAGIC_RESPONSE, command = GEARMAN_COMMAND_NO_JOB, argc = 0 '\000', args_size = 12,
  data_size = 0, universal = 0x0, next = 0x0, prev = 0x0, args = 0x214f270 "", data = 0x0, arg = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, arg_size = {0, 0, 0, 0, 0, 0, 0, 0},
  args_buffer = "\000RES\000\000\000\n", '\000' <repeats 119 times>}

Up one level of the stack, the "job" (worker->job) is:

$2 = {options = {allocated = true, assigned_in_use = false, work_in_use = false, finished = false}, worker = 0x1ffc598, next = 0x0, prev = 0x0, con = 0x0, assigned = {
    options = {allocated = false, complete = false, free_data = false}, magic = GEARMAN_MAGIC_RESPONSE, command = GEARMAN_COMMAND_NO_JOB, argc = 0 '\000', args_size = 12,
    data_size = 0, universal = 0x0, next = 0x0, prev = 0x0, args = 0x214f270 "", data = 0x0, arg = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, arg_size = {0, 0, 0, 0, 0, 0, 0,
      0}, args_buffer = "\000RES\000\000\000\n", '\000' <repeats 119 times>}, work = {options = {allocated = false, complete = false, free_data = false},
    magic = GEARMAN_MAGIC_TEXT, command = GEARMAN_COMMAND_TEXT, argc = 0 '\000', args_size = 0, data_size = 0, universal = 0x0, next = 0x0, prev = 0x0, args = 0x0, data = 0x0,
    arg = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, arg_size = {0, 0, 0, 0, 0, 0, 0, 0}, args_buffer = '\000' <repeats 127 times>}, reducer = 0x0,
  error_code = GEARMAN_UNKNOWN_STATE}