~ubuntu-branches/ubuntu/quantal/virtualbox/quantal

« back to all changes in this revision

Viewing changes to src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp

  • Committer: Package Import Robot
  • Author(s): Felix Geyer
  • Date: 2012-04-05 12:41:55 UTC
  • mfrom: (3.1.12 sid)
  • Revision ID: package-import@ubuntu.com-20120405124155-i7b39tv5ddwhubbe
Tags: 4.1.12-dfsg-2
* Upstream has replaced the 4.1.12 tarball with a new one that fixes a
  crash when creating host only interfaces. (Closes: #667460)
  - Add 36-tarball-respin.patch which contains the diff between the old
    and the new tarball.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1889
1889
static int VBoxGuestCommonIOCtl_HGCMCall(PVBOXGUESTDEVEXT pDevExt,
1890
1890
                                         PVBOXGUESTSESSION pSession,
1891
1891
                                         VBoxGuestHGCMCallInfo *pInfo,
1892
 
                                         uint32_t cMillies, bool fInterruptible, bool f32bit,
 
1892
                                         uint32_t cMillies, bool fInterruptible, bool f32bit, bool fUserData,
1893
1893
                                         size_t cbExtra, size_t cbData, size_t *pcbDataReturned)
1894
1894
{
1895
1895
    const uint32_t  u32ClientId = pInfo->u32ClientID;
1945
1945
     * be interruptible (should add a flag for this later I guess).
1946
1946
     */
1947
1947
    Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID));
1948
 
    fFlags = pSession->R0Process == NIL_RTR0PROCESS ? VBGLR0_HGCMCALL_F_KERNEL : VBGLR0_HGCMCALL_F_USER;
 
1948
    fFlags = !fUserData && pSession->R0Process == NIL_RTR0PROCESS ? VBGLR0_HGCMCALL_F_KERNEL : VBGLR0_HGCMCALL_F_USER;
1949
1949
#ifdef RT_ARCH_AMD64
1950
1950
    if (f32bit)
1951
1951
    {
2445
2445
        bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;
2446
2446
        CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo));
2447
2447
        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
2448
 
                                           fInterruptible, false /*f32bit*/,
 
2448
                                           fInterruptible, false /*f32bit*/, false /* fUserData */,
2449
2449
                                           0, cbData, pcbDataReturned);
2450
2450
    }
2451
2451
    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED(0)))
2454
2454
        CHECKRET_MIN_SIZE("HGCM_CALL_TIMED", sizeof(VBoxGuestHGCMCallInfoTimed));
2455
2455
        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, &pInfo->info, pInfo->u32Timeout,
2456
2456
                                           !!pInfo->fInterruptible || pSession->R0Process != NIL_RTR0PROCESS,
2457
 
                                           false /*f32bit*/,
 
2457
                                           false /*f32bit*/, false /* fUserData */,
2458
2458
                                           RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned);
2459
2459
    }
 
2460
    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_USERDATA(0)))
 
2461
    {
 
2462
        bool fInterruptible = true;
 
2463
        CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo));
 
2464
        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
 
2465
                                           fInterruptible, false /*f32bit*/, true /* fUserData */,
 
2466
                                           0, cbData, pcbDataReturned);
 
2467
    }
2460
2468
# ifdef RT_ARCH_AMD64
2461
2469
    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_32(0)))
2462
2470
    {
2463
2471
        bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;
2464
2472
        CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo));
2465
2473
        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT,
2466
 
                                           fInterruptible, true /*f32bit*/,
 
2474
                                           fInterruptible, true /*f32bit*/, false /* fUserData */,
2467
2475
                                           0, cbData, pcbDataReturned);
2468
2476
    }
2469
2477
    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED_32(0)))
2472
2480
        VBoxGuestHGCMCallInfoTimed *pInfo = (VBoxGuestHGCMCallInfoTimed *)pvData;
2473
2481
        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, &pInfo->info, pInfo->u32Timeout,
2474
2482
                                           !!pInfo->fInterruptible || pSession->R0Process != NIL_RTR0PROCESS,
2475
 
                                           true /*f32bit*/,
 
2483
                                           true /*f32bit*/, false /* fUserData */,
2476
2484
                                           RT_OFFSETOF(VBoxGuestHGCMCallInfoTimed, info), cbData, pcbDataReturned);
2477
2485
    }
2478
2486
# endif