[vbox-dev] creating symlinks in shared folders appears to be broken

Life is hard, and then you die ronald at innovation.ch
Thu Jan 6 11:46:11 GMT 2011


  Hello,

I'm implementing support for symlinks in shared folders in Solaris
guests, and ran across the following problem (this is based on svn
rev 35386).

vboxCallSymlink() in VBoxGuestR0LibSharedFolders.c is defined as
taking a PSHFLFSOBJINFO parameter; but the corresponding vbsfSymlink()
in vbsf.cpp (and the associated calling code in service.cpp) expect a
PRTFSOBJINFO instead. This results in any attempt to create a symlink
by a guest failing at the size check on line 1192 in service.cpp .

It appears the breakage was introduced in r33994 (public svn repo) due
to an imcomplete set of changes. I think the attached patch should fix
things, but it is untested (so maybe view it as a guide rather than a
definitive fix).

If anybody can confirm the issue and the proposed fix then I can
finalize my Solaris-guest patches and submit them.

TIA.


  Cheers,

  Ronald

-------------- next part --------------
diff --git a/src/VBox/HostServices/SharedFolders/service.cpp b/src/VBox/HostServices/SharedFolders/service.cpp
index a96380d..00b22de 100644
--- a/src/VBox/HostServices/SharedFolders/service.cpp
+++ b/src/VBox/HostServices/SharedFolders/service.cpp
@@ -1183,13 +1183,13 @@ static DECLCALLBACK(void) svcCall (void *, VBOXHGCMCALLHANDLE callHandle, uint32
                 SHFLROOT     root     = (SHFLROOT)paParms[0].u.uint32;
                 SHFLSTRING  *pNewPath = (SHFLSTRING *)paParms[1].u.pointer.addr;
                 SHFLSTRING  *pOldPath = (SHFLSTRING *)paParms[2].u.pointer.addr;
-                RTFSOBJINFO *pInfo    = (RTFSOBJINFO *)paParms[3].u.pointer.addr;
+                SHFLFSOBJINFO *pInfo    = (SHFLFSOBJINFO *)paParms[3].u.pointer.addr;
                 uint32_t     cbInfo   = paParms[3].u.pointer.size;
 
                 /* Verify parameters values. */
                 if (    !ShflStringIsValid(pNewPath, paParms[1].u.pointer.size)
                     ||  !ShflStringIsValid(pOldPath, paParms[2].u.pointer.size)
-                    ||  (cbInfo != sizeof(RTFSOBJINFO))
+                    ||  (cbInfo != sizeof(SHFLFSOBJINFO))
                    )
                 {
                     rc = VERR_INVALID_PARAMETER;
diff --git a/src/VBox/HostServices/SharedFolders/vbsf.cpp b/src/VBox/HostServices/SharedFolders/vbsf.cpp
index b549739..53d970b 100644
--- a/src/VBox/HostServices/SharedFolders/vbsf.cpp
+++ b/src/VBox/HostServices/SharedFolders/vbsf.cpp
@@ -2146,10 +2146,12 @@ int vbsfRename(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pSrc, SHFLSTR
     return rc;
 }
 
-int vbsfSymlink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pNewPath, SHFLSTRING *pOldPath, RTFSOBJINFO *pInfo)
+int vbsfSymlink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pNewPath, SHFLSTRING *pOldPath, SHFLFSOBJINFO *pInfo)
 {
     int rc = VINF_SUCCESS;
 
+    RTFSOBJINFO linkinfo;
+
     char *pszFullNewPath = NULL;
     char *pszOldPath = NULL;
 
@@ -2163,7 +2165,10 @@ int vbsfSymlink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pNewPath, SH
 
     rc = RTSymlinkCreate(pszFullNewPath, (const char *)pOldPath->String.utf8, RTSYMLINKTYPE_UNKNOWN);
     if (RT_SUCCESS (rc))
-        rc = RTPathQueryInfoEx(pszFullNewPath, pInfo, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
+        rc = RTPathQueryInfoEx(pszFullNewPath, &linkinfo, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
+
+    if (RT_SUCCESS (rc))
+        vbfsCopyFsObjInfoFromIprt(pInfo, &linkinfo);
 
     vbsfFreeFullPath(pszFullNewPath);
 
diff --git a/src/VBox/HostServices/SharedFolders/vbsf.h b/src/VBox/HostServices/SharedFolders/vbsf.h
index 7827bca..7697968 100644
--- a/src/VBox/HostServices/SharedFolders/vbsf.h
+++ b/src/VBox/HostServices/SharedFolders/vbsf.h
@@ -38,6 +38,6 @@ int vbsfFlush(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle);
 int vbsfDisconnect(SHFLCLIENTDATA *pClient);
 int vbsfQueryFileInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer);
 int vbsfReadLink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pPath, uint32_t cbPath, uint8_t *pBuffer, uint32_t cbBuffer);
-int vbsfSymlink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pNewPath, SHFLSTRING *pOldPath, RTFSOBJINFO *pInfo);
+int vbsfSymlink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pNewPath, SHFLSTRING *pOldPath, SHFLFSOBJINFO *pInfo);
 
 #endif /* __VBSF__H */


More information about the vbox-dev mailing list