You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by yl...@apache.org on 2021/09/19 17:07:33 UTC

svn commit: r1893448 - in /apr/apr-util/branches/1.6.x: ./ buckets/apr_buckets_file.c

Author: ylavic
Date: Sun Sep 19 17:07:33 2021
New Revision: 1893448

URL: http://svn.apache.org/viewvc?rev=1893448&view=rev
Log:
Partially merge r1893204, r1893445 from trunk:

apr_file_setasidea() needs to invalidate the old file descriptor per semantics:
 * @remark After calling this function, old_file may not be used

So to avoid the setaside issue with splitted file buckets, file_bucket_setaside()
will now apr_file_dup() instead of apr_file_setaside() when the bucket is shared
(i.e. refcount > 1).

Submitted by: ylavic

Modified:
    apr/apr-util/branches/1.6.x/   (props changed)
    apr/apr-util/branches/1.6.x/buckets/apr_buckets_file.c

Propchange: apr/apr-util/branches/1.6.x/
------------------------------------------------------------------------------
  Merged /apr/apr/trunk:r1893204,1893445

Modified: apr/apr-util/branches/1.6.x/buckets/apr_buckets_file.c
URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.6.x/buckets/apr_buckets_file.c?rev=1893448&r1=1893447&r2=1893448&view=diff
==============================================================================
--- apr/apr-util/branches/1.6.x/buckets/apr_buckets_file.c (original)
+++ apr/apr-util/branches/1.6.x/buckets/apr_buckets_file.c Sun Sep 19 17:07:33 2021
@@ -212,9 +212,9 @@ APU_DECLARE(apr_status_t) apr_bucket_fil
     return APR_SUCCESS;
 }
 
-static apr_status_t file_bucket_setaside(apr_bucket *data, apr_pool_t *reqpool)
+static apr_status_t file_bucket_setaside(apr_bucket *b, apr_pool_t *reqpool)
 {
-    apr_bucket_file *a = data->data;
+    apr_bucket_file *a = b->data;
     apr_file_t *fd = NULL;
     apr_file_t *f = a->fd;
     apr_pool_t *curpool = apr_file_pool_get(f);
@@ -223,11 +223,33 @@ static apr_status_t file_bucket_setaside
         return APR_SUCCESS;
     }
 
-    if (!apr_pool_is_ancestor(a->readpool, reqpool)) {
-        a->readpool = reqpool;
-    }
+    /* If the file is shared/split accross multiple buckets, this bucket can't
+     * take exclusive ownership with apr_file_setaside() (thus invalidating the
+     * f->filedes), let's apr_file_dup() in this case instead.
+     */
+    if (a->refcount.refcount > 1) {
+        apr_bucket_file *new;
+        apr_status_t rv;
+
+        rv = apr_file_dup(&fd, f, reqpool);
+        if (rv != APR_SUCCESS) {
+            return rv;
+        }
+
+        new = apr_bucket_alloc(sizeof(*new), b->list);
+        memcpy(new, a, sizeof(*new));
+        new->refcount.refcount = 1;
+        new->readpool = reqpool;
 
-    apr_file_setaside(&fd, f, reqpool);
+        a->refcount.refcount--;
+        a = b->data = new;
+    }
+    else {
+        apr_file_setaside(&fd, f, reqpool);
+        if (!apr_pool_is_ancestor(a->readpool, reqpool)) {
+            a->readpool = reqpool;
+        }
+    }
     a->fd = fd;
     return APR_SUCCESS;
 }