VirtualBox

Ignore:
Timestamp:
Sep 16, 2009 12:59:18 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
52402
Message:

VBoxNetAdp: ioctl cleanup.

Location:
trunk/src/VBox/HostDrivers/VBoxNetAdp
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c

    r18973 r23068  
    12321232        PVBOXNETADP pThis = &g_aAdapters[i];
    12331233        Log2(("VBoxNetAdp: Scanning entry: state=%d name=%s\n", pThis->enmState, pThis->szName));
    1234         if (strncmp(pThis->szName, pszName, VBOXNETADP_MAX_NAME_LEN) == 0)
    1235             if (ASMAtomicReadU32((uint32_t volatile *)&pThis->enmState) == kVBoxNetAdpState_Active)
    1236                 return pThis;
     1234        if (   strcmp(pThis->szName, pszName) == 0
     1235            && ASMAtomicReadU32((uint32_t volatile *)&pThis->enmState) == kVBoxNetAdpState_Active)
     1236            return pThis;
    12371237    }
    12381238    return NULL;
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp

    r20374 r23068  
    867867static int VBoxNetAdpDarwinIOCtl(dev_t Dev, u_long iCmd, caddr_t pData, int fFlags, struct proc *pProcess)
    868868{
    869     int rc = VINF_SUCCESS;
    870869    uint32_t cbReq = IOCPARM_LEN(iCmd);
    871870    PVBOXNETADPREQ pReq = (PVBOXNETADPREQ)pData;
     871    int rc;
    872872
    873873    Log(("VBoxNetAdpDarwinIOCtl: param len %#x; iCmd=%#lx\n", cbReq, iCmd));
     
    875875    {
    876876        case IOCBASECMD(VBOXNETADP_CTL_ADD):
    877             if ((IOC_DIRMASK & iCmd) == IOC_OUT)
    878             {
    879                 PVBOXNETADP pNew;
    880                 rc = vboxNetAdpCreate(&pNew);
    881                 if (RT_SUCCESS(rc))
    882                 {
    883                     if (cbReq < sizeof(VBOXNETADPREQ))
    884                     {
    885                         OSDBGPRINT(("VBoxNetAdpDarwinIOCtl: param len %#x < req size %#x; iCmd=%#lx\n", cbReq, sizeof(VBOXNETADPREQ), iCmd));
    886                         return EINVAL;
    887                     }
    888                     strncpy(pReq->szName, pNew->szName, sizeof(pReq->szName));
    889                 }
    890             }
     877        {
     878            if (   (IOC_DIRMASK & iCmd) != IOC_OUT
     879                || cbReq < sizeof(VBOXNETADPREQ))
     880                return EINVAL;
     881
     882            PVBOXNETADP pNew;
     883            rc = vboxNetAdpCreate(&pNew);
     884            if (RT_FAILURE(rc))
     885                return EINVAL;
     886
     887            Assert(strlen(pReq->szName) < sizeof(pReq->szName));
     888            strncpy(pReq->szName, pNew->szName, sizeof(pReq->szName) - 1);
     889            pReq->szName[sizeof(pReq->szName) - 1] = '\0';
     890            Log(("VBoxNetAdpDarwinIOCtl: Added '%s'\n", pReq->szName));
    891891            break;
     892        }
    892893
    893894        case IOCBASECMD(VBOXNETADP_CTL_REMOVE):
    894             for (unsigned i = 0; i < RT_ELEMENTS(g_aAdapters); i++)
    895             {
    896                 PVBOXNETADP pThis = &g_aAdapters[i];
    897                 rc = VERR_NOT_FOUND;
    898                 if (strncmp(pThis->szName, pReq->szName, VBOXNETADP_MAX_NAME_LEN) == 0)
    899                     if (ASMAtomicReadU32((uint32_t volatile *)&pThis->enmState) == kVBoxNetAdpState_Active)
    900                     {
    901                         rc = vboxNetAdpDestroy(pThis);
    902                         break;
    903                     }
    904             }
     895        {
     896            if (!memchr(pReq->szName, '\0', RT_MIN(cbReq, sizeof(pReq->szName))))
     897                return EINVAL;
     898
     899            PVBOXNETADP pAdp = vboxNetAdpFindByName(pReq->szName);
     900            if (!pAdp)
     901                return EINVAL;
     902
     903            rc = vboxNetAdpDestroy(pAdp);
     904            if (RT_FAILURE(rc))
     905                return EINVAL;
     906            Log(("VBoxNetAdpDarwinIOCtl: Removed %s\n", pReq->szName));
    905907            break;
     908        }
     909
    906910        default:
    907911            OSDBGPRINT(("VBoxNetAdpDarwinIOCtl: unknown command %x.\n", IOCBASECMD(iCmd)));
    908             rc = VERR_INVALID_PARAMETER;
    909             break;
    910     }
    911 
    912     return RT_SUCCESS(rc) ? 0 : EINVAL;
     912            return EINVAL;
     913    }
     914
     915    return 0;
    913916}
    914917
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c

    r22875 r23068  
    121121                return RTErrConvertToErrno(rc);
    122122            }
    123             /* Create dev node */ 
     123            /* Create dev node */
    124124            VBoxNetAdpFreeBSDcdev = make_dev(&vboxnetadp_cdevsw, 0,
    125125                UID_ROOT, GID_WHEEL, 0600, VBOXNETADP_CTL_DEV_NAME);
     
    149149VBoxNetAdpFreeBSDCtrlioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *td)
    150150{
    151     PVBOXNETADP pAdp = NULL;
     151    PVBOXNETADP pAdp;
    152152    PVBOXNETADPREQ pReq = (PVBOXNETADPREQ)data;
    153153    struct ifnet *ifp;
     
    157157    {
    158158        case VBOXNETADP_CTL_ADD:
    159             if (!(cmd & IOC_OUT))
    160                 return (EINVAL);
     159            if (   !(cmd & IOC_OUT)   /* paranoia*/
     160                || IOCPARM_LEN(iCmd) < sizeof(*pReq))
     161                return EINVAL;
    161162
    162163            rc = vboxNetAdpCreate(&pAdp);
    163164            if (RT_FAILURE(rc))
    164                 return (EINVAL);
    165 
    166             strncpy(pReq->szName, pAdp->szName, sizeof(pReq->szName));
    167             break;
     165                return EINVAL;
     166
     167            strncpy(pReq->szName, pAdp->szName, sizeof(pReq->szName) - 1);
     168            pReq->szName[sizeof(pReq->szName) - 1] = '\0';
     169            break;
     170
    168171        case VBOXNETADP_CTL_REMOVE:
     172            if (!memchr(pReq->szName, '\0', RT_MIN(sizeof(pReq->szName), IOCPARM_LEN(iCmd))))
     173                return EINVAL;
     174
    169175            pAdp = vboxNetAdpFindByName(pReq->szName);
    170             if (pAdp)
    171                 rc = vboxNetAdpDestroy(pAdp);
    172             else
    173                 return (EINVAL);
    174 
    175             if (RT_FAILURE(rc))
    176                 return (EINVAL);
    177 
    178             break;
     176            if (!pAdp)
     177                return EINVAL;
     178
     179            rc = vboxNetAdpDestroy(pAdp);
     180            if (RT_FAILURE(rc))
     181                return EINVAL;
     182
     183            break;
     184
    179185        default:
    180             return (EINVAL);
     186            return EINVAL;
    181187    }
    182188    return 0;
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/linux/VBoxNetAdp-linux.c

    r21682 r23068  
    257257{
    258258    VBOXNETADPREQ Req;
    259     PVBOXNETADP pAdp = NULL;
    260     int rc = VINF_SUCCESS;
    261     uint32_t cbReq =  _IOC_SIZE(uCmd);
    262 
    263     Log(("VBoxNetAdpLinuxIOCtl: param len %#x; uCmd=%#x; add=%#x\n", cbReq, uCmd, VBOXNETADP_CTL_ADD));
    264     if (RT_UNLIKELY(_IOC_SIZE(uCmd) != sizeof(Req)))
    265     {
    266         Log(("VBoxNetAdpLinuxIOCtl: bad ioctl sizeof(Req)=%#x _IOC_SIZE=%#x; uCmd=%#x.\n", sizeof(Req), cbReq, uCmd));
     259    PVBOXNETADP pAdp;
     260    int rc;
     261
     262    Log(("VBoxNetAdpLinuxIOCtl: param len %#x; uCmd=%#x; add=%#x\n", _IOC_SIZE(uCmd), uCmd, VBOXNETADP_CTL_ADD));
     263    if (RT_UNLIKELY(_IOC_SIZE(uCmd) != sizeof(Req))) /* paraonia */
     264    {
     265        Log(("VBoxNetAdpLinuxIOCtl: bad ioctl sizeof(Req)=%#x _IOC_SIZE=%#x; uCmd=%#x.\n", sizeof(Req), _IOC_SIZE(uCmd), uCmd));
    267266        return -EINVAL;
    268267    }
     268
    269269    switch (uCmd)
    270270    {
    271271        case VBOXNETADP_CTL_ADD:
    272272            Log(("VBoxNetAdpLinuxIOCtl: _IOC_DIR(uCmd)=%#x; IOC_OUT=%#x\n", _IOC_DIR(uCmd), IOC_OUT));
    273             if (uCmd & IOC_OUT)
    274             {
    275                 rc = vboxNetAdpCreate(&pAdp);
    276                 if (RT_SUCCESS(rc))
    277                 {
    278                     if (cbReq < sizeof(VBOXNETADPREQ))
    279                     {
    280                         printk(KERN_ERR "VBoxNetAdpLinuxIOCtl: param len %#x < req size %#zx; uCmd=%#x\n", cbReq, sizeof(VBOXNETADPREQ), uCmd);
    281                         return -EINVAL;
    282                     }
    283                     strncpy(Req.szName, pAdp->szName, sizeof(Req.szName));
    284                     if (RT_UNLIKELY(copy_to_user((void *)ulArg, &Req, sizeof(Req))))
    285                     {
    286                         /* this is really bad! */
    287                         printk(KERN_ERR "VBoxNetAdpLinuxIOCtl: copy_to_user(%#lx,,%#zx); uCmd=%#x!\n", ulArg, sizeof(Req), uCmd);
    288                         rc = -EFAULT;
    289                     }
    290                 }
    291             }
     273            rc = vboxNetAdpCreate(&pAdp);
     274            if (RT_FAILURE(rc))
     275            {
     276                Log(("VBoxNetAdpLinuxIOCtl: vboxNetAdpCreate -> %Rrc\n", rc));
     277                return -EINVAL;
     278            }
     279
     280            Assert(strlen(pAdp->szName) < sizeof(Req.szName));
     281            strncpy(Req.szName, pAdp->szName, sizeof(Req.szName) - 1);
     282            Req.szName[sizeof(Req.szName) - 1] = '\0';
     283
     284            if (RT_UNLIKELY(copy_to_user((void *)ulArg, &Req, sizeof(Req))))
     285            {
     286                /* this is really bad! */
     287                /** @todo remove the adapter again? */
     288                printk(KERN_ERR "VBoxNetAdpLinuxIOCtl: copy_to_user(%#lx,,%#zx); uCmd=%#x!\n", ulArg, sizeof(Req), uCmd);
     289                return -EFAULT;
     290            }
     291            Log(("VBoxNetAdpLinuxIOCtl: Successfully added '%s'\n", Req.szName));
    292292            break;
    293293
     
    299299            }
    300300            Log(("VBoxNetAdpLinuxIOCtl: Remove %s\n", Req.szName));
     301
    301302            pAdp = vboxNetAdpFindByName(Req.szName);
    302             if (pAdp)
    303                 rc = vboxNetAdpDestroy(pAdp);
    304             else
    305                 rc = VERR_NOT_FOUND;
     303            if (!pAdp)
     304            {
     305                Log(("VBoxNetAdpLinuxIOCtl: '%s' not found\n", Req.szName));
     306                return -EINVAL;
     307            }
     308
     309            rc = vboxNetAdpDestroy(pAdp);
     310            if (RT_FAILURE(rc))
     311            {
     312                Log(("VBoxNetAdpLinuxIOCtl: vboxNetAdpDestroy('%s') -> %Rrc\n", Req.szName, rc));
     313                return -EINVAL;
     314            }
     315            Log(("VBoxNetAdpLinuxIOCtl: Successfully removed '%s'\n", Req.szName));
    306316            break;
    307317
    308318        default:
    309319            printk(KERN_ERR "VBoxNetAdpLinuxIOCtl: unknown command %x.\n", uCmd);
    310             rc = VERR_INVALID_PARAMETER;
    311             break;
    312     }
    313 
    314     Log(("VBoxNetAdpLinuxIOCtl: rc=%Vrc\n", rc));
    315     return RT_SUCCESS(rc) ? 0 : -EINVAL;
     320            return -EINVAL;
     321    }
     322
     323    return 0;
    316324}
    317325
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette