* between 1 and 32 bytes for SSLv3/TLSv1, typically 32 bytes.
* It seems that the typical length of the external ASN1 representation
* of a session is 118 or 119 bytes for SSLv3/TSLv1.
- * Thus we allocate separatly an rbtree node, a session id, and an ASN1
- * representation and on 32-bit platforms they take accordingly 64, 32, and
- * 128 bytes.
+ *
+ * Thus on 32-bit platforms we allocate separately an rbtree node,
+ * a session id, and an ASN1 representation, they take accordingly
+ * 64, 32, and 128 bytes.
+ *
+ * On 64-bit platforms we allocate separately an rbtree node + session_id,
+ * and an ASN1 representation, they take accordingly 128 and 128 bytes.
*
* OpenSSL's i2d_SSL_SESSION() and d2i_SSL_SESSION are slow,
* so they are outside the code locked by shared pool mutex
cached_sess = ngx_slab_alloc_locked(shpool, len);
if (cached_sess == NULL) {
- id = NULL;
+ sess_id = NULL;
goto failed;
}
}
- id = ngx_slab_alloc_locked(shpool, sess->session_id_length);
- if (id == NULL) {
+ sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));
+ if (sess_id == NULL) {
goto failed;
}
- sess_id = ngx_slab_alloc_locked(shpool, sizeof(ngx_ssl_sess_id_t));
- if (sess_id == NULL) {
+#if (NGX_PTR_SIZE == 8)
+
+ id = sess_id->sess_id;
+
+#else
+
+ id = ngx_slab_alloc_locked(shpool, sess->session_id_length);
+ if (id == NULL) {
goto failed;
}
+#endif
+
ngx_memcpy(cached_sess, buf, len);
ngx_memcpy(id, sess->session_id, sess->session_id_length);
ngx_slab_free_locked(shpool, cached_sess);
}
- if (id) {
- ngx_slab_free_locked(shpool, id);
+ if (sess_id) {
+ ngx_slab_free_locked(shpool, sess_id);
}
ngx_shmtx_unlock(&shpool->mutex);
ngx_rbtree_delete(cache->session_rbtree, node);
ngx_slab_free_locked(shpool, sess_id->session);
+#if (NGX_PTR_SIZE == 4)
ngx_slab_free_locked(shpool, sess_id->id);
+#endif
ngx_slab_free_locked(shpool, sess_id);
sess = NULL;
ngx_rbtree_delete(cache->session_rbtree, node);
ngx_slab_free_locked(shpool, sess_id->session);
+#if (NGX_PTR_SIZE == 4)
ngx_slab_free_locked(shpool, sess_id->id);
+#endif
ngx_slab_free_locked(shpool, sess_id);
goto done;
"expire session: %08Xi", sess_id->node.key);
ngx_slab_free_locked(shpool, sess_id->session);
+#if (NGX_PTR_SIZE == 4)
ngx_slab_free_locked(shpool, sess_id->id);
+#endif
ngx_slab_free_locked(shpool, sess_id);
}
}