Changeset ae015fa in mod_gnutls for src/gnutls_cache.c


Ignore:
Timestamp:
Jan 11, 2013, 12:58:03 AM (8 years ago)
Author:
Daniel Kahn Gillmor <dkg@…>
Branches:
debian/master, debian/stretch-backports, jessie-backports
Children:
9c4a744
Parents:
e03f404 (diff), bbb9bb1 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge tag 'upstream/0.5.7'

Upstream version 0.5.7

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/gnutls_cache.c

    re03f404 rae015fa  
    3434#endif
    3535
     36/* it seems the default has some strange errors. Use SDBM
     37 */
     38#define ODB "SDBM"
    3639
    3740#define MC_TAG "mod_gnutls:"
     
    296299#define SSL_DBM_FILE_MODE ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD )
    297300
    298 static int dbm_cache_expire(mgs_handle_t *ctxt)
     301static void dbm_cache_expire(mgs_handle_t *ctxt)
    299302{
    300303    apr_status_t rv;
    301304    apr_dbm_t *dbm;
    302     apr_datum_t *keylist;
    303305    apr_datum_t dbmkey;
    304306    apr_datum_t dbmval;
    305     apr_time_t ex;
     307    apr_time_t now;
    306308    apr_time_t dtime;
    307309    apr_pool_t* spool;
    308     int i = 0;
    309     int keyidx = 0;
    310     int should_delete = 0;
     310    int total, deleted;
     311
     312    now = apr_time_now();
     313   
     314    if (now - ctxt->sc->last_cache_check < (ctxt->sc->cache_timeout)/2)
     315        return;
     316
     317    ctxt->sc->last_cache_check = now;
    311318
    312319    apr_pool_create(&spool, ctxt->c->pool);
    313     ex = apr_time_now();
    314    
    315     rv = apr_dbm_open(&dbm, ctxt->sc->cache_config, APR_DBM_READONLY,
     320
     321    total = 0;
     322    deleted = 0;
     323
     324    rv = apr_dbm_open_ex(&dbm, ODB, ctxt->sc->cache_config, APR_DBM_RWCREATE,
    316325                      SSL_DBM_FILE_MODE, spool);
    317326    if (rv != APR_SUCCESS) {
     
    320329                     "[gnutls_cache] error opening cache searcher '%s'",
    321330                     ctxt->sc->cache_config);
    322         return -1;
    323     }
    324 
    325 #define KEYMAX 128
    326 
    327     keylist = apr_palloc(spool, sizeof(dbmkey)*KEYMAX);
     331        apr_pool_destroy(spool);
     332        return;
     333    }
    328334
    329335    apr_dbm_firstkey(dbm, &dbmkey);
    330336    while (dbmkey.dptr != NULL) {
    331337        apr_dbm_fetch(dbm, dbmkey, &dbmval);
    332         if (dbmval.dptr != NULL) {
    333             if (dbmval.dsize >= sizeof(apr_time_t)) {
     338        if (dbmval.dptr != NULL && dbmval.dsize >= sizeof(apr_time_t)) {
    334339                memcpy(&dtime, dbmval.dptr, sizeof(apr_time_t));
    335                 if (dtime < ex) {
    336                     should_delete = 1;
     340
     341                if (now >= dtime) {
     342                    apr_dbm_delete(dbm, dbmkey);
     343                    deleted++;
    337344                }
    338             }
    339             else {
    340                 should_delete = 1;
    341             }
    342            
    343             if (should_delete == 1) {
    344                 should_delete = 0;
    345                 keylist[keyidx].dptr = apr_palloc(spool, dbmkey.dsize) ;
    346                 memcpy(keylist[keyidx].dptr, dbmkey.dptr, dbmkey.dsize);
    347                 keylist[keyidx].dsize = dbmkey.dsize;
    348                 keyidx++;
    349                 if (keyidx == KEYMAX) {
    350                     break;
    351                 }
    352             }
    353             apr_dbm_freedatum( dbm, dbmval);
    354            
    355         }
     345                apr_dbm_freedatum( dbm, dbmval);
     346        } else {
     347            apr_dbm_delete(dbm, dbmkey);
     348            deleted++;
     349        }
     350        total++;
    356351        apr_dbm_nextkey(dbm, &dbmkey);
    357352    }
    358353    apr_dbm_close(dbm);
    359354
    360     rv = apr_dbm_open(&dbm, ctxt->sc->cache_config,
    361                   APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, spool);
    362     if (rv != APR_SUCCESS) {
    363         ap_log_error(APLOG_MARK, APLOG_NOTICE, rv,
    364                  ctxt->c->base_server,
    365                  "[gnutls_cache] error opening cache writer '%s'",
    366                  ctxt->sc->cache_config);
    367         return -1;
    368     }
    369 
    370     for (i = 0; i < keyidx; i++) {
    371         apr_dbm_delete(dbm, keylist[i]);
    372     }
    373 
    374     apr_dbm_close(dbm);
     355    ap_log_error(APLOG_MARK, APLOG_DEBUG, rv,
     356                     ctxt->c->base_server,
     357                     "[gnutls_cache] Cleaned up cache '%s'. Deleted %d and left %d",
     358                     ctxt->sc->cache_config, deleted, total-deleted);
     359
    375360    apr_pool_destroy(spool);
    376361   
    377     return 0;
     362    return;
    378363}
    379364
     
    390375        return data;
    391376
    392     rv = apr_dbm_open(&dbm, ctxt->sc->cache_config,
    393                       APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, ctxt->c->pool);
     377    rv = apr_dbm_open_ex(&dbm, ODB, ctxt->sc->cache_config,
     378                      APR_DBM_READONLY, SSL_DBM_FILE_MODE, ctxt->c->pool);
    394379    if (rv != APR_SUCCESS) {
    395380        ap_log_error(APLOG_MARK, APLOG_NOTICE, rv,
     
    439424    apr_status_t rv;
    440425    apr_time_t expiry;
     426    apr_pool_t* spool;
    441427
    442428    if (mgs_session_id2dbm(ctxt->c, key.data, key.size, &dbmkey) < 0)
    443429        return -1;
     430
     431    /* we expire dbm only on every store
     432     */
     433    dbm_cache_expire(ctxt);
     434
     435    apr_pool_create(&spool, ctxt->c->pool);
    444436
    445437    /* create DBM value */
    446438    dbmval.dsize = data.size + sizeof(apr_time_t);
    447     dbmval.dptr  = (char *)malloc(dbmval.dsize);
     439    dbmval.dptr  = (char *)apr_palloc(spool, dbmval.dsize);
    448440
    449441    expiry = apr_time_now() + ctxt->sc->cache_timeout;
     
    453445           data.data, data.size);
    454446
    455     /* we expire dbm only on every store
    456      */
    457     dbm_cache_expire(ctxt);
    458 
    459     rv = apr_dbm_open(&dbm, ctxt->sc->cache_config,
     447    rv = apr_dbm_open_ex(&dbm, ODB, ctxt->sc->cache_config,
    460448                      APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, ctxt->c->pool);
    461449    if (rv != APR_SUCCESS) {
     
    464452                     "[gnutls_cache] error opening cache '%s'",
    465453                     ctxt->sc->cache_config);
    466         free(dbmval.dptr);       
     454        apr_pool_destroy(spool);
    467455        return -1;
    468456    }
     
    476464                     ctxt->sc->cache_config);
    477465        apr_dbm_close(dbm);
    478         free(dbmval.dptr);
     466        apr_pool_destroy(spool);
    479467        return -1;
    480468    }
     
    482470    apr_dbm_close(dbm);
    483471
    484     free(dbmval.dptr);
     472    apr_pool_destroy(spool);
    485473   
    486474    return 0;
     
    497485        return -1;
    498486
    499     rv = apr_dbm_open(&dbm, ctxt->sc->cache_config,
     487    rv = apr_dbm_open_ex(&dbm, ODB, ctxt->sc->cache_config,
    500488                      APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, ctxt->c->pool);
    501489    if (rv != APR_SUCCESS) {
     
    531519    const char* path2;
    532520
    533     rv = apr_dbm_open(&dbm, sc->cache_config, APR_DBM_RWCREATE,
     521    rv = apr_dbm_open_ex(&dbm, ODB, sc->cache_config, APR_DBM_RWCREATE,
    534522                      SSL_DBM_FILE_MODE, p);
    535523
     
    543531    apr_dbm_close(dbm);
    544532
    545     apr_dbm_get_usednames(p, sc->cache_config, &path1, &path2);
     533    apr_dbm_get_usednames_ex(p, ODB, sc->cache_config, &path1, &path2);
    546534
    547535    /* The Following Code takes logic directly from mod_ssl's DBM Cache */
    548536#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
    549537    /* Running as Root */
    550     if (geteuid() == 0)  {
     538    if (path1 && geteuid() == 0)  {
    551539        chown(path1, ap_unixd_config.user_id, -1);
    552540        if (path2 != NULL) {
Note: See TracChangeset for help on using the changeset viewer.