summaryrefslogtreecommitdiff
path: root/sapi/litespeed/lsapilib.c
diff options
context:
space:
mode:
authorGeorge Wang <gwang@php.net>2015-12-09 00:06:49 -0500
committerGeorge Wang <gwang@php.net>2015-12-09 00:06:49 -0500
commit372a8390409b066d34739c39bbf4f1087afc72ca (patch)
treed9eb40ff60b63c1cfc93f04ea8c5082b045e384a /sapi/litespeed/lsapilib.c
parent292aa9d6cb3a6632b94a87ef3ba581eb85510a11 (diff)
downloadphp-git-372a8390409b066d34739c39bbf4f1087afc72ca.tar.gz
Add sanitizing checks for request data.
Diffstat (limited to 'sapi/litespeed/lsapilib.c')
-rw-r--r--sapi/litespeed/lsapilib.c56
1 files changed, 54 insertions, 2 deletions
diff --git a/sapi/litespeed/lsapilib.c b/sapi/litespeed/lsapilib.c
index 4b28c968ea..a542771aab 100644
--- a/sapi/litespeed/lsapilib.c
+++ b/sapi/litespeed/lsapilib.c
@@ -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;
@@ -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;
@@ -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;
@@ -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 )
{