diff options
Diffstat (limited to 'subversion/libsvn_ra_serf/locks.c')
| -rw-r--r-- | subversion/libsvn_ra_serf/locks.c | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/subversion/libsvn_ra_serf/locks.c b/subversion/libsvn_ra_serf/locks.c index db2d37125a00..252c30182a5f 100644 --- a/subversion/libsvn_ra_serf/locks.c +++ b/subversion/libsvn_ra_serf/locks.c @@ -156,11 +156,20 @@ locks_closed(svn_ra_serf__xml_estate_t *xes, if (leaving_state == TIMEOUT) { - if (strcmp(cdata->data, "Infinite") == 0) + if (strcasecmp(cdata->data, "Infinite") == 0) lock_ctx->lock->expiration_date = 0; + else if (strncasecmp(cdata->data, "Second-", 7) == 0) + { + unsigned n; + SVN_ERR(svn_cstring_atoui(&n, cdata->data+7)); + + lock_ctx->lock->expiration_date = apr_time_now() + + apr_time_from_sec(n); + } else - SVN_ERR(svn_time_from_cstring(&lock_ctx->lock->creation_date, - cdata->data, lock_ctx->pool)); + return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL, + _("Invalid LOCK timeout value '%s'"), + cdata->data); } else if (leaving_state == HREF) { @@ -362,29 +371,30 @@ svn_error_t * svn_ra_serf__get_lock(svn_ra_session_t *ra_session, svn_lock_t **lock, const char *path, - apr_pool_t *pool) + apr_pool_t *result_pool) { svn_ra_serf__session_t *session = ra_session->priv; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_context_t *xmlctx; + apr_pool_t *scratch_pool = svn_pool_create(result_pool); lock_info_t *lock_ctx; const char *req_url; svn_error_t *err; - req_url = svn_path_url_add_component2(session->session_url.path, path, pool); - - lock_ctx = apr_pcalloc(pool, sizeof(*lock_ctx)); + req_url = svn_path_url_add_component2(session->session_url.path, path, + scratch_pool); - lock_ctx->pool = pool; + lock_ctx = apr_pcalloc(scratch_pool, sizeof(*lock_ctx)); + lock_ctx->pool = result_pool; lock_ctx->path = req_url; - lock_ctx->lock = svn_lock_create(pool); - lock_ctx->lock->path = apr_pstrdup(pool, path); /* be sure */ + lock_ctx->lock = svn_lock_create(result_pool); + lock_ctx->lock->path = apr_pstrdup(result_pool, path); xmlctx = svn_ra_serf__xml_context_create(locks_ttable, NULL, locks_closed, NULL, lock_ctx, - pool); - handler = svn_ra_serf__create_expat_handler(xmlctx, pool); + scratch_pool); + handler = svn_ra_serf__create_expat_handler(xmlctx, scratch_pool); handler->method = "PROPFIND"; handler->path = req_url; @@ -405,7 +415,7 @@ svn_ra_serf__get_lock(svn_ra_session_t *ra_session, lock_ctx->handler = handler; - err = svn_ra_serf__context_run_one(handler, pool); + err = svn_ra_serf__context_run_one(handler, scratch_pool); err = determine_error(handler, err); if (handler->sline.code == 404) @@ -420,7 +430,12 @@ svn_ra_serf__get_lock(svn_ra_session_t *ra_session, _("Server does not support locking features")); } - *lock = lock_ctx->lock; + if (lock_ctx->lock && lock_ctx->lock->token) + *lock = lock_ctx->lock; + else + *lock = NULL; + + svn_pool_destroy(scratch_pool); return SVN_NO_ERROR; } @@ -574,7 +589,7 @@ svn_ra_serf__unlock(svn_ra_session_t *ra_session, { SVN_ERR(svn_ra_serf__get_lock(ra_session, &existing_lock, path, iterpool)); - token = existing_lock->token; + token = existing_lock ? existing_lock->token : NULL; if (!token) { err = svn_error_createf(SVN_ERR_RA_NOT_LOCKED, NULL, |
