openssl 쳐내!

This commit is contained in:
2025-06-15 23:21:54 +09:00
parent 9949ec80fb
commit 54fab0ad23
7 changed files with 9 additions and 161 deletions

View File

@@ -192,59 +192,10 @@ void IOCP::iocpWatcher_(utils::ThreadPool* IOCPThread) {
std::lock_guard lock(*GetRecvQueueMutex_(sock));
auto queue_list = GetRecvQueue_(sock);
if (data->event == IOCPEVENT::READ) {
if (proto_ == SessionProtocol::TLS ||
proto_ == SessionProtocol::QUIC) { // DEPRECATED. openssl을 사용할 수가
// 없기 때문에 추후 완성 뒤에 기능을
// 붙이든 해야 할 듯 함.
// DEBUG: BIO_write 전 OpenSSL 에러 스택 확인 (혹시 모를 이전 에러)
ERR_print_errors_fp(stderr); // 이미 오류 스택에 뭔가 있는지 확인용
fprintf(stderr, "--- Before BIO_write ---\n");
::BIO_write(::SSL_get_rbio(data->ssl.get()), data->wsabuf.buf,
cbTransfrred);
// DEBUG: BIO_write 후 OpenSSL 에러 스택 확인 (BIO_write에서 에러 발생 시)
ERR_print_errors_fp(stderr); // BIO_write에서도 에러가 발생할 수 있음
fprintf(stderr, "--- After BIO_write, cbTransfrred: %lu ---\n",
cbTransfrred);
while ((red_data = ::SSL_read(data->ssl.get(), buf.data(), buf.size())) >
0) {
queue_list->emplace_back(std::make_pair(
std::vector<char>(buf.begin(), buf.begin() + red_data), 0));
}
if (red_data == -1) {
auto ssl_error_code = SSL_get_error(
data->ssl.get(), red_data); // 여기서 SSL_get_error 결과 저장
auto err_msg = std::format("SSL_read failed with SSL_get_error: {}",
ssl_error_code);
fprintf(stderr, "%s\n", err_msg.c_str());
// *** 가장 중요한 부분: SSL_ERROR_SSL일 때 상세 에러를 강제로 출력 시도
// ***
if (ssl_error_code == SSL_ERROR_SSL) {
fprintf(stderr, "Detailed SSL_ERROR_SSL trace:\n");
unsigned long err_peek;
// ERR_get_error()를 사용하여 스택의 모든 오류를 팝하고 출력
while ((err_peek = ERR_get_error()) != 0) {
char err_str[256];
ERR_error_string_n(err_peek, err_str, sizeof(err_str));
fprintf(stderr, "OpenSSL stack error: %s\n", err_str);
}
} else {
// SSL_ERROR_SSL이 아닌 다른 오류 (SYSCALL, WANT_READ 등)일 경우
// ERR_print_errors_fp는 여전히 유용할 수 있음
ERR_print_errors_fp(stderr);
}
throw std::runtime_error(err_msg); // 예외 발생
}
} else {
::memcpy(buf.data(), data->wsabuf.buf, data->transferredbytes);
queue_list->emplace_back(std::make_pair(
std::vector<char>(buf.begin(), buf.begin() + data->transferredbytes),
0));
}
::memcpy(buf.data(), data->wsabuf.buf, data->transferredbytes);
queue_list->emplace_back(std::make_pair(
std::vector<char>(buf.begin(), buf.begin() + data->transferredbytes),
0));
DWORD recvbytes = 0, flags = 0;
IOCPPASSINDATA* recv_data = new IOCPPASSINDATA(data->bufsize);
@@ -314,34 +265,10 @@ void IOCP::packet_sender_(SOCKET sock) {
int data_len = 0;
if (proto_ == SessionProtocol::TLS || proto_ == SessionProtocol::QUIC) {
int ret =
::SSL_write(front->ssl.get(), front->wsabuf.buf, front->wsabuf.len);
if (ret <= 0) {
int err = ::SSL_get_error(front->ssl.get(), ret);
if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
queue->push_front(front);
break;
}
std::unique_lock lk(socket_mod_mutex_);
send_queue_.erase(sock);
break;
}
while ((data_len = ::BIO_read(::SSL_get_wbio(front->ssl.get()),
buf.data(), buf.size())) > 0) {
wsabuf.buf = buf.data();
wsabuf.len = data_len;
::WSASend(sock, &wsabuf, 1, &sendbytes, 0, nullptr, nullptr);
}
} else {
data_len = front->wsabuf.len;
wsabuf.buf = front->wsabuf.buf;
wsabuf.len = data_len;
::WSASend(sock, &wsabuf, 1, &sendbytes, 0, nullptr, nullptr);
}
data_len = front->wsabuf.len;
wsabuf.buf = front->wsabuf.buf;
wsabuf.len = data_len;
::WSASend(sock, &wsabuf, 1, &sendbytes, 0, nullptr, nullptr);
}
}