Fixed computing of intermediate buffer size for maximum-size RSA keys.
[BearSSL] / tools / server.c
index cac99c4..a97de35 100644 (file)
@@ -75,7 +75,7 @@ host_bind(const char *host, const char *port, int verbose)
 
                sa = (struct sockaddr *)p->ai_addr;
                if (sa->sa_family == AF_INET) {
-                       sa4 = *(struct sockaddr_in *)sa;
+                       memcpy(&sa4, sa, sizeof sa4);
                        sa = (struct sockaddr *)&sa4;
                        sa_len = sizeof sa4;
                        addr = &sa4.sin_addr;
@@ -83,7 +83,7 @@ host_bind(const char *host, const char *port, int verbose)
                                sa4.sin_addr.s_addr = INADDR_ANY;
                        }
                } else if (sa->sa_family == AF_INET6) {
-                       sa6 = *(struct sockaddr_in6 *)sa;
+                       memcpy(&sa6, sa, sizeof sa6);
                        sa = (struct sockaddr *)&sa6;
                        sa_len = sizeof sa6;
                        addr = &sa6.sin6_addr;
@@ -1058,6 +1058,9 @@ do_server(int argc, char *argv[])
                if ((req & REQ_AESCBC) != 0) {
                        br_ssl_engine_set_default_aes_cbc(&cc.eng);
                }
+               if ((req & REQ_AESCCM) != 0) {
+                       br_ssl_engine_set_default_aes_ccm(&cc.eng);
+               }
                if ((req & REQ_AESGCM) != 0) {
                        br_ssl_engine_set_default_aes_gcm(&cc.eng);
                }
@@ -1215,6 +1218,13 @@ server_exit:
                closesocket(fd);
 #else
                close(fd);
+#endif
+       }
+       if (server_fd != INVALID_SOCKET) {
+#ifdef _WIN32
+               closesocket(server_fd);
+#else
+               close(server_fd);
 #endif
        }
        return retcode;