martin 99/10/23 13:15:18
Modified: src/lib/apr/file_io/unix dir.c src/lib/apr/file_io/win32 dir.c src/lib/apr/include apr_portable.h Log: Fix interface of ap_get_os_dir(): it previously modified a local pointer without returning anything sensible. Also, in ap_readdir() I modified a questionable use of an uninitialized variable (save_errno) which could result in an endless loop returning APR_SUCCESS when in fact EOF was reached. Revision Changes Path 1.12 +6 -7 apache-2.0/src/lib/apr/file_io/unix/dir.c Index: dir.c =================================================================== RCS file: /export/home/cvs/apache-2.0/src/lib/apr/file_io/unix/dir.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- dir.c 1999/10/21 13:15:55 1.11 +++ dir.c 1999/10/23 20:15:16 1.12 @@ -127,13 +127,12 @@ #if APR_HAS_THREADS && _POSIX_THREAD_SAFE_FUNCTIONS return readdir_r(thedir->dirstruct, thedir->entry, &thedir->entry); #else - int save_errno; - ap_status_t status; thedir->entry = readdir(thedir->dirstruct); if (thedir->entry == NULL) { - if (errno == save_errno) { - return APR_SUCCESS; + /* If NULL was returned, this can NEVER be a success. Can it?! */ + if (errno == APR_SUCCESS) { + return APR_ENOENT; } return errno; } @@ -294,17 +293,17 @@ } /* ***APRDOC******************************************************** - * ap_status_t ap_get_os_dir(ap_os_dir_t *, ap_dir_t *) + * ap_status_t ap_get_os_dir(ap_os_dir_t **, ap_dir_t *) * convert the dir from apr type to os specific type. * arg 1) The apr dir to convert. * arg 2) The os specific dir we are converting to */ -ap_status_t ap_get_os_dir(ap_os_dir_t *thedir, struct dir_t *dir) +ap_status_t ap_get_os_dir(ap_os_dir_t **thedir, struct dir_t *dir) { if (dir == NULL) { return APR_ENODIR; } - thedir = dir->dirstruct; + *thedir = dir->dirstruct; return APR_SUCCESS; } 1.6 +2 -2 apache-2.0/src/lib/apr/file_io/win32/dir.c Index: dir.c =================================================================== RCS file: /export/home/cvs/apache-2.0/src/lib/apr/file_io/win32/dir.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- dir.c 1999/10/12 06:14:43 1.5 +++ dir.c 1999/10/23 20:15:17 1.6 @@ -210,12 +210,12 @@ return APR_SUCCESS; } -ap_status_t ap_get_os_dir(ap_os_dir_t *thedir, struct dir_t *dir) +ap_status_t ap_get_os_dir(ap_os_dir_t **thedir, struct dir_t *dir) { if (dir == NULL) { return APR_ENODIR; } - thedir = dir->dirhand; + *thedir = dir->dirhand; return APR_SUCCESS; } 1.12 +1 -1 apache-2.0/src/lib/apr/include/apr_portable.h Index: apr_portable.h =================================================================== RCS file: /export/home/cvs/apache-2.0/src/lib/apr/include/apr_portable.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- apr_portable.h 1999/10/22 22:30:41 1.11 +++ apr_portable.h 1999/10/23 20:15:18 1.12 @@ -187,7 +187,7 @@ #endif ap_status_t ap_get_os_file(ap_os_file_t *, ap_file_t *); -ap_status_t ap_get_os_dir(ap_os_dir_t *, ap_dir_t *); +ap_status_t ap_get_os_dir(ap_os_dir_t **, ap_dir_t *); ap_status_t ap_get_os_sock(ap_os_sock_t *, ap_socket_t *); ap_status_t ap_get_os_lock(ap_os_lock_t *, ap_lock_t *); ap_status_t ap_get_os_proc(ap_os_proc_t *, ap_proc_t *);