--- src/osdep/unix/flockcyg.c	2003-10-20 23:55:37.070753300 -0700
+++ src/osdep/unix/flockcyg.c	2003-10-20 23:56:31.024223600 -0700
@@ -10,7 +10,7 @@
  *		Internet: MRC@CAC.Washington.EDU
  *
  * Date:	10 April 2001
- * Last Edited:	25 April 2003
+ * Last Edited:	19 October 2003
  * 
  * The IMAP toolkit provided in this Distribution is
  * Copyright 1988-2003 University of Washington.
@@ -25,6 +25,8 @@
  * flocksim.  Also, we don't test NFS either
  */
 
+#include <limits.h>
+
 #undef flock			/* name is used as a struct for fcntl */
 
 /* Emulator for flock() call
@@ -38,14 +40,22 @@ int flocksim (int fd,int op)
   char tmp[MAILTMPLEN];
   int logged = 0;
   struct flock fl;
-				/* lock applies to entire file */
-  fl.l_whence = fl.l_start = fl.l_len = 0;
+  /* lock only applies to last possibly byte in the file */
+  fl.l_whence = SEEK_SET;
+  fl.l_start = LONG_MAX - 1;
+  fl.l_len = 1;
   fl.l_pid = getpid ();		/* shouldn't be necessary */
   switch (op & ~LOCK_NB) {	/* translate to fcntl() operation */
   case LOCK_EX:			/* exclusive */
+    /* release any previous lock held */
+    fl.l_type = F_UNLCK;
+    fcntl(fd, F_SETLKW, &fl);
     fl.l_type = F_WRLCK;
     break;
   case LOCK_SH:			/* shared */
+    /* release any previous lock held */
+    fl.l_type = F_UNLCK;
+    fcntl(fd, F_SETLKW, &fl);
     fl.l_type = F_RDLCK;
     break;
   case LOCK_UN:			/* unlock */
--- src/osdep/unix/log_cyg.c	2003-10-20 23:55:37.180129000 -0700
+++ src/osdep/unix/log_cyg.c	2003-10-20 23:55:48.398950800 -0700
@@ -28,10 +28,20 @@
 long loginpw (struct passwd *pw,int argc,char *argv[])
 {
   uid_t uid = pw->pw_uid;
+
+  /* the CRAM-MD5 code flow doesn't call checkpw() */
+  if (auth_md5.server)
+  {
+    if (cyg_user) fs_give ((void **) &cyg_user);
+    cyg_user = cpystr(pw->pw_name);
+  }
+  else
+  {
 				/* must be same user name as last checkpw() */
-  if (!(cyg_user && !strcmp (pw->pw_name,cyg_user))) return NIL;
+    if (!(cyg_user && !strcmp (pw->pw_name,cyg_user))) return NIL;
 				/* do the ImpersonateLoggedOnUser() */
-  cygwin_set_impersonation_token (cyg_hdl);
+    cygwin_set_impersonation_token (cyg_hdl);
+  }
 
   return !(setgid (pw->pw_gid) || initgroups (cyg_user,pw->pw_gid) ||
 	   setuid (uid));
