Skip to content

Commit

Permalink
Add sanitizing checks for request data.
Browse files Browse the repository at this point in the history
  • Loading branch information
George Wang authored and weltling committed Dec 9, 2015
1 parent af1ac75 commit 5a319a0
Showing 1 changed file with 54 additions and 2 deletions.
56 changes: 54 additions & 2 deletions sapi/litespeed/lsapilib.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ static int allocateEnvList( struct LSAPI_key_value_pair ** pEnvList,
int *curSize, int newSize )
{
struct LSAPI_key_value_pair * pBuf;
if ( *curSize >= newSize )
if ( *curSize >= newSize )
return 0;
if ( newSize > 8192 )
return -1;
Expand Down Expand Up @@ -559,6 +559,40 @@ static void fixHeaderIndexEndian( LSAPI_Request * pReq )
}
}


static int validateHeaders( LSAPI_Request * pReq )
{
int totalLen = pReq->m_pHeader->m_httpHeaderLen;
int i;
for(i = 0; i < H_TRANSFER_ENCODING; ++i)
{
if ( pReq->m_pHeaderIndex->m_headerOff[i] )
{
if (pReq->m_pHeaderIndex->m_headerOff[i] > totalLen
|| pReq->m_pHeaderIndex->m_headerLen[i]
+ pReq->m_pHeaderIndex->m_headerOff[i] > totalLen)
return -1;
}
}
if (pReq->m_pHeader->m_cntUnknownHeaders > 0)
{
struct lsapi_header_offset * pCur, *pEnd;
pCur = pReq->m_pUnknownHeader;
pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders;
while( pCur < pEnd )
{
if (pCur->nameOff > totalLen
|| pCur->nameOff + pCur->nameLen > totalLen
|| pCur->valueOff > totalLen
|| pCur->valueOff + pCur->valueLen > totalLen)
return -1;
++pCur;
}
}
return 0;
}


static uid_t s_uid = 0;
static uid_t s_defaultUid; //web server need set this
static gid_t s_defaultGid;
Expand Down Expand Up @@ -999,7 +1033,18 @@ static int parseRequest( LSAPI_Request * pReq, int totalLen )
if ( parseEnv( pReq->m_pEnvList, pReq->m_pHeader->m_cntEnv,
&pBegin, pEnd ) == -1 )
return -1;

if (pReq->m_pHeader->m_scriptFileOff < 0
|| pReq->m_pHeader->m_scriptFileOff >= totalLen
|| pReq->m_pHeader->m_scriptNameOff < 0
|| pReq->m_pHeader->m_scriptNameOff >= totalLen
|| pReq->m_pHeader->m_queryStringOff < 0
|| pReq->m_pHeader->m_queryStringOff >= totalLen
|| pReq->m_pHeader->m_requestMethodOff < 0
|| pReq->m_pHeader->m_requestMethodOff >= totalLen)
{
fprintf(stderr, "%d: bad request header - ERROR#1\n", getpid());
return -1;
}
pReq->m_pScriptFile = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptFileOff;
pReq->m_pScriptName = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptNameOff;
pReq->m_pQueryString = pReq->m_pReqBuf + pReq->m_pHeader->m_queryStringOff;
Expand All @@ -1025,6 +1070,13 @@ static int parseRequest( LSAPI_Request * pReq, int totalLen )
{
fixHeaderIndexEndian( pReq );
}

if (validateHeaders(pReq) == -1)
{
fprintf(stderr, "%d: bad request header - ERROR#2\n", getpid());
return -1;
}

pReq->m_reqBodyLen = pReq->m_pHeader->m_reqBodyLen;
if ( pReq->m_reqBodyLen == -2 )
{
Expand Down

0 comments on commit 5a319a0

Please sign in to comment.