* dir.cc (mkdir): Check for trailing /. or /.. component.
(rmdir): Ditto. * path.cc (has_dot_last_component): New function. * path.h (has_dot_last_component): Add declaration.
This commit is contained in:
		| @@ -255,6 +255,16 @@ mkdir (const char *dir, mode_t mode) | |||||||
|   int res = -1; |   int res = -1; | ||||||
|   fhandler_base *fh = NULL; |   fhandler_base *fh = NULL; | ||||||
|  |  | ||||||
|  |   myfault efault; | ||||||
|  |   if (efault.faulted (EFAULT)) | ||||||
|  |     return -1; | ||||||
|  |  | ||||||
|  |   if (has_dot_last_component (dir)) | ||||||
|  |     { | ||||||
|  |       set_errno (ENOENT); | ||||||
|  |       return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|   if (!(fh = build_fh_name (dir, NULL, PC_SYM_NOFOLLOW | PC_WRITABLE))) |   if (!(fh = build_fh_name (dir, NULL, PC_SYM_NOFOLLOW | PC_WRITABLE))) | ||||||
|     goto done;   /* errno already set */; |     goto done;   /* errno already set */; | ||||||
|  |  | ||||||
| @@ -279,6 +289,16 @@ rmdir (const char *dir) | |||||||
|   int res = -1; |   int res = -1; | ||||||
|   fhandler_base *fh = NULL; |   fhandler_base *fh = NULL; | ||||||
|  |  | ||||||
|  |   myfault efault; | ||||||
|  |   if (efault.faulted (EFAULT)) | ||||||
|  |     return -1; | ||||||
|  |  | ||||||
|  |   if (has_dot_last_component (dir)) | ||||||
|  |     { | ||||||
|  |       set_errno (EINVAL); | ||||||
|  |       return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|   if (!(fh = build_fh_name (dir, NULL, PC_SYM_NOFOLLOW | PC_WRITABLE))) |   if (!(fh = build_fh_name (dir, NULL, PC_SYM_NOFOLLOW | PC_WRITABLE))) | ||||||
|     goto done;   /* errno already set */; |     goto done;   /* errno already set */; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -205,6 +205,24 @@ pathmatch (const char *path1, const char *path2) | |||||||
| 				      : strcasematch (path1, path2); | 				      : strcasematch (path1, path2); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* TODO: This function is used in mkdir and rmdir to generate correct | ||||||
|  |    error messages in case of paths ending in /. or /.. components. | ||||||
|  |    This test should eventually end up in path_conv::check in one way | ||||||
|  |    or another.  Right now, normalize_posix_path will just normalize | ||||||
|  |    those components away, which changes the semantics.  */ | ||||||
|  | bool | ||||||
|  | has_dot_last_component (const char *dir) | ||||||
|  | { | ||||||
|  |   /* SUSv3: . and .. are not allowed as last components in various system | ||||||
|  |      calls.  Don't test for backslash path separator since that's a Win32 | ||||||
|  |      path following Win32 rules. */ | ||||||
|  |   const char *last_comp = strrchr (dir, '/'); | ||||||
|  |   return last_comp | ||||||
|  |   	 && last_comp[1] == '.' | ||||||
|  | 	 && (last_comp[2] == '\0' | ||||||
|  | 	     || (last_comp[2] == '.' && last_comp[3] == '\0')); | ||||||
|  | } | ||||||
|  |  | ||||||
| #define isslash(c) ((c) == '/') | #define isslash(c) ((c) == '/') | ||||||
|  |  | ||||||
| /* Normalize a POSIX path. | /* Normalize a POSIX path. | ||||||
|   | |||||||
| @@ -289,6 +289,7 @@ has_exec_chars (const char *buf, int len) | |||||||
|  |  | ||||||
| int pathmatch (const char *path1, const char *path2) __attribute__ ((regparm (2))); | int pathmatch (const char *path1, const char *path2) __attribute__ ((regparm (2))); | ||||||
| int pathnmatch (const char *path1, const char *path2, int len) __attribute__ ((regparm (2))); | int pathnmatch (const char *path1, const char *path2, int len) __attribute__ ((regparm (2))); | ||||||
|  | bool has_dot_last_component (const char *dir) __attribute__ ((regparm (1))); | ||||||
|  |  | ||||||
| bool fnunmunge (char *, const char *) __attribute__ ((regparm (2))); | bool fnunmunge (char *, const char *) __attribute__ ((regparm (2))); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user