Changeset 23068 in vbox for trunk/src/VBox/HostDrivers/VBoxNetAdp
- Timestamp:
- Sep 16, 2009 12:59:18 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 52402
- Location:
- trunk/src/VBox/HostDrivers/VBoxNetAdp
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c
r18973 r23068 1232 1232 PVBOXNETADP pThis = &g_aAdapters[i]; 1233 1233 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 1234 if ( strcmp(pThis->szName, pszName) == 0 1235 && ASMAtomicReadU32((uint32_t volatile *)&pThis->enmState) == kVBoxNetAdpState_Active) 1236 return pThis; 1237 1237 } 1238 1238 return NULL; -
trunk/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp
r20374 r23068 867 867 static int VBoxNetAdpDarwinIOCtl(dev_t Dev, u_long iCmd, caddr_t pData, int fFlags, struct proc *pProcess) 868 868 { 869 int rc = VINF_SUCCESS;870 869 uint32_t cbReq = IOCPARM_LEN(iCmd); 871 870 PVBOXNETADPREQ pReq = (PVBOXNETADPREQ)pData; 871 int rc; 872 872 873 873 Log(("VBoxNetAdpDarwinIOCtl: param len %#x; iCmd=%#lx\n", cbReq, iCmd)); … … 875 875 { 876 876 case IOCBASECMD(VBOXNETADP_CTL_ADD): 877 if ((IOC_DIRMASK & iCmd) == IOC_OUT)878 {879 PVBOXNETADP pNew;880 r c = 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)); 891 891 break; 892 } 892 893 893 894 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)); 905 907 break; 908 } 909 906 910 default: 907 911 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; 913 916 } 914 917 -
trunk/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c
r22875 r23068 121 121 return RTErrConvertToErrno(rc); 122 122 } 123 /* Create dev node */ 123 /* Create dev node */ 124 124 VBoxNetAdpFreeBSDcdev = make_dev(&vboxnetadp_cdevsw, 0, 125 125 UID_ROOT, GID_WHEEL, 0600, VBOXNETADP_CTL_DEV_NAME); … … 149 149 VBoxNetAdpFreeBSDCtrlioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *td) 150 150 { 151 PVBOXNETADP pAdp = NULL;151 PVBOXNETADP pAdp; 152 152 PVBOXNETADPREQ pReq = (PVBOXNETADPREQ)data; 153 153 struct ifnet *ifp; … … 157 157 { 158 158 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; 161 162 162 163 rc = vboxNetAdpCreate(&pAdp); 163 164 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 168 171 case VBOXNETADP_CTL_REMOVE: 172 if (!memchr(pReq->szName, '\0', RT_MIN(sizeof(pReq->szName), IOCPARM_LEN(iCmd)))) 173 return EINVAL; 174 169 175 pAdp = vboxNetAdpFindByName(pReq->szName); 170 if ( pAdp)171 r c = 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 179 185 default: 180 return (EINVAL);186 return EINVAL; 181 187 } 182 188 return 0; -
trunk/src/VBox/HostDrivers/VBoxNetAdp/linux/VBoxNetAdp-linux.c
r21682 r23068 257 257 { 258 258 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)); 267 266 return -EINVAL; 268 267 } 268 269 269 switch (uCmd) 270 270 { 271 271 case VBOXNETADP_CTL_ADD: 272 272 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 285 286 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)); 292 292 break; 293 293 … … 299 299 } 300 300 Log(("VBoxNetAdpLinuxIOCtl: Remove %s\n", Req.szName)); 301 301 302 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)); 306 316 break; 307 317 308 318 default: 309 319 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; 316 324 } 317 325
Note:
See TracChangeset
for help on using the changeset viewer.