* fhandler.cc (rootdir): Drop useless post-increment. Take volume
mount points into account. (check_posix_perm): Allocate space for root directory big enough.
This commit is contained in:
		| @@ -1,3 +1,9 @@ | |||||||
|  | 2006-12-10  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
|  | 	* fhandler.cc (rootdir): Drop useless post-increment.  Take volume | ||||||
|  | 	mount points into account. | ||||||
|  | 	(check_posix_perm): Allocate space for root directory big enough. | ||||||
|  |  | ||||||
| 2006-12-09  Corinna Vinschen  <corinna@vinschen.de> | 2006-12-09  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
| 	* syscalls.cc (try_to_bin): Add comment that this is not possibly | 	* syscalls.cc (try_to_bin): Add comment that this is not possibly | ||||||
|   | |||||||
| @@ -1221,7 +1221,7 @@ rootdir (const char *full_path, char *root_path) | |||||||
|  |  | ||||||
|   if (full_path[1] == ':') |   if (full_path[1] == ':') | ||||||
|     { |     { | ||||||
|       *rootp++ = *full_path++; |       *rootp++ = *full_path; | ||||||
|       *rootp++ = ':'; |       *rootp++ = ':'; | ||||||
|     } |     } | ||||||
|   else if (full_path[0] == '\\' && full_path[1] == '\\') |   else if (full_path[0] == '\\' && full_path[1] == '\\') | ||||||
| @@ -1239,6 +1239,60 @@ rootdir (const char *full_path, char *root_path) | |||||||
|  |  | ||||||
|   *rootp++ = '\\'; |   *rootp++ = '\\'; | ||||||
|   *rootp = '\0'; |   *rootp = '\0'; | ||||||
|  |  | ||||||
|  |   /* This also determines whether reparse points are available. */ | ||||||
|  |   if (!wincap.has_guid_volumes ()) | ||||||
|  |     return root_path; | ||||||
|  |  | ||||||
|  |   PREPARSE_DATA_BUFFER rp = (PREPARSE_DATA_BUFFER) | ||||||
|  | 			    alloca (MAXIMUM_REPARSE_DATA_BUFFER_SIZE); | ||||||
|  |  | ||||||
|  |   char *test_path = (char *) alloca (CYG_MAX_PATH); | ||||||
|  |   strcpy (test_path, full_path); | ||||||
|  |  | ||||||
|  |   /* This determines the minimum length of the path we test for mount points. | ||||||
|  |      If we're below this value, it's the root dir of the path itself. */ | ||||||
|  |   char *min_c = test_path + (rootp - root_path); | ||||||
|  |   char *c = min_c; | ||||||
|  |   while (*c) | ||||||
|  |     ++c; | ||||||
|  |   while (c > min_c) | ||||||
|  |     { | ||||||
|  |       *c = '\0'; | ||||||
|  |  | ||||||
|  | #     define MOUNTPT_ATTR (FILE_ATTRIBUTE_DIRECTORY \ | ||||||
|  | 			   | FILE_ATTRIBUTE_REPARSE_POINT) | ||||||
|  |       DWORD attr = GetFileAttributes (test_path); | ||||||
|  |       if (attr != INVALID_FILE_ATTRIBUTES | ||||||
|  | 	  && (attr & MOUNTPT_ATTR) == MOUNTPT_ATTR) | ||||||
|  | 	{ | ||||||
|  | 	  HANDLE h = CreateFile (test_path, GENERIC_READ, FILE_SHARE_READ, | ||||||
|  | 				 &sec_none_nih, OPEN_EXISTING, | ||||||
|  | 				 FILE_FLAG_OPEN_REPARSE_POINT | ||||||
|  | 				 | FILE_FLAG_BACKUP_SEMANTICS, NULL); | ||||||
|  | 	  if (h != INVALID_HANDLE_VALUE) | ||||||
|  | 	    { | ||||||
|  | 	      DWORD size; | ||||||
|  | 	      BOOL ret = DeviceIoControl (h, FSCTL_GET_REPARSE_POINT, NULL, | ||||||
|  | 					  0, (LPVOID) rp, | ||||||
|  | 					  MAXIMUM_REPARSE_DATA_BUFFER_SIZE, | ||||||
|  | 					  &size, NULL); | ||||||
|  | 	      CloseHandle (h); | ||||||
|  | 	      if (ret | ||||||
|  | 		  && rp->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT | ||||||
|  | 		  && !rp->SymbolicLinkReparseBuffer.PrintNameLength) | ||||||
|  | 		{ | ||||||
|  | 		  memcpy (root_path, test_path, len = c - test_path); | ||||||
|  | 		  strcpy (root_path + len, "\\"); | ||||||
|  | 		  CloseHandle (h); | ||||||
|  | 		  break; | ||||||
|  | 		} | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
|  |       while (--c > min_c && *c != '\\') | ||||||
|  |         ; | ||||||
|  |     } | ||||||
|  |  | ||||||
|   return root_path; |   return root_path; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1739,7 +1793,7 @@ check_posix_perm (const char *fname, int v) | |||||||
|   if (!allow_ntsec) |   if (!allow_ntsec) | ||||||
|     return 0; |     return 0; | ||||||
|  |  | ||||||
|   char *root = rootdir (fname, (char *)alloca (strlen (fname))); |   char *root = rootdir (fname, (char *)alloca (strlen (fname) + 2)); | ||||||
|  |  | ||||||
|   if (!allow_smbntsec |   if (!allow_smbntsec | ||||||
|       && ((root[0] == '\\' && root[1] == '\\') |       && ((root[0] == '\\' && root[1] == '\\') | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user