You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@locus.apache.org on 2000/10/23 19:21:15 UTC
cvs commit: apache-2.0/src/lib/apr/misc/win32 names.c
wrowe 00/10/23 10:21:15
Modified: src/lib/apr aprlib.def
src/lib/apr/file_io/unix fileio.h
src/lib/apr/file_io/win32 dir.c filedup.c fileio.h open.c
src/lib/apr/include apr_file_io.h
src/lib/apr/misc/win32 names.c
Log:
The start of the canonical name stuff.
* removed cruft that did nothing (yet)
* add prototypes for the apr_canon... fn's
* Consider: apr_compare_canonical (need to count matching elements)
* Consider: Manoj's suggestion to handle symlinks within here.
* Consider: fanf's concept to use dev/inode for comparison w/o strs.
Revision Changes Path
1.36 +2 -2 apache-2.0/src/lib/apr/aprlib.def
Index: aprlib.def
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/aprlib.def,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- aprlib.def 2000/10/11 07:54:31 1.35
+++ aprlib.def 2000/10/23 17:21:10 1.36
@@ -117,8 +117,8 @@
;
apr_get_os_thread @110
apr_get_os_threadkey @111
- apr_os_systemcase_filename @112
- canonical_filename @113
+
+
apr_create_pool @114
;
;
1.27 +17 -0 apache-2.0/src/lib/apr/file_io/unix/fileio.h
Index: fileio.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/unix/fileio.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- fileio.h 2000/08/02 05:25:51 1.26
+++ fileio.h 2000/10/23 17:21:11 1.27
@@ -58,6 +58,7 @@
#include "apr.h"
#include "apr_private.h"
#include "apr_general.h"
+#include "apr_tables.h"
#include "apr_file_io.h"
#include "apr_errno.h"
#include "apr_lib.h"
@@ -111,6 +112,22 @@
/* End System headers */
#define APR_FILE_BUFSIZE 4096
+
+typedef struct apr_canon_elem_t {
+/* A possible comparison mechanism to play with once we start
+ * implementing case insensitive mount poinbt semantices
+ * int dev;
+ * int inode;
+ * apr_time_t cached; --for timeout?
+ */
+ int pathlen;
+ char *element;
+} apr_canon_elem_t;
+
+struct apr_canon_t {
+ apr_pool_t *cntxt;
+ apr_array_header_t *elems;
+};
struct apr_file_t {
apr_pool_t *cntxt;
1.28 +2 -5 apache-2.0/src/lib/apr/file_io/win32/dir.c
Index: dir.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/dir.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- dir.c 2000/10/06 17:24:38 1.27
+++ dir.c 2000/10/23 17:21:11 1.28
@@ -83,12 +83,10 @@
apr_status_t apr_opendir(apr_dir_t **new, const char *dirname, apr_pool_t *cont)
{
- char * temp;
(*new) = apr_pcalloc(cont, sizeof(apr_dir_t));
(*new)->cntxt = cont;
(*new)->entry = NULL;
- temp = canonical_filename((*new)->cntxt, dirname);
- if (temp[strlen(temp)] == '/') {
+ if (dirname[strlen(dirname)] == '/') {
(*new)->dirname = apr_pstrcat(cont, dirname, "*", NULL);
}
else {
@@ -153,8 +151,7 @@
apr_status_t apr_remove_dir(const char *path, apr_pool_t *cont)
{
- char *temp = canonical_filename(cont, path);
- if (!RemoveDirectory(temp)) {
+ if (!RemoveDirectory(path)) {
return apr_get_os_error();
}
return APR_SUCCESS;
1.22 +7 -5 apache-2.0/src/lib/apr/file_io/win32/filedup.c
Index: filedup.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/filedup.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- filedup.c 2000/10/06 17:24:38 1.21
+++ filedup.c 2000/10/23 17:21:11 1.22
@@ -105,12 +105,14 @@
(*new_file)->cntxt = old_file->cntxt;
(*new_file)->fname = apr_pstrdup(old_file->cntxt, old_file->fname);
- (*new_file)->demonfname = apr_pstrdup(old_file->cntxt, old_file->demonfname);
- (*new_file)->lowerdemonfname = apr_pstrdup(old_file->cntxt, old_file->lowerdemonfname);
+/* (*new_file)->demonfname = apr_pstrdup(old_file->cntxt, old_file->demonfname);
+ * (*new_file)->lowerdemonfname = apr_pstrdup(old_file->cntxt, old_file->lowerdemonfname);
+ */
(*new_file)->append = old_file->append;
-/* (*new_file)->protection = old_file->protection;
- (*new_file)->user = old_file->user;
- (*new_file)->group = old_file->group;*/
+/* (*new_file)->protection = old_file->protection;
+ * (*new_file)->user = old_file->user;
+ * (*new_file)->group = old_file->group;
+ */
(*new_file)->size = old_file->size;
(*new_file)->atime = old_file->atime;
(*new_file)->mtime = old_file->mtime;
1.32 +35 -7 apache-2.0/src/lib/apr/file_io/win32/fileio.h
Index: fileio.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/fileio.h,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- fileio.h 2000/10/16 06:04:40 1.31
+++ fileio.h 2000/10/23 17:21:11 1.32
@@ -59,6 +59,7 @@
#include "apr_private.h"
#include "apr_pools.h"
#include "apr_general.h"
+#include "apr_tables.h"
#include "apr_lock.h"
#include "apr_file_io.h"
#include "apr_errno.h"
@@ -88,6 +89,34 @@
#define APR_FILE_BUFSIZE 4096
+typedef enum apr_canon_case_e {
+ APR_CANON_CASE_GIVEN,
+ APR_CANON_CASE_LOWER,
+ APR_CANON_CASE_TRUE
+} apr_canon_case_e;
+
+/*
+ * Internal canonical filename elements for the apr_canon_t elems
+ * ccase tracks the mechanism used to resolve this element
+ * pathlen is the full path length to the end of this element
+ * name slash is prefix, as appropriate
+
+ */
+typedef struct apr_canon_elem_t {
+ apr_canon_case_e ccase;
+ int pathlen;
+ char *name;
+} apr_canon_elem_t;
+
+/* warning: win32 canonical path "/" resolves to a
+ * zero'th element of the empty string for testing the
+ * psudo-root for the system
+ */
+struct apr_canon_t {
+ apr_pool_t *cntxt;
+ apr_array_header_t *elems;
+};
+
/* quick run-down of fields in windows' apr_file_t structure that may have
* obvious uses.
* fname -- the filename as passed to the open call.
@@ -110,8 +139,8 @@
/* File specific info */
char *fname;
- char *demonfname;
- char *lowerdemonfname;
+ apr_canon_t *canonname;
+
DWORD dwFileAttributes;
int eof_hit;
BOOLEAN buffered; // Use buffered I/O?
@@ -142,12 +171,11 @@
};
apr_status_t file_cleanup(void *);
-/*mode_t get_fileperms(apr_fileperms_t);
-*/
-APR_DECLARE(char *) apr_os_systemcase_filename(struct apr_pool_t *pCont,
- const char *szFile);
-char * canonical_filename(struct apr_pool_t *pCont, const char *szFile);
+/**
+ * Internal function to create a Win32/NT pipe that respects some async
+ * timeout options.
+ */
apr_status_t apr_create_nt_pipe(apr_file_t **in, apr_file_t **out,
BOOLEAN bAsyncRead, BOOLEAN bAsyncWrite,
apr_pool_t *p);
1.51 +5 -30 apache-2.0/src/lib/apr/file_io/win32/open.c
Index: open.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/open.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- open.c 2000/10/06 22:50:54 1.50
+++ open.c 2000/10/23 17:21:11 1.51
@@ -111,9 +111,6 @@
(*new)->fname = apr_pstrdup(cont, fname);
- (*new)->demonfname = canonical_filename((*new)->cntxt, fname);
- (*new)->lowerdemonfname = strlwr((*new)->demonfname);
-
if (apr_get_oslevel(cont, &level) == APR_SUCCESS && level >= APR_WIN_NT) {
sharemode |= FILE_SHARE_DELETE;
}
@@ -196,40 +193,18 @@
apr_status_t apr_remove_file(const char *path, apr_pool_t *cont)
{
- char *temp = canonical_filename(cont, path);
-
- if (DeleteFile(temp)) {
+ if (DeleteFile(path))
return APR_SUCCESS;
- }
- else {
- return apr_get_os_error();
- }
+ return apr_get_os_error();
}
apr_status_t apr_rename_file(const char *from_path, const char *to_path,
apr_pool_t *p)
{
- const char *from_canon = canonical_filename(p, from_path);
- const char *to_canon = canonical_filename(p, to_path);
- DWORD err;
-
- /* TODO: would be nice to use MoveFileEx() here, but it isn't available
- * on Win95/98. MoveFileEx could theoretically help prevent the
- * case where we delete the target but don't move the file(!).
- * it can also copy across devices...
- */
-
- if (MoveFile(from_canon, to_canon)) {
+ if (MoveFileEx(from_path, to_path, MOVEFILE_REPLACE_EXISTING |
+ MOVEFILE_COPY_ALLOWED))
return APR_SUCCESS;
- }
- err = apr_get_os_error();
- if (APR_STATUS_IS_EEXIST(err)) {
- (void) DeleteFile(to_canon);
- if (MoveFile(from_canon, to_canon))
- return APR_SUCCESS;
- err = apr_get_os_error();
- }
- return err;
+ return apr_get_os_error();
}
apr_status_t apr_get_os_file(apr_os_file_t *thefile, apr_file_t *file)
1.68 +113 -2 apache-2.0/src/lib/apr/include/apr_file_io.h
Index: apr_file_io.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr_file_io.h,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- apr_file_io.h 2000/10/18 02:44:50 1.67
+++ apr_file_io.h 2000/10/23 17:21:13 1.68
@@ -119,6 +119,7 @@
typedef struct apr_file_t apr_file_t;
typedef struct apr_finfo_t apr_finfo_t;
typedef struct apr_dir_t apr_dir_t;
+typedef struct apr_canon_t apr_canon_t;
typedef apr_int32_t apr_fileperms_t;
typedef uid_t apr_uid_t;
typedef gid_t apr_gid_t;
@@ -156,9 +157,119 @@
apr_time_t ctime;
};
-/* Function definitions */
+/* Make and Merge Canonical Name Options */
/**
+ * Require the trusted_name+child_name result is an absolute product
+ * or fail with error for the make and merge canonical name functions.
+ */
+#define APR_CANON_ONLY_ABSOLUTE 0
+/**
+ * Allow that the trusted_name+child_name result may be a relative result
+ * for the make and merge canonical name functions.
+ */
+#define APR_CANON_ALLOW_RELATIVE 2
+
+/**
+ * Require the trusted_name+child_name result is not an absolute path
+ * or fail with error for the make and merge canonical name functions.
+ */
+#define APR_CANON_ONLY_RELATIVE 3
+
+/**
+ * Require the trusted_name+child_name result is a child of trusted_name
+ * or fail with error for the make and merge canonical name functions.
+ */
+#define APR_CANON_CHILD_OF_TRUSTED 4
+
+/**
+ * If file path elements exist (can stat) then fold the element's name
+ * to lowercase for the make and merge canonical name functions.
+ */
+#define APR_CANON_LOWERCASE
+
+/**
+ * If file path elements exist (can readdir) then fold the element's name
+ * to the true case lowercase for the make and merge canonical name functions.
+ */
+#define APR_CANON_TRUECASE
+
+/**
+ * Canonicalize the path and name.
+ *
+ * @param new_name The newly allocated canonicalized trusted+child name
+ * @param trusted_name Already canonical parent path; may be NULL.
+ * @param child_name An absolute path or path relative to trusted_name.
+ * @param options See the APR_CANON_ bit flags documentation for options
+ * @param pool The context in which to allocate the new_name apr_canon_t
+ *
+ * @tip A canonical name is a name stipped of embedded backrefs "../",
+ * thisrefs "./", successive slashes (//), or any other ambigious file
+ * name element. Absolute canonical names referencing the same file must
+ * strcmp() identically, excluding symlinks or inconsistent use of the
+ * APR_CANON_LOWERCASE or APR_CANON_TRUECASE options.
+ *
+ * If the name does not exist, or resolves to a relative name the given case
+ * is preserved. Insignificant elements are eliminated. For example, on Win32 this
+ * function removes trailing dots (which are allowed, but not stored in
+ * the file system), and "/../" under Unix is resolved to "/". The relative
+ * canonical name may contain leading backrefs "../", but will never contain
+ * any other prohibited element.
+ */
+
+/*
+ * @param trusted_name May be null
+ * @param child_name May be absolute, in which case trusted_name is ignored
+ * unless APR_CHILD_RELATIVE is tested.
+ */
+
+apr_status_t apr_make_canonical_name(apr_canon_t **new_name,
+ const apr_canon_t *trusted_name,
+ const char *child_name,
+ int options,
+ apr_pool_t *pool);
+
+apr_status_t apr_merge_canonical_name(apr_canon_t **new_name,
+ const apr_canon_t *trusted_name,
+ const apr_canon_t *child_name,
+ int options,
+ apr_pool_t *pool);
+
+apr_status_t apr_get_canonical_name(char **path,
+ const apr_canon_t *trusted_name,
+ apr_pool_t *pool);
+
+int apr_count_canonical_elements(const apr_canon_t *trusted_name);
+
+int apr_get_canonical_elements_length(const apr_canon_t *trusted_name,
+ int firstelement, int lastelement);
+
+apr_status_t apr_get_canonical_elements(char **path_elements,
+ const apr_canon_t *trusted_name,
+ int firstelement, int lastelement,
+ apr_pool_t *pool);
+
+/**
+ * Returns APR_SUCCESS if canon_name is absolute. Do not trust
+ * !apr_is_absolute to determine if the path is relative. Also,
+ * test apr_is_virtualroot to avoid non-filesystem pseudo roots.
+ */
+apr_status_t apr_is_absolute(apr_canon_t **path);
+
+/**
+ * Returns APR_SUCCESS if canon_name is absolute. Do not trust
+ * !apr_is_relative to determine if the path is absolute.
+ */
+apr_status_t apr_is_relative(apr_canon_t **path);
+
+/**
+ * Returns APR_SUCCESS if the elements 0..elements resolves to a
+ * platform's non-physical root, e.g. the //machine/ name that
+ * isn't an adaquately complete root for UNC paths.
+ */
+apr_status_t apr_is_virtualroot(apr_canon_t **path, int elements);
+
+/**
* Open the specified file.
* @param new_file The opened file descriptor.
* @param fname The full path to the file (using / on all systems)
@@ -207,7 +318,7 @@
* Moving files or directories across devices may not be possible.
*/
apr_status_t apr_rename_file(const char *from_path, const char *to_path,
- apr_pool_t *pool);
+ apr_pool_t *pool);
/**
* Are we at the end of the file
1.17 +2 -2 apache-2.0/src/lib/apr/misc/win32/names.c
Index: names.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/misc/win32/names.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- names.c 2000/10/16 06:04:47 1.16
+++ names.c 2000/10/23 17:21:14 1.17
@@ -82,8 +82,8 @@
* is present on the existing path. This routine also
* converts alias names to long names.
*/
-APR_DECLARE(char *) apr_os_systemcase_filename(apr_pool_t *pCont,
- const char *szFile)
+static char * apr_os_systemcase_filename(apr_pool_t *pCont,
+ const char *szFile)
{
char buf[HUGE_STRING_LEN];
char *pInputName;