Changeset 03a9a6b in mod_gnutls for src/gnutls_cache.c


Ignore:
Timestamp:
Jun 30, 2010, 8:47:51 PM (9 years ago)
Author:
Nikos Mavrogiannopoulos <nmav@…>
Branches:
debian/master, debian/stretch-backports, jessie-backports, master, msva, upstream
Children:
7b3e5de
Parents:
3928f79
Message:

Force SDBM.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/gnutls_cache.c

    r3928f79 r03a9a6b  
    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;
    311 
    312     ex = apr_time_now();
    313 
    314     if (ex - ctxt->sc->last_cache_check < 900)
    315       return 0;
    316 
    317     ctxt->sc->last_cache_check = ex;
     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;
    318318
    319319    apr_pool_create(&spool, ctxt->c->pool);
    320    
    321     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,
    322325                      SSL_DBM_FILE_MODE, spool);
    323326    if (rv != APR_SUCCESS) {
     
    326329                     "[gnutls_cache] error opening cache searcher '%s'",
    327330                     ctxt->sc->cache_config);
    328         return -1;
    329     }
    330 
    331 #define KEYMAX 128
    332 
    333     keylist = apr_palloc(spool, sizeof(dbmkey)*KEYMAX);
     331        apr_pool_destroy(spool);
     332        return;
     333    }
    334334
    335335    apr_dbm_firstkey(dbm, &dbmkey);
    336336    while (dbmkey.dptr != NULL) {
    337337        apr_dbm_fetch(dbm, dbmkey, &dbmval);
    338         if (dbmval.dptr != NULL) {
    339             if (dbmval.dsize >= sizeof(apr_time_t)) {
     338        if (dbmval.dptr != NULL && dbmval.dsize >= sizeof(apr_time_t)) {
    340339                memcpy(&dtime, dbmval.dptr, sizeof(apr_time_t));
    341                 if (dtime < ex) {
    342                     should_delete = 1;
     340
     341                if (now >= dtime) {
     342                    apr_dbm_delete(dbm, dbmkey);
     343                    deleted++;
    343344                }
    344             }
    345             else {
    346                 should_delete = 1;
    347             }
    348            
    349             if (should_delete == 1) {
    350                 should_delete = 0;
    351                 keylist[keyidx].dptr = apr_palloc(spool, dbmkey.dsize) ;
    352                 memcpy(keylist[keyidx].dptr, dbmkey.dptr, dbmkey.dsize);
    353                 keylist[keyidx].dsize = dbmkey.dsize;
    354                 keyidx++;
    355                 if (keyidx == KEYMAX) {
    356                     break;
    357                 }
    358             }
    359             apr_dbm_freedatum( dbm, dbmval);
    360            
    361         }
     345                apr_dbm_freedatum( dbm, dbmval);
     346        } else {
     347            apr_dbm_delete(dbm, dbmkey);
     348            deleted++;
     349        }
     350        total++;
    362351        apr_dbm_nextkey(dbm, &dbmkey);
    363352    }
    364353    apr_dbm_close(dbm);
    365354
    366     rv = apr_dbm_open(&dbm, ctxt->sc->cache_config,
    367                   APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, spool);
    368     if (rv != APR_SUCCESS) {
    369         ap_log_error(APLOG_MARK, APLOG_NOTICE, rv,
    370                  ctxt->c->base_server,
    371                  "[gnutls_cache] error opening cache writer '%s'",
    372                  ctxt->sc->cache_config);
    373         return -1;
    374     }
    375 
    376     for (i = 0; i < keyidx; i++) {
    377         apr_dbm_delete(dbm, keylist[i]);
    378     }
    379 
    380     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
    381360    apr_pool_destroy(spool);
    382361   
    383     return 0;
     362    return;
    384363}
    385364
     
    396375        return data;
    397376
    398     rv = apr_dbm_open(&dbm, ctxt->sc->cache_config,
     377    rv = apr_dbm_open_ex(&dbm, ODB, ctxt->sc->cache_config,
    399378                      APR_DBM_READONLY, SSL_DBM_FILE_MODE, ctxt->c->pool);
    400379    if (rv != APR_SUCCESS) {
     
    445424    apr_status_t rv;
    446425    apr_time_t expiry;
     426    apr_pool_t* spool;
    447427
    448428    if (mgs_session_id2dbm(ctxt->c, key.data, key.size, &dbmkey) < 0)
    449429        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);
    450436
    451437    /* create DBM value */
    452438    dbmval.dsize = data.size + sizeof(apr_time_t);
    453     dbmval.dptr  = (char *)malloc(dbmval.dsize);
     439    dbmval.dptr  = (char *)apr_palloc(spool, dbmval.dsize);
    454440
    455441    expiry = apr_time_now() + ctxt->sc->cache_timeout;
     
    459445           data.data, data.size);
    460446
    461     /* we expire dbm only on every store
    462      */
    463     dbm_cache_expire(ctxt);
    464 
    465     rv = apr_dbm_open(&dbm, ctxt->sc->cache_config,
     447    rv = apr_dbm_open_ex(&dbm, ODB, ctxt->sc->cache_config,
    466448                      APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, ctxt->c->pool);
    467449    if (rv != APR_SUCCESS) {
     
    470452                     "[gnutls_cache] error opening cache '%s'",
    471453                     ctxt->sc->cache_config);
    472         free(dbmval.dptr);       
     454        apr_pool_destroy(spool);
    473455        return -1;
    474456    }
     
    482464                     ctxt->sc->cache_config);
    483465        apr_dbm_close(dbm);
    484         free(dbmval.dptr);
     466        apr_pool_destroy(spool);
    485467        return -1;
    486468    }
     
    488470    apr_dbm_close(dbm);
    489471
    490     free(dbmval.dptr);
     472    apr_pool_destroy(spool);
    491473   
    492474    return 0;
     
    503485        return -1;
    504486
    505     rv = apr_dbm_open(&dbm, ctxt->sc->cache_config,
     487    rv = apr_dbm_open_ex(&dbm, ODB, ctxt->sc->cache_config,
    506488                      APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, ctxt->c->pool);
    507489    if (rv != APR_SUCCESS) {
     
    537519    const char* path2;
    538520
    539     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,
    540522                      SSL_DBM_FILE_MODE, p);
    541523
     
    549531    apr_dbm_close(dbm);
    550532
    551     apr_dbm_get_usednames(p, sc->cache_config, &path1, &path2);
     533    apr_dbm_get_usednames_ex(p, ODB, sc->cache_config, &path1, &path2);
    552534
    553535    /* The Following Code takes logic directly from mod_ssl's DBM Cache */
    554536#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
    555537    /* Running as Root */
    556     if (geteuid() == 0)  {
     538    if (path1 && geteuid() == 0)  {
    557539        chown(path1, ap_unixd_config.user_id, -1);
    558540        if (path2 != NULL) {
Note: See TracChangeset for help on using the changeset viewer.