diff options
author | paulhsia <paulhsia@chromium.org> | 2019-10-03 15:02:28 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-05 03:27:48 +0000 |
commit | 0eb070bd571f7230e3417a6119eeec7155b40f2a (patch) | |
tree | a092b138538b9909013e0e909a097b8ded95b92c | |
parent | 722c5f91943477cf0445e833601b5923228bb4d0 (diff) | |
download | adhd-0eb070bd571f7230e3417a6119eeec7155b40f2a.tar.gz |
CRAS: cras_rclient: Add cras_rclient_create
Add cras_rclient_create back with an extra argument related to client
connection type. The function will choose the right create function for
users by the given connection type.
Simplify handle_new_connection by adding connection type attribute to
server_socket.
Let fuzzer use cras_rclient_create.
BUG=chromium:937765
TEST=Build and run
$ cras_test_client --connection_type 1 -P /dev/urandom
$ cras_test_client --connection_type 1 -C /dev/urandom (This should
fail.)
Change-Id: I64d07bd87d01e34c95549c84acad11ad5cca0fd4
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/adhd/+/1836843
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Tested-by: Chih-Yang Hsia <paulhsia@chromium.org>
Commit-Queue: Chih-Yang Hsia <paulhsia@chromium.org>
-rw-r--r-- | cras/src/fuzz/rclient_message.cc | 3 | ||||
-rw-r--r-- | cras/src/server/cras_rclient.c | 22 | ||||
-rw-r--r-- | cras/src/server/cras_rclient.h | 6 | ||||
-rw-r--r-- | cras/src/server/cras_server.c | 26 |
4 files changed, 35 insertions, 22 deletions
diff --git a/cras/src/fuzz/rclient_message.cc b/cras/src/fuzz/rclient_message.cc index a4fe48af..a2a5650a 100644 --- a/cras/src/fuzz/rclient_message.cc +++ b/cras/src/fuzz/rclient_message.cc @@ -8,7 +8,6 @@ #include <stdint.h> extern "C" { -#include "cras_control_rclient.h" #include "cras_iodev_list.h" #include "cras_mix.h" #include "cras_observer.h" @@ -18,7 +17,7 @@ extern "C" { } extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { - cras_rclient* client = cras_control_rclient_create(0, 0); + cras_rclient* client = cras_rclient_create(0, 0, CRAS_CONTROL); cras_rclient_buffer_from_client(client, data, size, NULL, 0); cras_rclient_destroy(client); diff --git a/cras/src/server/cras_rclient.c b/cras/src/server/cras_rclient.c index 998f2f8e..0ee507e1 100644 --- a/cras/src/server/cras_rclient.c +++ b/cras/src/server/cras_rclient.c @@ -11,11 +11,13 @@ #include "cras_apm_list.h" #include "cras_bt_log.h" #include "cras_config.h" +#include "cras_control_rclient.h" #include "cras_dsp.h" #include "cras_iodev.h" #include "cras_iodev_list.h" #include "cras_messages.h" #include "cras_observer.h" +#include "cras_playback_rclient.h" #include "cras_rclient.h" #include "cras_rstream.h" #include "cras_server_metrics.h" @@ -54,3 +56,23 @@ int cras_rclient_send_message(const struct cras_rclient *client, { return client->ops->send_message_to_client(client, msg, fds, num_fds); } + +struct cras_rclient *cras_rclient_create(int fd, size_t id, + enum CRAS_CONNECTION_TYPE conn_type) +{ + if (!cras_validate_connection_type(conn_type)) + goto error; + + switch (conn_type) { + case CRAS_CONTROL: + return cras_control_rclient_create(fd, id); + case CRAS_PLAYBACK: + return cras_playback_rclient_create(fd, id); + default: + goto error; + } + +error: + syslog(LOG_ERR, "unsupported connection type"); + return NULL; +} diff --git a/cras/src/server/cras_rclient.h b/cras/src/server/cras_rclient.h index c1545a87..6cffb7d8 100644 --- a/cras/src/server/cras_rclient.h +++ b/cras/src/server/cras_rclient.h @@ -9,6 +9,8 @@ #ifndef CRAS_RCLIENT_H_ #define CRAS_RCLIENT_H_ +#include "cras_types.h" + struct cras_client_message; struct cras_message; struct cras_server_message; @@ -48,10 +50,12 @@ struct cras_rclient_ops { * Args: * fd - The file descriptor used for communication with the client. * id - Unique identifier for this client. + * conn_type - Client connection type. * Returns: * A pointer to the newly created rclient on success, NULL on failure. */ -struct cras_rclient *cras_rclient_create(int fd, size_t id); +struct cras_rclient *cras_rclient_create(int fd, size_t id, + enum CRAS_CONNECTION_TYPE conn_type); /* Destroys an rclient created with "cras_rclient_create". * Args: diff --git a/cras/src/server/cras_server.c b/cras/src/server/cras_server.c index 6796475f..97c83dfd 100644 --- a/cras/src/server/cras_server.c +++ b/cras/src/server/cras_server.c @@ -45,8 +45,6 @@ #include "cras_non_empty_audio_handler.h" #include "cras_observer.h" #include "cras_rclient.h" -#include "cras_control_rclient.h" -#include "cras_playback_rclient.h" #include "cras_server.h" #include "cras_server_metrics.h" #include "cras_system_state.h" @@ -105,6 +103,7 @@ struct system_task { struct server_socket { struct sockaddr_un addr; int fd; + enum CRAS_CONNECTION_TYPE type; }; /* Local server data. */ @@ -215,8 +214,7 @@ static void send_client_list_to_clients(struct server_data *serv) /* Handles requests from a client to attach to the server. Create a local * structure to track the client, assign it a unique id and let it attach */ -static void handle_new_connection(struct server_socket *server_socket, - enum CRAS_CONNECTION_TYPE type) +static void handle_new_connection(struct server_socket *server_socket) { int connection_fd; struct attached_client *poll_client; @@ -256,19 +254,9 @@ static void handle_new_connection(struct server_socket *server_socket, poll_client->next = NULL; poll_client->pollfd = NULL; fill_client_info(poll_client); - switch (type) { - case CRAS_CONTROL: - poll_client->client = cras_control_rclient_create( - connection_fd, poll_client->id); - break; - case CRAS_PLAYBACK: - poll_client->client = cras_playback_rclient_create( - connection_fd, poll_client->id); - break; - default: - syslog(LOG_ERR, "unsupported connection type"); - goto error; - } + + poll_client->client = cras_rclient_create( + connection_fd, poll_client->id, server_socket->type); if (poll_client->client == NULL) { syslog(LOG_ERR, "failed to create client"); goto error; @@ -536,6 +524,7 @@ static int create_and_listen_server_socket(enum CRAS_CONNECTION_TYPE conn_type, } server_socket->fd = socket_fd; + server_socket->type = conn_type; return 0; error: if (socket_fd >= 0) { @@ -688,8 +677,7 @@ int cras_server_run(unsigned int profile_disable_mask) if (pollfds[conn_type].revents & POLLIN) handle_new_connection( &server_instance - .server_sockets[conn_type], - conn_type); + .server_sockets[conn_type]); } /* Check if there are messages pending for any clients. */ |