Manjesh Nilange created TS-1273:
-----------------------------------

             Summary: Crash report: selective deleting instances of mime header 
field which has duplicates causes core dump
                 Key: TS-1273
                 URL: https://issues.apache.org/jira/browse/TS-1273
             Project: Traffic Server
          Issue Type: Bug
          Components: MIME
    Affects Versions: 3.0.4
            Reporter: Manjesh Nilange


Try header plugin

#include <ts/ts.h>

static int deleteLastCookie(TSCont, TSEvent, void *);

void TSPluginInit(int argc, const char *argv[])
{
  TSCont globalCont = TSContCreate(deleteLastCookie, 0);
  TSHttpHookAdd(TS_HTTP_SEND_RESPONSE_HDR_HOOK, globalCont);
}

static int deleteLastCookie(TSCont cont, TSEvent event, void *edata)
{
  TSHttpTxn txn = static_cast<TSHttpTxn>(edata);
  TSMBuffer hdrBuf;
  TSMLoc hdrLoc;
  if (TSHttpTxnClientRespGet(txn, &hdrBuf, &hdrLoc) != TS_SUCCESS)
  {
    TSError("Could not get client response object");
    TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE);
    return 0;
  }
  TSMLoc fieldLoc = TSMimeHdrFieldFind(hdrBuf, hdrLoc, 
TS_MIME_FIELD_SET_COOKIE, -1);
  while (fieldLoc)
  {
    TSMLoc nextFieldLoc = TSMimeHdrFieldNextDup(hdrBuf, hdrLoc, fieldLoc);
    if (!nextFieldLoc)
    {
      TSMimeHdrFieldRemove(hdrBuf, hdrLoc, fieldLoc);
      TSMimeHdrFieldDestroy(hdrBuf, hdrLoc, fieldLoc);
    }
    TSHandleMLocRelease(hdrBuf, hdrLoc, fieldLoc);
    fieldLoc = nextFieldLoc;
  }
  TSHandleMLocRelease(hdrBuf, 0, hdrLoc);
  TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE);
  return 0;
}


with OS script

<?php
// bool setcookie ( string $name [, string $value [, int $expire = 0 [, string 
$path [, string $domain [, bool $secure = false [, bool $httponly = false 
]]]]]] )
  setcookie('foo', 'bar1');
  setcookie('foo', 'bar2', time() + 1000, "/", "www.test.com", false, false);
  setcookie('foo2', 'bar4', time() + 1000, "/", ".test.com", false, false);
  setcookie('foo', 'bar3', time() + 1000, "/", ".www.test.com", false, false);
  setcookie('foo2', 'bar4', time() + 1000, "/", ".test.com", false, false);
  setcookie('foo2', 'bar5', time() + 1000, "/", "test.com", false, false);
  setcookie('foo3', 'bar6');
  setcookie('foo3', 'bar6', time() + 1000, "/", "www.test.com", true, false);
?>
<html>
<body>
This is a test
</body>
</html>


And there's a core consistently with this stack trace

(gdb) bt
#0  mime_hdr_field_detach (mh=0x7ffff403f8c8, field=0x7ffff403fa58, 
detach_all_dups=false) at MIME.cc:1640
#1  0x00000000005a0237 in mime_hdr_field_delete (heap=0x7ffff403f810, 
mh=0x7ffff403f8c8, field=0x7ffff403fa58, 
    delete_all_dups=<value optimized out>) at MIME.cc:1688
#2  0x00000000004a6a51 in TSMimeHdrFieldDestroy (bufp=0x7fffec251ab8, 
mh_mloc=0x7ffff403f898, 
    field_mloc=0x7fffdc0258d0) at InkAPI.cc:2719
#3  0x00007fffed56ba73 in deleteLastCookie(tsapi_cont*, TSEvent, void*) ()
   from /home/mnilange/temp/mime-field-crash.so
#4  0x00000000005137a5 in HttpSM::state_api_callout (this=0x7fffec2511c0, 
event=<value optimized out>, 
    data=<value optimized out>) at HttpSM.cc:1374
#5  0x000000000051bc6c in HttpSM::set_next_state (this=0x7fffec2511c0) at 
HttpSM.cc:6534
#6  0x000000000050912f in HttpSM::call_transact_and_set_next_state 
(this=0x7fffec2511c0, f=<value optimized out>)
    at HttpSM.cc:6329
#7  0x00000000005134f8 in HttpSM::state_api_callout (this=0x7fffec2511c0, 
event=0, data=0x0) at HttpSM.cc:1448
#8  0x0000000000514d38 in do_api_callout (this=0x7fffec2511c0, event=100, 
data=0x7fffe401db80) at HttpSM.cc:497
#9  HttpSM::state_read_server_response_header (this=0x7fffec2511c0, event=100, 
data=0x7fffe401db80)
    at HttpSM.cc:1826
#10 0x0000000000515cc8 in HttpSM::main_handler (this=0x7fffec2511c0, event=100, 
data=0x7fffe401db80)
    at HttpSM.cc:2439
#11 0x00000000006346bb in handleEvent (event=<value optimized out>, 
vc=0x7fffe401d9c0)
    at ../../iocore/eventsystem/I_Continuation.h:146
#12 read_signal_and_update (event=<value optimized out>, vc=0x7fffe401d9c0) at 
UnixNetVConnection.cc:138
#13 0x00000000006371f1 in read_from_net (nh=0x7ffff6630628, vc=0x7fffe401d9c0, 
thread=<value optimized out>)
    at UnixNetVConnection.cc:320
#14 0x0000000000630952 in NetHandler::mainNetEvent (this=0x7ffff6630628, 
event=<value optimized out>, 
    e=<value optimized out>) at UnixNet.cc:389
#15 0x0000000000656d24 in handleEvent (this=0x7ffff662f010, e=0xfc1190, 
calling_code=5) at I_Continuation.h:146
#16 EThread::process_event (this=0x7ffff662f010, e=0xfc1190, calling_code=5) at 
UnixEThread.cc:140
#17 0x00000000006576b3 in EThread::execute (this=0x7ffff662f010) at 
UnixEThread.cc:262
#18 0x0000000000655f82 in spawn_thread_internal (a=0xfbb570) at Thread.cc:88
#19 0x000000320aa077e1 in start_thread () from /lib64/libpthread.so.0
#20 0x000000320a6e68ed in clone () from /lib64/libc.so.6


proxy/hdrs/MIME.cc:1640 shows

   while (prev && (prev->m_next_dup != field))
      prev = prev->m_next_dup;
    ink_assert(prev != NULL);

    if (prev->m_next_dup == field)
      prev->m_next_dup = next_dup;


so prev is not expected to be null, but is part of the while condition - 
contradictory.




--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to