Attached is a patch, in an effort to try to find a non hack solution to the
"make logins work" patch.  I'm not 100% sure this will work with terminal
server, but it appears to work both with and without integrated login.  I
haven't submitted this to the gatekeepers, because I'd like others to take a
look and make sure this isn't just a different hack.

Many thanks to Michael Nelson, his patches really helped get me going!


*** c:\afs\openafs\src\winnt\afsd\smb.c Sat Nov 04 10:01:43 2000
--- c:\openafs\src\winnt\afsd\smb.c     Fri Jan 19 00:19:48 2001
***************
*** 548,553 ****
--- 548,569 ----
          return uidp;
  }

+ // Allows you to find an smb_user_t record by the name field
+ smb_user_t *smb_FindUserByName(smb_vc_t *vcp, char *name)
+ {
+       smb_user_t *uidp= NULL;
+
+       lock_ObtainWrite(&smb_rctLock);
+       for(uidp = vcp->usersp; uidp; uidp = uidp->nextp) {
+               if (stricmp(uidp->name, name) == 0) {
+                       uidp->refCount++;
+                       break;
+               }
+         }
+         lock_ReleaseWrite(&smb_rctLock);
+         return uidp;
+ }
+
  void smb_ReleaseUID(smb_user_t *uidp)
  {
        smb_user_t *up;


*** c:\afs\openafs\src\winnt\afsd\smb.h Sat Nov 04 10:01:44 2000
--- c:\openafs\src\winnt\afsd\smb.h     Fri Jan 19 00:23:40 2001
***************
*** 307,312 ****
--- 307,314 ----

  extern smb_user_t *smb_FindUID(smb_vc_t *vcp, unsigned short uid, int
flags);

+ extern smb_user_t *smb_FindUserByName(smb_vc_t *vcp, char *name);
+
  extern void smb_ReleaseUID(smb_user_t *uidp);

  extern cm_user_t *smb_GetUser(smb_vc_t *vcp, smb_packet_t *inp);


*** c:\afs\openafs\src\winnt\afsd\smb3.c        Sat Nov 04 10:01:44 2000
--- c:\openafs\src\winnt\afsd\smb3.c    Fri Jan 19 14:38:20 2001
***************
*** 132,150 ****
        pwd = smb_ParseString(tp, &tp);
        usern = smb_ParseString(tp, &tp);

!       /* Create a new UID and cm_user_t structure */
!       userp = cm_NewUser();
!       lock_ObtainMutex(&vcp->mx);
!       newUid = vcp->uidCounter++;
!       lock_ReleaseMutex(&vcp->mx);

!       /* Create a new smb_user_t structure and connect them up */
!       uidp = smb_FindUID(vcp, newUid, SMB_FLAG_CREATE);
!       lock_ObtainMutex(&uidp->mx);
!       uidp->userp = userp;
!       uidp->name = strdup(usern);
!       lock_ReleaseMutex(&uidp->mx);
!       smb_ReleaseUID(uidp);

        if (dead_vcp) {
                dead_uidp = dead_vcp->usersp;
--- 132,164 ----
        pwd = smb_ParseString(tp, &tp);
        usern = smb_ParseString(tp, &tp);

!       // On Windows 2000, this function appears to be called more often than
!       // it is expected to be called. This resulted in multiple smb_user_t
!       // records existing all for the same user session which results in all
!       // of the users tokens disappearing.
!       //
!       // To avoid this problem, we look for an existing smb_user_t record
!       // based on the users name, and use that one if we find it.
!       if (uidp = smb_FindUserByName(vcp, usern)) {
!               userp = uidp->userp;
!               newUid = (unsigned short)uidp->userID;  // For some reason these are
different types!
!               smb_ReleaseUID(uidp);
!       }
!       else {
!               /* Create a new UID and cm_user_t structure */
!               userp = cm_NewUser();
!               lock_ObtainMutex(&vcp->mx);
!               newUid = vcp->uidCounter++;
!               lock_ReleaseMutex(&vcp->mx);

!               /* Create a new smb_user_t structure and connect them up */
!               uidp = smb_FindUID(vcp, newUid, SMB_FLAG_CREATE);
!               lock_ObtainMutex(&uidp->mx);
!               uidp->userp = userp;
!               uidp->name = strdup(usern);
!               lock_ReleaseMutex(&uidp->mx);
!               smb_ReleaseUID(uidp);
!       }

        if (dead_vcp) {
                dead_uidp = dead_vcp->usersp;

Dave Koziol                  | [EMAIL PROTECTED]
Software Engineering Manager |
Dragonfly Mobile             | http://www.dragonflymobile.com

_______________________________________________
OpenAFS-devel mailing list
[EMAIL PROTECTED]
https://lists.openafs.org/mailman/listinfo.cgi/openafs-devel

Reply via email to