| @@ -670,15 +670,15 @@ inline void JackClient::Error() | |||||
| int JackClient::PortRegister(const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size) | int JackClient::PortRegister(const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size) | ||||
| { | { | ||||
| // Check if port name is empty | // Check if port name is empty | ||||
| string port_name_str = string(port_name); | |||||
| if (port_name_str.size() == 0) { | |||||
| string port_short_name_str = string(port_name); | |||||
| if (port_short_name_str.size() == 0) { | |||||
| jack_error("port_name is empty"); | jack_error("port_name is empty"); | ||||
| return 0; // Means failure here... | return 0; // Means failure here... | ||||
| } | } | ||||
| // Check port name length | // Check port name length | ||||
| string name = string(GetClientControl()->fName) + string(":") + port_name_str; | |||||
| if (name.size() >= REAL_JACK_PORT_NAME_SIZE) { | |||||
| string port_full_name_str = string(GetClientControl()->fName) + string(":") + port_short_name_str; | |||||
| if (port_full_name_str.size() >= REAL_JACK_PORT_NAME_SIZE) { | |||||
| jack_error("\"%s:%s\" is too long to be used as a JACK port name.\n" | jack_error("\"%s:%s\" is too long to be used as a JACK port name.\n" | ||||
| "Please use %lu characters or less", | "Please use %lu characters or less", | ||||
| GetClientControl()->fName, | GetClientControl()->fName, | ||||
| @@ -689,10 +689,10 @@ int JackClient::PortRegister(const char* port_name, const char* port_type, unsig | |||||
| int result = -1; | int result = -1; | ||||
| jack_port_id_t port_index = NO_PORT; | jack_port_id_t port_index = NO_PORT; | ||||
| fChannel->PortRegister(GetClientControl()->fRefNum, name.c_str(), port_type, flags, buffer_size, &port_index, &result); | |||||
| fChannel->PortRegister(GetClientControl()->fRefNum, port_full_name_str.c_str(), port_type, flags, buffer_size, &port_index, &result); | |||||
| if (result == 0) { | if (result == 0) { | ||||
| jack_log("JackClient::PortRegister ref = %ld name = %s type = %s port_index = %ld", GetClientControl()->fRefNum, name.c_str(), port_type, port_index); | |||||
| jack_log("JackClient::PortRegister ref = %ld name = %s type = %s port_index = %ld", GetClientControl()->fRefNum, port_full_name_str.c_str(), port_type, port_index); | |||||
| fPortList.push_back(port_index); | fPortList.push_back(port_index); | ||||
| return port_index; | return port_index; | ||||
| } else { | } else { | ||||
| @@ -719,6 +719,14 @@ int JackClient::PortUnRegister(jack_port_id_t port_index) | |||||
| int JackClient::PortConnect(const char* src, const char* dst) | int JackClient::PortConnect(const char* src, const char* dst) | ||||
| { | { | ||||
| jack_log("JackClient::Connect src = %s dst = %s", src, dst); | jack_log("JackClient::Connect src = %s dst = %s", src, dst); | ||||
| if (strlen(src) >= REAL_JACK_PORT_NAME_SIZE) { | |||||
| jack_error("\"%s\" is too long to be used as a JACK port name.\n", src); | |||||
| return -1; | |||||
| } | |||||
| if (strlen(dst) >= REAL_JACK_PORT_NAME_SIZE) { | |||||
| jack_error("\"%s\" is too long to be used as a JACK port name.\n", src); | |||||
| return -1; | |||||
| } | |||||
| int result = -1; | int result = -1; | ||||
| fChannel->PortConnect(GetClientControl()->fRefNum, src, dst, &result); | fChannel->PortConnect(GetClientControl()->fRefNum, src, dst, &result); | ||||
| return result; | return result; | ||||
| @@ -727,6 +735,14 @@ int JackClient::PortConnect(const char* src, const char* dst) | |||||
| int JackClient::PortDisconnect(const char* src, const char* dst) | int JackClient::PortDisconnect(const char* src, const char* dst) | ||||
| { | { | ||||
| jack_log("JackClient::Disconnect src = %s dst = %s", src, dst); | jack_log("JackClient::Disconnect src = %s dst = %s", src, dst); | ||||
| if (strlen(src) >= REAL_JACK_PORT_NAME_SIZE) { | |||||
| jack_error("\"%s\" is too long to be used as a JACK port name.\n", src); | |||||
| return -1; | |||||
| } | |||||
| if (strlen(dst) >= REAL_JACK_PORT_NAME_SIZE) { | |||||
| jack_error("\"%s\" is too long to be used as a JACK port name.\n", src); | |||||
| return -1; | |||||
| } | |||||
| int result = -1; | int result = -1; | ||||
| fChannel->PortDisconnect(GetClientControl()->fRefNum, src, dst, &result); | fChannel->PortDisconnect(GetClientControl()->fRefNum, src, dst, &result); | ||||
| return result; | return result; | ||||
| @@ -39,7 +39,7 @@ | |||||
| #define SYNC_MAX_NAME_SIZE 256 | #define SYNC_MAX_NAME_SIZE 256 | ||||
| #define REAL_JACK_PORT_NAME_SIZE JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE | |||||
| #define REAL_JACK_PORT_NAME_SIZE JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE // full name like "client_name:short_port_name" | |||||
| #ifndef PORT_NUM | #ifndef PORT_NUM | ||||
| #define PORT_NUM 2048 | #define PORT_NUM 2048 | ||||
| @@ -68,6 +68,14 @@ int JackInternalClient::Open(const char* server_name, const char* name, int uuid | |||||
| int result; | int result; | ||||
| char name_res[JACK_CLIENT_NAME_SIZE + 1]; | char name_res[JACK_CLIENT_NAME_SIZE + 1]; | ||||
| jack_log("JackInternalClient::Open name = %s", name); | jack_log("JackInternalClient::Open name = %s", name); | ||||
| if (strlen(name) >= JACK_CLIENT_NAME_SIZE) { | |||||
| jack_error("\"%s\" is too long to be used as a JACK client name.\n" | |||||
| "Please use %lu characters or less", | |||||
| name, | |||||
| JACK_CLIENT_NAME_SIZE - 1); | |||||
| return -1; | |||||
| } | |||||
| strncpy(fServerName, server_name, sizeof(fServerName)); | strncpy(fServerName, server_name, sizeof(fServerName)); | ||||
| @@ -86,7 +86,15 @@ int JackLibClient::Open(const char* server_name, const char* name, int uuid, jac | |||||
| int shared_engine, shared_client, shared_graph, result; | int shared_engine, shared_client, shared_graph, result; | ||||
| bool res; | bool res; | ||||
| jack_log("JackLibClient::Open name = %s", name); | jack_log("JackLibClient::Open name = %s", name); | ||||
| if (strlen(name) >= JACK_CLIENT_NAME_SIZE) { | |||||
| jack_error("\"%s\" is too long to be used as a JACK client name.\n" | |||||
| "Please use %lu characters or less", | |||||
| name, | |||||
| JACK_CLIENT_NAME_SIZE - 1); | |||||
| return -1; | |||||
| } | |||||
| strncpy(fServerName, server_name, sizeof(fServerName)); | strncpy(fServerName, server_name, sizeof(fServerName)); | ||||
| // Open server/client channel | // Open server/client channel | ||||
| @@ -408,7 +408,7 @@ struct JackPortRegisterRequest : public JackRequest | |||||
| { | { | ||||
| int fRefNum; | int fRefNum; | ||||
| char fName[JACK_PORT_NAME_SIZE + 1]; | |||||
| char fName[JACK_PORT_NAME_SIZE + 1]; // port short name | |||||
| char fPortType[JACK_PORT_TYPE_SIZE + 1]; | char fPortType[JACK_PORT_TYPE_SIZE + 1]; | ||||
| unsigned int fFlags; | unsigned int fFlags; | ||||
| unsigned int fBufferSize; | unsigned int fBufferSize; | ||||
| @@ -517,8 +517,8 @@ struct JackPortConnectNameRequest : public JackRequest | |||||
| { | { | ||||
| int fRefNum; | int fRefNum; | ||||
| char fSrc[JACK_PORT_NAME_SIZE + 1]; | |||||
| char fDst[JACK_PORT_NAME_SIZE + 1]; | |||||
| char fSrc[REAL_JACK_PORT_NAME_SIZE + 1]; // port full name | |||||
| char fDst[REAL_JACK_PORT_NAME_SIZE + 1]; // port full name | |||||
| JackPortConnectNameRequest() | JackPortConnectNameRequest() | ||||
| {} | {} | ||||
| @@ -559,8 +559,8 @@ struct JackPortDisconnectNameRequest : public JackRequest | |||||
| { | { | ||||
| int fRefNum; | int fRefNum; | ||||
| char fSrc[JACK_PORT_NAME_SIZE + 1]; | |||||
| char fDst[JACK_PORT_NAME_SIZE + 1]; | |||||
| char fSrc[REAL_JACK_PORT_NAME_SIZE + 1]; // port full name | |||||
| char fDst[REAL_JACK_PORT_NAME_SIZE + 1]; // port full name | |||||
| JackPortDisconnectNameRequest() | JackPortDisconnectNameRequest() | ||||
| {} | {} | ||||
| @@ -678,7 +678,7 @@ struct JackPortRenameRequest : public JackRequest | |||||
| int fRefNum; | int fRefNum; | ||||
| jack_port_id_t fPort; | jack_port_id_t fPort; | ||||
| char fName[JACK_PORT_NAME_SIZE + 1]; | |||||
| char fName[JACK_PORT_NAME_SIZE + 1]; // port short name | |||||
| JackPortRenameRequest() | JackPortRenameRequest() | ||||
| {} | {} | ||||
| @@ -1194,7 +1194,7 @@ struct JackClientNotificationRequest : public JackRequest | |||||
| struct JackSessionCommand | struct JackSessionCommand | ||||
| { | { | ||||
| char fUUID[JACK_UUID_SIZE]; | char fUUID[JACK_UUID_SIZE]; | ||||
| char fClientName[JACK_CLIENT_NAME_SIZE+1]; | |||||
| char fClientName[JACK_CLIENT_NAME_SIZE + 1]; | |||||
| char fCommand[JACK_SESSION_COMMAND_SIZE]; | char fCommand[JACK_SESSION_COMMAND_SIZE]; | ||||
| jack_session_flags_t fFlags; | jack_session_flags_t fFlags; | ||||
| @@ -750,10 +750,12 @@ int main (int argc, char *argv[]) | |||||
| * | * | ||||
| */ | */ | ||||
| char client_name3[jack_client_name_size()]; | char client_name3[jack_client_name_size()]; | ||||
| // "jack_client_name_size" - 1 effective characters | |||||
| for (int i = 0; i < jack_client_name_size() - 1; i++) { | for (int i = 0; i < jack_client_name_size() - 1; i++) { | ||||
| client_name3[i] = 'A'; | client_name3[i] = 'A'; | ||||
| } | } | ||||
| client_name3[jack_client_name_size()] = 0; | |||||
| // And last one is the terminating '0' | |||||
| client_name3[jack_client_name_size()] = 0; | |||||
| Log("trying to register a new jackd client with maximum possible client name size...\n", client_name3); | Log("trying to register a new jackd client with maximum possible client name size...\n", client_name3); | ||||
| client2 = jack_client_open(client_name3, jack_options, &status, server_name); | client2 = jack_client_open(client_name3, jack_options, &status, server_name); | ||||
| if (client2 != NULL) { | if (client2 != NULL) { | ||||
| @@ -934,15 +936,17 @@ int main (int argc, char *argv[]) | |||||
| } | } | ||||
| /** | /** | ||||
| * Verify if a port can be registered with maximum port name size | |||||
| * Verify if a port can be registered with maximum port name size (that is "short name") | |||||
| * | * | ||||
| */ | */ | ||||
| int port_size_max = jack_port_name_size() - strlen(client_name1) - 2; // Port is of shape: "client_name:port_name" | |||||
| char port_name3[port_size_max]; | |||||
| for (int i = 0; i < port_size_max - 1; i++) { | |||||
| int short_port_size_max = jack_port_name_size() - jack_client_name_size() - 1; // Port is of shape: "client_name:port_name" | |||||
| char port_name3[short_port_size_max]; | |||||
| // "short_port_size_max" - 1 effective characters | |||||
| for (int i = 0; i < short_port_size_max - 1; i++) { | |||||
| port_name3[i] = 'A'; | port_name3[i] = 'A'; | ||||
| } | } | ||||
| port_name3[port_size_max] = 0; | |||||
| // And last one is the terminating '0' | |||||
| port_name3[short_port_size_max] = 0; | |||||
| jack_port_t * test_max_port = jack_port_register(client1, port_name3, | jack_port_t * test_max_port = jack_port_register(client1, port_name3, | ||||
| JACK_DEFAULT_AUDIO_TYPE, | JACK_DEFAULT_AUDIO_TYPE, | ||||
| JackPortIsOutput, 0); | JackPortIsOutput, 0); | ||||