sends a client authentication packet (second packet in the 3-way handshake) Packet format (when the server is 4.0 or earlier): Bytes Content ----- ---- 2 client capabilities 3 max packet size n user name, \0-terminated 9 scramble_323, \0-terminated Packet format (when the server is 4.1 or newer): Bytes
| 2572 | @retval 1 error |
| 2573 | */ |
| 2574 | static int send_client_reply_packet(MCPVIO_EXT *mpvio, |
| 2575 | const uchar *data, int data_len) |
| 2576 | { |
| 2577 | MYSQL *mysql= mpvio->mysql; |
| 2578 | NET *net= &mysql->net; |
| 2579 | char *buff, *end; |
| 2580 | size_t buff_size; |
| 2581 | size_t connect_attrs_len= |
| 2582 | (mysql->server_capabilities & CLIENT_CONNECT_ATTRS && |
| 2583 | mysql->options.extension) ? |
| 2584 | mysql->options.extension->connection_attributes_length : 0; |
| 2585 | |
| 2586 | DBUG_ASSERT(connect_attrs_len < MAX_CONNECTION_ATTR_STORAGE_LENGTH); |
| 2587 | |
| 2588 | |
| 2589 | /* |
| 2590 | see end= buff+32 below, fixed size of the packet is 32 bytes. |
| 2591 | +9 because data is a length encoded binary where meta data size is max 9. |
| 2592 | */ |
| 2593 | buff_size= 33 + USERNAME_LENGTH + data_len + 9 + NAME_LEN + NAME_LEN + connect_attrs_len + 9; |
| 2594 | buff= my_alloca(buff_size); |
| 2595 | |
| 2596 | mysql->client_flag|= mysql->options.client_flag; |
| 2597 | mysql->client_flag|= CLIENT_CAPABILITIES; |
| 2598 | |
| 2599 | if (mysql->client_flag & CLIENT_MULTI_STATEMENTS) |
| 2600 | mysql->client_flag|= CLIENT_MULTI_RESULTS; |
| 2601 | |
| 2602 | #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) |
| 2603 | if (mysql->options.ssl_key || mysql->options.ssl_cert || |
| 2604 | mysql->options.ssl_ca || mysql->options.ssl_capath || |
| 2605 | mysql->options.ssl_cipher || |
| 2606 | (mysql->options.extension && mysql->options.extension->ssl_crl) || |
| 2607 | (mysql->options.extension && mysql->options.extension->ssl_crlpath)) |
| 2608 | mysql->options.use_ssl= 1; |
| 2609 | if (mysql->options.use_ssl) |
| 2610 | mysql->client_flag|= CLIENT_SSL; |
| 2611 | #endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY*/ |
| 2612 | if (mpvio->db) |
| 2613 | mysql->client_flag|= CLIENT_CONNECT_WITH_DB; |
| 2614 | else |
| 2615 | mysql->client_flag&= ~CLIENT_CONNECT_WITH_DB; |
| 2616 | |
| 2617 | /* Remove options that server doesn't support */ |
| 2618 | mysql->client_flag= mysql->client_flag & |
| 2619 | (~(CLIENT_COMPRESS | CLIENT_SSL | CLIENT_PROTOCOL_41) |
| 2620 | | mysql->server_capabilities); |
| 2621 | |
| 2622 | #ifndef HAVE_COMPRESS |
| 2623 | mysql->client_flag&= ~CLIENT_COMPRESS; |
| 2624 | #endif |
| 2625 | |
| 2626 | if (mysql->client_flag & CLIENT_PROTOCOL_41) |
| 2627 | { |
| 2628 | /* 4.1 server and 4.1 client has a 32 byte option flag */ |
| 2629 | int4store(buff,mysql->client_flag); |
| 2630 | int4store(buff+4, net->max_packet_size); |
| 2631 | buff[8]= (char) mysql->charset->number; |
no test coverage detected