Hi,

there is a bug in windows client when reading Mountroot parameter. This
parameter is used to determine if a symlink lives in afs namespace or not. By
default (if the paramter is not specified) it is set to afs.

The bug is that
 code = RegQueryValueEx(parmKey, "Mountroot", NULL, NULL,
    cm_mountRoot, &cm_mountRootLen);

will set cm_mountRootLen to be the length of the parameter including null in the
end of the string (this is how regquery works). Since this value is used in
strncmp

cm_vnodeops.c : 1203
if (strncmp(linkp, cm_mountRoot, cm_mountRootLen) == 0) {

it will never succeed. The effect is that absolute symlinks will not work if afs
mount point is different from /afs

The fix is to set the length using strlen after the parameter is obtained from
registry:

afsd_init.c : 329

 if (code == ERROR_SUCCESS)
 {
  afsi_log("Mount root %s", cm_mountRoot);
  cm_mountRootLen = strlen(cm_mountRoot);
 }
 else {
  strcpy(cm_mountRoot, "/afs");
  cm_mountRootLen = 4;
  /* Don't log */
 }

Diff attached.

Thanks,
Andrei.
--- afsd_init.c Thu Oct 31 14:13:07 2002
+++ e:\openafs\1.2.6_original\openafs-1.2.6\src\WINNT\afsd\afsd_init.c  Sat Oct 13 
+00:19:06 2001
@@ -324,10 +324,7 @@
        code = RegQueryValueEx(parmKey, "Mountroot", NULL, NULL,
                                cm_mountRoot, &cm_mountRootLen);
        if (code == ERROR_SUCCESS)
-       {
                afsi_log("Mount root %s", cm_mountRoot);
-               cm_mountRootLen = strlen(cm_mountRoot);
-       }
        else {
                strcpy(cm_mountRoot, "/afs");
                cm_mountRootLen = 4;

Reply via email to