Changeset 03a9a6b in mod_gnutls for src/gnutls_cache.c
- Timestamp:
- Jun 30, 2010, 8:47:51 PM (11 years ago)
- Branches:
- asyncio, debian/master, debian/stretch-backports, jessie-backports, master, msva, proxy-ticket, upstream
- Children:
- 7b3e5de
- Parents:
- 3928f79
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/gnutls_cache.c
r3928f79 r03a9a6b 34 34 #endif 35 35 36 /* it seems the default has some strange errors. Use SDBM 37 */ 38 #define ODB "SDBM" 36 39 37 40 #define MC_TAG "mod_gnutls:" … … 296 299 #define SSL_DBM_FILE_MODE ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD ) 297 300 298 static intdbm_cache_expire(mgs_handle_t *ctxt)301 static void dbm_cache_expire(mgs_handle_t *ctxt) 299 302 { 300 303 apr_status_t rv; 301 304 apr_dbm_t *dbm; 302 apr_datum_t *keylist;303 305 apr_datum_t dbmkey; 304 306 apr_datum_t dbmval; 305 apr_time_t ex;307 apr_time_t now; 306 308 apr_time_t dtime; 307 309 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; 318 318 319 319 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, 322 325 SSL_DBM_FILE_MODE, spool); 323 326 if (rv != APR_SUCCESS) { … … 326 329 "[gnutls_cache] error opening cache searcher '%s'", 327 330 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 } 334 334 335 335 apr_dbm_firstkey(dbm, &dbmkey); 336 336 while (dbmkey.dptr != NULL) { 337 337 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)) { 340 339 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++; 343 344 } 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++; 362 351 apr_dbm_nextkey(dbm, &dbmkey); 363 352 } 364 353 apr_dbm_close(dbm); 365 354 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 381 360 apr_pool_destroy(spool); 382 361 383 return 0;362 return; 384 363 } 385 364 … … 396 375 return data; 397 376 398 rv = apr_dbm_open (&dbm, ctxt->sc->cache_config,377 rv = apr_dbm_open_ex(&dbm, ODB, ctxt->sc->cache_config, 399 378 APR_DBM_READONLY, SSL_DBM_FILE_MODE, ctxt->c->pool); 400 379 if (rv != APR_SUCCESS) { … … 445 424 apr_status_t rv; 446 425 apr_time_t expiry; 426 apr_pool_t* spool; 447 427 448 428 if (mgs_session_id2dbm(ctxt->c, key.data, key.size, &dbmkey) < 0) 449 429 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); 450 436 451 437 /* create DBM value */ 452 438 dbmval.dsize = data.size + sizeof(apr_time_t); 453 dbmval.dptr = (char *) malloc(dbmval.dsize);439 dbmval.dptr = (char *)apr_palloc(spool, dbmval.dsize); 454 440 455 441 expiry = apr_time_now() + ctxt->sc->cache_timeout; … … 459 445 data.data, data.size); 460 446 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, 466 448 APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, ctxt->c->pool); 467 449 if (rv != APR_SUCCESS) { … … 470 452 "[gnutls_cache] error opening cache '%s'", 471 453 ctxt->sc->cache_config); 472 free(dbmval.dptr);454 apr_pool_destroy(spool); 473 455 return -1; 474 456 } … … 482 464 ctxt->sc->cache_config); 483 465 apr_dbm_close(dbm); 484 free(dbmval.dptr);466 apr_pool_destroy(spool); 485 467 return -1; 486 468 } … … 488 470 apr_dbm_close(dbm); 489 471 490 free(dbmval.dptr);472 apr_pool_destroy(spool); 491 473 492 474 return 0; … … 503 485 return -1; 504 486 505 rv = apr_dbm_open (&dbm, ctxt->sc->cache_config,487 rv = apr_dbm_open_ex(&dbm, ODB, ctxt->sc->cache_config, 506 488 APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, ctxt->c->pool); 507 489 if (rv != APR_SUCCESS) { … … 537 519 const char* path2; 538 520 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, 540 522 SSL_DBM_FILE_MODE, p); 541 523 … … 549 531 apr_dbm_close(dbm); 550 532 551 apr_dbm_get_usednames (p, sc->cache_config, &path1, &path2);533 apr_dbm_get_usednames_ex(p, ODB, sc->cache_config, &path1, &path2); 552 534 553 535 /* The Following Code takes logic directly from mod_ssl's DBM Cache */ 554 536 #if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) 555 537 /* Running as Root */ 556 if ( geteuid() == 0) {538 if (path1 && geteuid() == 0) { 557 539 chown(path1, ap_unixd_config.user_id, -1); 558 540 if (path2 != NULL) {
Note: See TracChangeset
for help on using the changeset viewer.