[ltt-dev] [UST PATCH 1/6] Make app socket directories per-user v2

Nils Carlson nils.carlson at ludd.ltu.se
Thu Mar 31 16:37:27 EDT 2011


On Mar 31, 2011, at 9:27 PM, Mathieu Desnoyers wrote:

> * Nils Carlson (nils.carlson at ericsson.com) wrote:
>> Changes since v1:
>> 	* Document memory allocation
>>
>> Make a separate app socket directories for each user, providing
>> some basic security and also the possibility of consistent cleanup.
>>
>> Signed-off-by: Nils Carlson <nils.carlson at ericsson.com>
>> ---
>> libust/tracectl.c    |   34 +++++++++++++++++++---------------
>> libustcomm/ustcomm.c |   34 +++++++++++++++++++++++++++++-----
>> libustcomm/ustcomm.h |    4 ++++
>> 3 files changed, 52 insertions(+), 20 deletions(-)
>>
>> diff --git a/libust/tracectl.c b/libust/tracectl.c
>> index 33c7280..ae92b7e 100644
>> --- a/libust/tracectl.c
>> +++ b/libust/tracectl.c
>> @@ -1221,37 +1221,41 @@ static void auto_probe_connect(struct  
>> marker *m)
>>
>> static struct ustcomm_sock * init_app_socket(int epoll_fd)
>
> Hi Nils,
>
> I think we really need to get a straight naming scheme for init vs  
> alloc
> functions.
>
> init = initialization of a structure (never allocates)
> alloc = allocation of a structure (maybe can also initialize it, but  
> not
> necessarily. This would be specified by the function header
> documentation)
>
> Otherwise reviewing correct allocation and free of a patch like this  
> one
> is made much more difficult than it should, and the problem will only
> grow as we add more code.
>

Sure, but this patch doesn't change the name of the function or its  
calling. I expect that would be a separate patch fixing consistency  
issues.

As far as strings are concerned though adding alloc and init is just  
confusing I think.

/Nils

> Thank you,
>
> Mathieu
>
>> {
>> -	char *name;
>> +	char *dir_name, *sock_name;
>> 	int result;
>> -	struct ustcomm_sock *sock;
>> +	struct ustcomm_sock *sock = NULL;
>>
>> -	result = asprintf(&name, "%s/%d", SOCK_DIR, (int)getpid());
>> +	dir_name = ustcomm_user_sock_dir();
>> +	if (!dir_name)
>> +		return NULL;
>> +
>> +	result = asprintf(&sock_name, "%s/%d", dir_name, (int)getpid());
>> 	if (result < 0) {
>> 		ERR("string overflow allocating socket name, "
>> 		    "UST thread bailing");
>> -		return NULL;
>> +		goto free_dir_name;
>> 	}
>>
>> -	result = ensure_dir_exists(SOCK_DIR);
>> +	result = ensure_dir_exists(dir_name);
>> 	if (result == -1) {
>> 		ERR("Unable to create socket directory %s, UST thread bailing",
>> -		    SOCK_DIR);
>> -		goto free_name;
>> +		    dir_name);
>> +		goto free_sock_name;
>> 	}
>>
>> -	sock = ustcomm_init_named_socket(name, epoll_fd);
>> +	sock = ustcomm_init_named_socket(sock_name, epoll_fd);
>> 	if (!sock) {
>> 		ERR("Error initializing named socket (%s). Check that directory"
>> -		    "exists and that it is writable. UST thread bailing", name);
>> -		goto free_name;
>> +		    "exists and that it is writable. UST thread bailing",  
>> sock_name);
>> +		goto free_sock_name;
>> 	}
>>
>> -	free(name);
>> -	return sock;
>> +free_sock_name:
>> +	free(sock_name);
>> +free_dir_name:
>> +	free(dir_name);
>>
>> -free_name:
>> -	free(name);
>> -	return NULL;
>> +	return sock;
>> }
>>
>> static void __attribute__((constructor)) init()
>> diff --git a/libustcomm/ustcomm.c b/libustcomm/ustcomm.c
>> index 43f4289..dce1e52 100644
>> --- a/libustcomm/ustcomm.c
>> +++ b/libustcomm/ustcomm.c
>> @@ -533,6 +533,21 @@ close_sock:
>> 	return -1;
>> }
>>
>> +/* Returns the current users socket directory, must be freed */
>> +char *ustcomm_user_sock_dir(void)
>> +{
>> +	int result;
>> +	char *sock_dir = NULL;
>> +
>> +	result = asprintf(&sock_dir, "%s%s", USER_SOCK_DIR,
>> +			  cuserid(NULL));
>> +	if (result < 0) {
>> +		ERR("string overflow allocating directory name");
>> +		return NULL;
>> +	}
>> +
>> +	return sock_dir;
>> +}
>>
>> /* Open a connection to a traceable app.
>>  *
>> @@ -545,21 +560,30 @@ int ustcomm_connect_app(pid_t pid, int *app_fd)
>> {
>> 	int result;
>> 	int retval = 0;
>> -	char *name;
>> +	char *dir_name, *sock_name;
>> +
>> +	dir_name = ustcomm_user_sock_dir();
>> +	if (!dir_name)
>> +		return -ENOMEM;
>>
>> -	result = asprintf(&name, "%s/%d", SOCK_DIR, pid);
>> +	result = asprintf(&sock_name, "%s/%d", dir_name, pid);
>> 	if (result < 0) {
>> 		ERR("failed to allocate socket name");
>> -		return -1;
>> +		retval = -1;
>> +		goto free_dir_name;
>> 	}
>>
>> -	result = ustcomm_connect_path(name, app_fd);
>> +	result = ustcomm_connect_path(sock_name, app_fd);
>> 	if (result < 0) {
>> 		ERR("failed to connect to app");
>> 		retval = -1;
>> +		goto free_sock_name;
>> 	}
>>
>> -	free(name);
>> +free_sock_name:
>> +	free(sock_name);
>> +free_dir_name:
>> +	free(dir_name);
>>
>> 	return retval;
>> }
>> diff --git a/libustcomm/ustcomm.h b/libustcomm/ustcomm.h
>> index 0ec04fc..db38119 100644
>> --- a/libustcomm/ustcomm.h
>> +++ b/libustcomm/ustcomm.h
>> @@ -25,6 +25,7 @@
>> #include <ust/kcompat/kcompat.h>
>>
>> #define SOCK_DIR "/tmp/ust-app-socks"
>> +#define USER_SOCK_DIR "/tmp/ust-socks-"
>>
>> struct ustcomm_sock {
>> 	struct cds_list_head list;
>> @@ -156,6 +157,9 @@ extern int ustcomm_req(int sock,
>> 		       char *res_data);
>>
>> extern int ustcomm_request_consumer(pid_t pid, const char *channel);
>> +
>> +/* Returns the current users socket directory, must be freed */
>> +extern char *ustcomm_user_sock_dir(void);
>> extern int ustcomm_connect_app(pid_t pid, int *app_fd);
>> extern int ustcomm_connect_path(const char *path, int  
>> *connection_fd);
>>
>> -- 
>> 1.7.1
>>
>>
>> _______________________________________________
>> ltt-dev mailing list
>> ltt-dev at lists.casi.polymtl.ca
>> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
>>
>
> -- 
> Mathieu Desnoyers
> Operating System Efficiency R&D Consultant
> EfficiOS Inc.
> http://www.efficios.com
>
> _______________________________________________
> ltt-dev mailing list
> ltt-dev at lists.casi.polymtl.ca
> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev





More information about the lttng-dev mailing list