You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by jo...@apache.org on 2004/05/17 16:13:50 UTC

cvs commit: httpd-2.0/modules/dav/main util.c

jorton      2004/05/17 07:13:50

  Modified:    .        Tag: APACHE_2_0_BRANCH STATUS
               modules/dav/fs Tag: APACHE_2_0_BRANCH repos.c
               modules/dav/main Tag: APACHE_2_0_BRANCH util.c
  Log:
  Backport some mod_dav fixes:
  
  * modules/dav/fs/repos.c (MAP_IO2HTTP): New macro.
  (dav_fs_copymove_file): Use it to give a 507 if open() returns ENOSPC,
  and use it to handle apr_file_write_full() return code.
  (dav_fs_open_stream): Use MAP_IO2HTTP.
  (dav_fs_create_collection): Use APR_STATUS_IS_ENOSPC.
  
  * modules/dav/fs/repos.c (dav_fs_copymove_file): Update for the fact
  that apr_file_read() has guaranteed len == 0 at EOF for a looong time;
  and avoid a redundant call to write(,,0) when EOF is reached.
  
  * modules/dav/main/util.c (dav_validate_resource_state): Fix a 2617
  violation: if the lock user validation fails, rather than giving a 401
  without a WWW-Authenticate header, give a 403.
  
  Reviewed by: André Malo, Jeff Trawick
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.751.2.856 +1 -9      httpd-2.0/STATUS
  
  Index: STATUS
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/STATUS,v
  retrieving revision 1.751.2.855
  retrieving revision 1.751.2.856
  diff -d -u -r1.751.2.855 -r1.751.2.856
  --- STATUS	14 May 2004 11:30:42 -0000	1.751.2.855
  +++ STATUS	17 May 2004 14:13:49 -0000	1.751.2.856
  @@ -227,18 +227,10 @@
          http://cvs.apache.org/viewcvs.cgi/httpd-2.0/modules/aaa/mod_auth_digest.c?r1=1.86&r2=1.87
          +1: geoff, nd
   
  -    *) mod_dav: Fix a 2617 compliance issue
  -       http://cvs.apache.org/viewcvs.cgi/httpd-2.0/modules/dav/main/util.c?r1=1.53&r2=1.54
  -       +1: jorton, nd, trawick
  -
       *) mod_dav: Send an EOS at the end of the multistatus brigade.
          http://cvs.apache.org/viewcvs.cgi/httpd-2.0/modules/dav/main/mod_dav.c?r1=1.105&r2=1.106
          +1: jorton
            nd asks: Sure, you want to drop the return code of ap_pass_brigade?
  -
  -    *) mod_dav_fs: Better ENOSPC handling and a remove a write(,,0) call:
  -       http://cvs.apache.org/viewcvs.cgi/httpd-2.0/modules/dav/fs/repos.c?r1=1.77&r2=1.79
  -       +1: jorton, nd, trawick
   
       *) Allow Satisfy directives to be influenced by <Limit>.
          PR: 14726
  
  
  
  No                   revision
  No                   revision
  1.72.2.5  +21 -24    httpd-2.0/modules/dav/fs/repos.c
  
  Index: repos.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/dav/fs/repos.c,v
  retrieving revision 1.72.2.4
  retrieving revision 1.72.2.5
  diff -d -u -r1.72.2.4 -r1.72.2.5
  --- repos.c	9 Feb 2004 20:53:15 -0000	1.72.2.4
  +++ repos.c	17 May 2004 14:13:50 -0000	1.72.2.5
  @@ -182,6 +182,11 @@
       const char *pathname;       /* we may need to remove it at close time */
   };
   
  +/* returns an appropriate HTTP status code given an APR status code for a 
  + * failed I/O operation.  ### use something besides 500? */
  +#define MAP_IO2HTTP(e) (APR_STATUS_IS_ENOSPC(e) ? HTTP_INSUFFICIENT_STORAGE : \
  +                        HTTP_INTERNAL_SERVER_ERROR)
  +
   /* forward declaration for internal treewalkers */
   static dav_error * dav_fs_walk(const dav_walk_params *params, int depth,
                                  dav_response **response);
  @@ -301,6 +306,7 @@
       dav_buffer work_buf = { 0 };
       apr_file_t *inf = NULL;
       apr_file_t *outf = NULL;
  +    apr_status_t status;
   
       if (pbuf == NULL)
           pbuf = &work_buf;
  @@ -315,18 +321,17 @@
       }
   
       /* ### do we need to deal with the umask? */
  -    if ((apr_file_open(&outf, dst, APR_WRITE | APR_CREATE | APR_TRUNCATE | APR_BINARY,
  -                 APR_OS_DEFAULT, p)) != APR_SUCCESS) {
  +    status = apr_file_open(&outf, dst, APR_WRITE | APR_CREATE | APR_TRUNCATE 
  +                           | APR_BINARY, APR_OS_DEFAULT, p);
  +    if (status != APR_SUCCESS) {
           apr_file_close(inf);
   
  -        /* ### use something besides 500? */
  -        return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0,
  +        return dav_new_error(p, MAP_IO2HTTP(status), 0,
                                "Could not open file for writing");
       }
   
       while (1) {
           apr_size_t len = DAV_FS_COPY_BLOCKSIZE;
  -        apr_status_t status;
   
           status = apr_file_read(inf, pbuf->buf, &len);
           if (status != APR_SUCCESS && status != APR_EOF) {
  @@ -348,10 +353,12 @@
                                    "Could not read input file");
           }
   
  -        /* write any bytes that were read (applies to APR_EOF, too) */
  -        if (apr_file_write_full(outf, pbuf->buf, len, NULL) != APR_SUCCESS) {
  -            int save_errno = errno;
  +        if (status == APR_EOF)
  +            break;
   
  +        /* write any bytes that were read */
  +        status = apr_file_write_full(outf, pbuf->buf, len, NULL);
  +        if (status != APR_SUCCESS) {
               apr_file_close(inf);
               apr_file_close(outf);
   
  @@ -365,19 +372,9 @@
                                        "inconsistent state.");
               }
   
  -            if (save_errno == ENOSPC) {
  -                return dav_new_error(p, HTTP_INSUFFICIENT_STORAGE, 0,
  -                                     "There is not enough storage to write to "
  -                                     "this resource.");
  -            }
  -
  -            /* ### use something besides 500? */
  -            return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0,
  +            return dav_new_error(p, MAP_IO2HTTP(status), 0,
                                    "Could not write output file");
           }
  -
  -        if (status == APR_EOF)
  -            break;
       }
   
       apr_file_close(inf);
  @@ -817,6 +814,7 @@
       apr_pool_t *p = resource->info->pool;
       dav_stream *ds = apr_pcalloc(p, sizeof(*ds));
       apr_int32_t flags;
  +    apr_status_t rv;
   
       switch (mode) {
       default:
  @@ -833,10 +831,9 @@
   
       ds->p = p;
       ds->pathname = resource->info->pathname;
  -    if (apr_file_open(&ds->f, ds->pathname, flags, APR_OS_DEFAULT, 
  -                ds->p) != APR_SUCCESS) {
  -        /* ### use something besides 500? */
  -        return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0,
  +    rv = apr_file_open(&ds->f, ds->pathname, flags, APR_OS_DEFAULT, ds->p);
  +    if (rv != APR_SUCCESS) {
  +        return dav_new_error(p, MAP_IO2HTTP(rv), 0,
                                "An error occurred while opening a resource.");
       }
   
  @@ -985,7 +982,7 @@
       apr_status_t status;
   
       status = apr_dir_make(ctx->pathname, APR_OS_DEFAULT, ctx->pool);
  -    if (status == ENOSPC) {
  +    if (APR_STATUS_IS_ENOSPC(status)) {
           return dav_new_error(ctx->pool, HTTP_INSUFFICIENT_STORAGE, 0,
                                "There is not enough storage to create "
                                "this collection.");
  
  
  
  No                   revision
  No                   revision
  1.42.2.7  +1 -1      httpd-2.0/modules/dav/main/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/dav/main/util.c,v
  retrieving revision 1.42.2.6
  retrieving revision 1.42.2.7
  diff -d -u -r1.42.2.6 -r1.42.2.7
  --- util.c	9 Feb 2004 20:53:15 -0000	1.42.2.6
  +++ util.c	17 May 2004 14:13:50 -0000	1.42.2.7
  @@ -1145,7 +1145,7 @@
                                               "\" submitted a locktoken created "
                                               "by user \"",
                                               lock->auth_user, "\".", NULL);
  -                        return dav_new_error(p, HTTP_UNAUTHORIZED, 0, errmsg);
  +                        return dav_new_error(p, HTTP_FORBIDDEN, 0, errmsg);
                       }
   
                       /*