> -----Original Message-----
> From: Gomez Castellanos, Ivan
> Sent: Monday, February 08, 2010 11:42 PM
> To: [email protected]
> Cc: [email protected]; [email protected];
> [email protected]; Menon, Nishanth
> Subject: [PATCH] DSPBRIDGE: Check pointers before they are dereferenced
> 
> From 124638072d09d79333fb03d59bb66b8aae184860 Mon Sep 17 00:00:00 2001
> From: Ivan Gomez <[email protected]>
> Date: Tue, 2 Feb 2010 19:37:17 -0600
> Subject: [PATCH] DSPBRIDGE: Check pointers before they are dereferenced
> 
> Check if pointers are NULL before they are dereferenced.
> 
> Signed-off-by: Ivan Gomez <[email protected]>
> ---
>  drivers/dsp/bridge/pmgr/chnl.c  |   10 ++++++----
>  drivers/dsp/bridge/pmgr/cmm.c   |    6 ++++--
>  drivers/dsp/bridge/pmgr/io.c    |   10 ++++++----
>  drivers/dsp/bridge/pmgr/msg.c   |    9 ++++++---
>  drivers/dsp/bridge/rmgr/dbdcd.c |   23 +++++++++++++++++++++++
>  drivers/dsp/bridge/rmgr/disp.c  |    2 +-
>  drivers/dsp/bridge/rmgr/nldr.c  |   15 +++++----------
>  drivers/dsp/bridge/rmgr/node.c  |   10 +++++-----
>  drivers/dsp/bridge/rmgr/proc.c  |   10 +++++-----
>  9 files changed, 61 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/dsp/bridge/pmgr/chnl.c
> b/drivers/dsp/bridge/pmgr/chnl.c
> index fd487f0..e92d402 100644
> --- a/drivers/dsp/bridge/pmgr/chnl.c
> +++ b/drivers/dsp/bridge/pmgr/chnl.c
> @@ -106,10 +106,12 @@ DSP_STATUS CHNL_Create(OUT struct CHNL_MGR
> **phChnlMgr,
> 
>       if (DSP_SUCCEEDED(status)) {
>               struct WMD_DRV_INTERFACE *pIntfFxns;
> -             DEV_GetIntfFxns(hDevObject, &pIntfFxns);
> -             /* Let WMD channel module finish the create: */
> -             status = (*pIntfFxns->pfnChnlCreate)(&hChnlMgr, hDevObject,
> -                       pMgrAttrs);
> +             status = DEV_GetIntfFxns(hDevObject, &pIntfFxns);
> +             if (pIntfFxns) {
> +                     /* Let WMD channel module finish the create */
> +                     status = (*pIntfFxns->pfnChnlCreate)(&hChnlMgr,
> +                                             hDevObject, pMgrAttrs);
> +             }
>               if (DSP_SUCCEEDED(status)) {
>                       /* Fill in WCD channel module's fields of the
>                        * CHNL_MGR structure */
> diff --git a/drivers/dsp/bridge/pmgr/cmm.c b/drivers/dsp/bridge/pmgr/cmm.c
> index 63d1dec..d3b7c01 100644
> --- a/drivers/dsp/bridge/pmgr/cmm.c
> +++ b/drivers/dsp/bridge/pmgr/cmm.c
> @@ -212,8 +212,10 @@ void *CMM_CallocBuf(struct CMM_OBJECT *hCmmMgr, u32
> uSize,
>                               pNewNode = GetNode(pCmmMgr, pNode->dwPA + uSize,
>                                          pNode->dwVA + uSize,
>                                          (u32)uDeltaSize);
> -                             /* leftovers go free */
> -                             AddToFreeList(pAllocator, pNewNode);
> +                             if (pNewNode) {
> +                                     /* leftovers go free */
> +                                     AddToFreeList(pAllocator, pNewNode);
> +                             }
>                               /* adjust our node's size */
>                               pNode->ulSize = uSize;
>                       }
> diff --git a/drivers/dsp/bridge/pmgr/io.c b/drivers/dsp/bridge/pmgr/io.c
> index 5dbb784..ce2912e 100644
> --- a/drivers/dsp/bridge/pmgr/io.c
> +++ b/drivers/dsp/bridge/pmgr/io.c
> @@ -85,11 +85,13 @@ DSP_STATUS IO_Create(OUT struct IO_MGR **phIOMgr,
> struct DEV_OBJECT *hDevObject,
>       }
> 
>       if (DSP_SUCCEEDED(status)) {
> -             DEV_GetIntfFxns(hDevObject, &pIntfFxns);
> +             status = DEV_GetIntfFxns(hDevObject, &pIntfFxns);
> 
> -             /* Let WMD channel module finish the create: */
> -             status = (*pIntfFxns->pfnIOCreate)(&hIOMgr, hDevObject,
> -                      pMgrAttrs);
> +             if (pIntfFxns) {
> +                     /* Let WMD channel module finish the create */
> +                     status = (*pIntfFxns->pfnIOCreate)(&hIOMgr, hDevObject,
> +                                     pMgrAttrs);
> +             }
> 
>               if (DSP_SUCCEEDED(status)) {
>                       pIOMgr = (struct IO_MGR_ *) hIOMgr;
> diff --git a/drivers/dsp/bridge/pmgr/msg.c b/drivers/dsp/bridge/pmgr/msg.c
> index 355470a..a03d3eb 100644
> --- a/drivers/dsp/bridge/pmgr/msg.c
> +++ b/drivers/dsp/bridge/pmgr/msg.c
> @@ -73,10 +73,13 @@ DSP_STATUS MSG_Create(OUT struct MSG_MGR **phMsgMgr,
> 
>       *phMsgMgr = NULL;
> 
> -     DEV_GetIntfFxns(hDevObject, &pIntfFxns);
> +     status = DEV_GetIntfFxns(hDevObject, &pIntfFxns);
> 
> -     /* Let WMD message module finish the create: */
> -     status = (*pIntfFxns->pfnMsgCreate)(&hMsgMgr, hDevObject,
> msgCallback);
> +     if (pIntfFxns) {
> +             /* Let WMD message module finish the create */
> +             status = (*pIntfFxns->pfnMsgCreate)(&hMsgMgr,
> +                             hDevObject, msgCallback);
> +     }

Else? Should'nt we get out of this flow?

> 
>       if (DSP_SUCCEEDED(status)) {
>               /* Fill in WCD message module's fields of the MSG_MGR
> diff --git a/drivers/dsp/bridge/rmgr/dbdcd.c
> b/drivers/dsp/bridge/rmgr/dbdcd.c
> index 261ef4f..214131c 100644
> --- a/drivers/dsp/bridge/rmgr/dbdcd.c
> +++ b/drivers/dsp/bridge/rmgr/dbdcd.c
> @@ -1194,6 +1194,10 @@ static DSP_STATUS GetAttrsFromBuf(char *pszBuf, u32
> ulBufSize,
>               cLen = strlen(token);
>               pGenObj->objData.nodeObj.pstrCreatePhaseFxn =
>                       MEM_Calloc(cLen + 1, MEM_PAGED);
> +             if (!pGenObj->objData.nodeObj.pstrCreatePhaseFxn) {
> +                     status = DSP_EMEMORY;
> +                     break;
> +             }
>               strncpy(pGenObj->objData.nodeObj.pstrCreatePhaseFxn,
>                       token, cLen);
>               pGenObj->objData.nodeObj.pstrCreatePhaseFxn[cLen] = '\0';
> @@ -1204,6 +1208,10 @@ static DSP_STATUS GetAttrsFromBuf(char *pszBuf, u32
> ulBufSize,
>               cLen = strlen(token);
>               pGenObj->objData.nodeObj.pstrExecutePhaseFxn =
>                        MEM_Calloc(cLen + 1, MEM_PAGED);
> +             if (!pGenObj->objData.nodeObj.pstrExecutePhaseFxn) {
> +                     status = DSP_EMEMORY;
> +                     break;
> +             }
>               strncpy(pGenObj->objData.nodeObj.pstrExecutePhaseFxn,
>                       token, cLen);
>               pGenObj->objData.nodeObj.pstrExecutePhaseFxn[cLen] = '\0';
> @@ -1214,6 +1222,10 @@ static DSP_STATUS GetAttrsFromBuf(char *pszBuf, u32
> ulBufSize,
>               cLen = strlen(token);
>               pGenObj->objData.nodeObj.pstrDeletePhaseFxn =
>                       MEM_Calloc(cLen + 1, MEM_PAGED);
> +             if (!pGenObj->objData.nodeObj.pstrDeletePhaseFxn) {
> +                     status = DSP_EMEMORY;
> +                     break;
> +             }
>               strncpy(pGenObj->objData.nodeObj.pstrDeletePhaseFxn,
>                       token, cLen);
>               pGenObj->objData.nodeObj.pstrDeletePhaseFxn[cLen] = '\0';
> @@ -1232,6 +1244,10 @@ static DSP_STATUS GetAttrsFromBuf(char *pszBuf, u32
> ulBufSize,
>                       cLen = strlen(token);
>                       pGenObj->objData.nodeObj.pstrIAlgName =
>                               MEM_Calloc(cLen + 1, MEM_PAGED);
> +                     if (!pGenObj->objData.nodeObj.pstrIAlgName) {
> +                             status = DSP_EMEMORY;
> +                             break;
> +                     }
>                       strncpy(pGenObj->objData.nodeObj.pstrIAlgName,
>                               token, cLen);
>                       pGenObj->objData.nodeObj.pstrIAlgName[cLen] = '\0';
> @@ -1338,6 +1354,13 @@ static DSP_STATUS GetAttrsFromBuf(char *pszBuf, u32
> ulBufSize,
>               break;
>       }
> 
> +     /* Check for Memory leak */
> +     if (status == DSP_EMEMORY) {
> +             MEM_Free(pGenObj->objData.nodeObj.pstrCreatePhaseFxn);
> +             MEM_Free(pGenObj->objData.nodeObj.pstrExecutePhaseFxn);
> +             MEM_Free(pGenObj->objData.nodeObj.pstrDeletePhaseFxn);
> +     }
> +


Is'nt any other error condition also requiring a memfree of allocated memories? 
And why not use kfree? I think ameya removed the MEM_Free wrappers rt?

>       return status;
>  }
> 
> diff --git a/drivers/dsp/bridge/rmgr/disp.c
> b/drivers/dsp/bridge/rmgr/disp.c
> index 949c5e3..c02cb0d 100644
> --- a/drivers/dsp/bridge/rmgr/disp.c
> +++ b/drivers/dsp/bridge/rmgr/disp.c
> @@ -133,7 +133,7 @@ DSP_STATUS DISP_Create(OUT struct DISP_OBJECT
> **phDispObject,
>       if (DSP_SUCCEEDED(status)) {
>               status = DEV_GetChnlMgr(hDevObject, &(pDisp->hChnlMgr));
>               if (DSP_SUCCEEDED(status)) {
> -                     (void) DEV_GetIntfFxns(hDevObject, &pIntfFxns);
> +                     status = DEV_GetIntfFxns(hDevObject, &pIntfFxns);
>                       pDisp->pIntfFxns = pIntfFxns;
>               } else {
>                       GT_1trace(DISP_DebugMask, GT_6CLASS,
> diff --git a/drivers/dsp/bridge/rmgr/nldr.c
> b/drivers/dsp/bridge/rmgr/nldr.c
> index 4d38419..1e9eb07 100644
> --- a/drivers/dsp/bridge/rmgr/nldr.c
> +++ b/drivers/dsp/bridge/rmgr/nldr.c
> @@ -478,17 +478,12 @@ DSP_STATUS NLDR_Create(OUT struct NLDR_OBJECT
> **phNldr,
>       MEM_AllocObject(pNldr, struct NLDR_OBJECT, NLDR_SIGNATURE);
>       if (pNldr) {
>               pNldr->hDevObject = hDevObject;
> -             /* warning, lazy status checking alert! */
>               status = DEV_GetCodMgr(hDevObject, &hCodMgr);
> -             DBC_Assert(DSP_SUCCEEDED(status));
> -             status = COD_GetLoader(hCodMgr, &pNldr->dbll);
> -             DBC_Assert(DSP_SUCCEEDED(status));
> -             status = COD_GetBaseLib(hCodMgr, &pNldr->baseLib);
> -             DBC_Assert(DSP_SUCCEEDED(status));
> -             status = COD_GetBaseName(hCodMgr, szZLFile,
> COD_MAXPATHLENGTH);
> -             DBC_Assert(DSP_SUCCEEDED(status));
> -             status = DSP_SOK;
> -             /* end lazy status checking */
> +             if (hCodMgr) {
> +                     COD_GetLoader(hCodMgr, &pNldr->dbll);
> +                     COD_GetBaseLib(hCodMgr, &pNldr->baseLib);
> +                     COD_GetBaseName(hCodMgr, szZLFile, COD_MAXPATHLENGTH);
> +             }

All the error checks for failure of GetLoader, GetBaseLib, GetBaseName are 
gone? If they will never return failures, should'nt those functions be 
converted to voids instead(separate patch)?

>               pNldr->usDSPMauSize = pAttrs->usDSPMauSize;
>               pNldr->usDSPWordSize = pAttrs->usDSPWordSize;
>               pNldr->dbllFxns = dbllFxns;
> diff --git a/drivers/dsp/bridge/rmgr/node.c
> b/drivers/dsp/bridge/rmgr/node.c
> index 28513b8..00945a7 100644
> --- a/drivers/dsp/bridge/rmgr/node.c
> +++ b/drivers/dsp/bridge/rmgr/node.c
> @@ -3238,12 +3238,12 @@ DSP_STATUS NODE_GetUUIDProps(DSP_HPROCESSOR
> hProcessor,
>                pNodeId, pNodeProps);
> 
>       status = PROC_GetDevObject(hProcessor, &hDevObject);
> -     if (hDevObject != NULL) {
> +     if (hDevObject != NULL)
Note: you will have to rebase your patch - there has been a bit of patches that 
changed code here..

Further, hDevObject was not initialized to NULL, so should'nt status be used to 
check instead of hDevObject?

>               status = DEV_GetNodeManager(hDevObject, &hNodeMgr);
> -             if (hNodeMgr == NULL) {
> -                     status = DSP_EHANDLE;
> -                     goto func_end;
> -             }
> +
> +     if (hNodeMgr == NULL) {
> +             status = DSP_EHANDLE;
> +             goto func_end;
>       }
> 
>       /*
> diff --git a/drivers/dsp/bridge/rmgr/proc.c
> b/drivers/dsp/bridge/rmgr/proc.c
> index 0c105ee..b45560b 100644
> --- a/drivers/dsp/bridge/rmgr/proc.c
> +++ b/drivers/dsp/bridge/rmgr/proc.c
> @@ -504,12 +504,12 @@ DSP_STATUS PROC_Detach(struct PROCESS_CONTEXT
> *pr_ctxt)
>               pProcObject = (struct PROC_OBJECT *)pr_ctxt->hProcessor;
> 
>       if (MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) {
> -             /* Notify the Client */
> -             NTFY_Notify(pProcObject->hNtfy, DSP_PROCESSORDETACH);
> -             /* Remove the notification memory */
> -             if (pProcObject->hNtfy)
> +             if (pProcObject->hNtfy) {
> +                     /* Notify the Client */
> +                     NTFY_Notify(pProcObject->hNtfy, DSP_PROCESSORDETACH);
> +                     /* Remove the notification memory */

This change does not seem to belong to this patch! This is not a null pointer 
check change...

>                       NTFY_Delete(pProcObject->hNtfy);
> -
> +             }
>               if (pProcObject->g_pszLastCoff) {
>                       MEM_Free(pProcObject->g_pszLastCoff);
>                       pProcObject->g_pszLastCoff = NULL;
> --
> 1.5.4.3



Regards,
Nishanth Menon

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to