int *curSize, int newSize )
{
struct LSAPI_key_value_pair * pBuf;
- if ( *curSize >= newSize )
+ if ( *curSize >= newSize )
return 0;
if ( newSize > 8192 )
return -1;
}
}
+
+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;
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;
{
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 )
{