src/ssl.c

changeset 34
510432315106
parent 31
87625285de20
child 37
8904bda2369f
equal deleted inserted replaced
33:cc36229b3be1 34:510432315106
207 */ 207 */
208 static int meth_create(lua_State *L) 208 static int meth_create(lua_State *L)
209 { 209 {
210 p_ssl ssl; 210 p_ssl ssl;
211 int mode = ctx_getmode(L, 1); 211 int mode = ctx_getmode(L, 1);
212 SSL_CTX *ctx = ctx_getcontext(L, 1); 212 p_context ctx = checkctx(L, 1);
213 213
214 if (mode == MD_CTX_INVALID) { 214 if (mode == MD_CTX_INVALID) {
215 lua_pushnil(L); 215 lua_pushnil(L);
216 lua_pushstring(L, "invalid mode"); 216 lua_pushstring(L, "invalid mode");
217 return 2; 217 return 2;
218 }
219 if (luasec_ssl_idx == -1) {
220 luasec_ssl_idx = SSL_get_ex_new_index(0, "luasec context", NULL, NULL, NULL);
221 if (luasec_ssl_idx == -1) {
222 lua_pushnil(L);
223 lua_pushstring(L, "error creating luasec SSL index");
224 return 2;
225 }
218 } 226 }
219 ssl = (p_ssl) lua_newuserdata(L, sizeof(t_ssl)); 227 ssl = (p_ssl) lua_newuserdata(L, sizeof(t_ssl));
220 if (!ssl) { 228 if (!ssl) {
221 lua_pushnil(L); 229 lua_pushnil(L);
222 lua_pushstring(L, "error creating SSL object"); 230 lua_pushstring(L, "error creating SSL object");
223 return 2; 231 return 2;
224 } 232 }
225 ssl->ssl = SSL_new(ctx); 233 ssl->ssl = SSL_new(ctx->context);
226 if (!ssl->ssl) { 234 if (!ssl->ssl) {
227 lua_pushnil(L); 235 lua_pushnil(L);
228 lua_pushstring(L, "error creating SSL object"); 236 lua_pushstring(L, "error creating SSL object");
229 return 2;; 237 return 2;;
230 } 238 }
234 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); 242 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
235 243
236 #ifdef SSL_MODE_RELEASE_BUFFERS 244 #ifdef SSL_MODE_RELEASE_BUFFERS
237 SSL_set_mode(ssl->ssl, SSL_MODE_RELEASE_BUFFERS); 245 SSL_set_mode(ssl->ssl, SSL_MODE_RELEASE_BUFFERS);
238 #endif 246 #endif
247
248 SSL_set_ex_data(ssl->ssl, luasec_ssl_idx, ctx);
239 249
240 if (mode == MD_CTX_SERVER) 250 if (mode == MD_CTX_SERVER)
241 SSL_set_accept_state(ssl->ssl); 251 SSL_set_accept_state(ssl->ssl);
242 else 252 else
243 SSL_set_connect_state(ssl->ssl); 253 SSL_set_connect_state(ssl->ssl);

mercurial