comparison src/http/ngx_http_upstream_round_robin.c @ 1284:be2b895d31e0

fix segfault when session was freed twice
author Igor Sysoev <igor@sysoev.ru>
date Tue, 10 Jul 2007 21:04:37 +0000
parents 451e34738078
children 8f5b5641966c 5f79db696606
comparison
equal deleted inserted replaced
1283:a3f8d6d17b94 1284:be2b895d31e0
150 150
151 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; 151 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;
152 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; 152 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;
153 r->upstream->peer.tries = rrp->peers->number; 153 r->upstream->peer.tries = rrp->peers->number;
154 #if (NGX_HTTP_SSL) 154 #if (NGX_HTTP_SSL)
155 r->upstream->peer.save_session = ngx_http_upstream_save_round_robin_peer; 155 r->upstream->peer.set_session =
156 ngx_http_upstream_set_round_robin_peer_session;
157 r->upstream->peer.save_session =
158 ngx_http_upstream_save_round_robin_peer_session;
156 #endif 159 #endif
157 160
158 return NGX_OK; 161 return NGX_OK;
159 } 162 }
160 163
326 } 329 }
327 330
328 pc->sockaddr = peer->sockaddr; 331 pc->sockaddr = peer->sockaddr;
329 pc->socklen = peer->socklen; 332 pc->socklen = peer->socklen;
330 pc->name = &peer->name; 333 pc->name = &peer->name;
331 #if (NGX_SSL)
332 pc->ssl_session = peer->ssl_session;
333 #endif
334 334
335 /* ngx_unlock_mutex(rrp->peers->mutex); */ 335 /* ngx_unlock_mutex(rrp->peers->mutex); */
336 336
337 return NGX_OK; 337 return NGX_OK;
338 338
406 } 406 }
407 407
408 408
409 #if (NGX_HTTP_SSL) 409 #if (NGX_HTTP_SSL)
410 410
411 void 411 ngx_int_t
412 ngx_http_upstream_save_round_robin_peer(ngx_peer_connection_t *pc, void *data) 412 ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
413 void *data)
413 { 414 {
414 ngx_http_upstream_rr_peer_data_t *rrp = data; 415 ngx_http_upstream_rr_peer_data_t *rrp = data;
415 416
417 ngx_int_t rc;
416 ngx_ssl_session_t *ssl_session; 418 ngx_ssl_session_t *ssl_session;
417 ngx_http_upstream_rr_peer_t *peer; 419 ngx_http_upstream_rr_peer_t *peer;
418 420
421 peer = &rrp->peers->peer[rrp->current];
422
423 /* TODO: threads only mutex */
424 /* ngx_lock_mutex(rrp->peers->mutex); */
425
426 ssl_session = peer->ssl_session;
427
428 rc = ngx_ssl_set_session(pc->connection, ssl_session);
429
430 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
431 "set session: %p:%d",
432 ssl_session, ssl_session ? ssl_session->references : 0);
433
434 /* ngx_unlock_mutex(rrp->peers->mutex); */
435
436 return rc;
437 }
438
439
440 void
441 ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
442 void *data)
443 {
444 ngx_http_upstream_rr_peer_data_t *rrp = data;
445
446 ngx_ssl_session_t *old_ssl_session, *ssl_session;
447 ngx_http_upstream_rr_peer_t *peer;
448
419 ssl_session = ngx_ssl_get_session(pc->connection); 449 ssl_session = ngx_ssl_get_session(pc->connection);
420 450
421 if (ssl_session == NULL) { 451 if (ssl_session == NULL) {
422 return; 452 return;
423 } 453 }
424 454
455 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
456 "save session: %p:%d", ssl_session, ssl_session->references);
457
425 peer = &rrp->peers->peer[rrp->current]; 458 peer = &rrp->peers->peer[rrp->current];
426 459
460 /* TODO: threads only mutex */
427 /* ngx_lock_mutex(rrp->peers->mutex); */ 461 /* ngx_lock_mutex(rrp->peers->mutex); */
462
463 old_ssl_session = peer->ssl_session;
428 peer->ssl_session = ssl_session; 464 peer->ssl_session = ssl_session;
465
429 /* ngx_unlock_mutex(rrp->peers->mutex); */ 466 /* ngx_unlock_mutex(rrp->peers->mutex); */
430 467
431 if (pc->ssl_session) { 468 if (old_ssl_session) {
469
470 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
471 "old session: %p:%d",
472 old_ssl_session, old_ssl_session->references);
473
432 /* TODO: may block */ 474 /* TODO: may block */
433 ngx_ssl_free_session(pc->ssl_session); 475
476 ngx_ssl_free_session(old_ssl_session);
434 } 477 }
435 } 478 }
436 479
437 #endif 480 #endif