VirtualBox

Ignore:
Timestamp:
Mar 15, 2019 2:18:34 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
129353
Message:

linux/vboxsf: More linux 3.16 fixes, this time for skipping empty iov segments. bugref:9172

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/linux/sharedfolders/regops.c

    r77708 r77710  
    11161116        while (cbToCopy > 0) {
    11171117            size_t cbThisCopy = iov_iter_single_seg_count(pSrcIter);
    1118             if (cbThisCopy > cbToCopy)
    1119                 cbThisCopy = cbToCopy;
    1120             if (pSrcIter->type & ITER_KVEC)
    1121                 memcpy(pbDst, (void *)pSrcIter->iov->iov_base + pSrcIter->iov_offset, cbThisCopy);
    1122             else if (!copy_from_user(pbDst, pSrcIter->iov->iov_base + pSrcIter->iov_offset, cbThisCopy))
    1123                 break;
    1124             pbDst    += cbThisCopy;
    1125             cbToCopy -= cbThisCopy;
     1118            if (cbThisCopy > 0) {
     1119                if (cbThisCopy > cbToCopy)
     1120                    cbThisCopy = cbToCopy;
     1121                if (pSrcIter->type & ITER_KVEC)
     1122                    memcpy(pbDst, (void *)pSrcIter->iov->iov_base + pSrcIter->iov_offset, cbThisCopy);
     1123                else if (!copy_from_user(pbDst, pSrcIter->iov->iov_base + pSrcIter->iov_offset, cbThisCopy))
     1124                    break;
     1125                pbDst    += cbThisCopy;
     1126                cbToCopy -= cbThisCopy;
     1127            }
    11261128            iov_iter_advance(pSrcIter, cbThisCopy);
    11271129        }
     
    11491151        while (cbToCopy > 0) {
    11501152            size_t cbThisCopy = iov_iter_single_seg_count(pDstIter);
    1151             if (cbThisCopy > cbToCopy)
    1152                 cbThisCopy = cbToCopy;
    1153             if (pDstIter->type & ITER_KVEC)
    1154                 memcpy((void *)pDstIter->iov->iov_base + pDstIter->iov_offset, pbSrc, cbThisCopy);
    1155             else if (!copy_to_user(pDstIter->iov->iov_base + pDstIter->iov_offset, pbSrc, cbThisCopy))
    1156                 break;
    1157             pbSrc    += cbThisCopy;
    1158             cbToCopy -= cbThisCopy;
     1153            if (cbThisCopy > 0) {
     1154                if (cbThisCopy > cbToCopy)
     1155                    cbThisCopy = cbToCopy;
     1156                if (pDstIter->type & ITER_KVEC)
     1157                    memcpy((void *)pDstIter->iov->iov_base + pDstIter->iov_offset, pbSrc, cbThisCopy);
     1158                else if (!copy_to_user(pDstIter->iov->iov_base + pDstIter->iov_offset, pbSrc, cbThisCopy)) {
     1159                    break;
     1160                }
     1161                pbSrc    += cbThisCopy;
     1162                cbToCopy -= cbThisCopy;
     1163            }
    11591164            iov_iter_advance(pDstIter, cbThisCopy);
    11601165        }
     
    12511256            ssize_t cbSegRet;
    12521257            if (cPages == 0) {
     1258# if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
     1259                while (!iov_iter_single_seg_count(iter)) /* Old code didn't skip empty segments which caused EFAULTs. */
     1260                    iov_iter_advance(iter, 0);
     1261# endif
    12531262                cbSegRet = iov_iter_get_pages(iter, papPages, iov_iter_count(iter), cMaxPages, &offPage0);
    12541263                if (cbSegRet > 0) {
Note: See TracChangeset for help on using the changeset viewer.

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