[lttng-dev] UST check pointer/de-reference order

Oestman, Fredrik Fredrik_Oestman at mentor.com
Tue Jun 5 04:19:29 EDT 2012


I stumbled across some code where pointers are de-referenced and then checked for NULL.

Cheers,

Fredrik Östman


diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c
index 9789413..80aed04 100644
--- a/liblttng-ust-ctl/ustctl.c
+++ b/liblttng-ust-ctl/ustctl.c
@@ -732,7 +732,7 @@ void ustctl_unmap_channel(struct lttng_ust_shm_handle *handle)
 struct lttng_ust_lib_ring_buffer *ustctl_open_stream_read(struct lttng_ust_shm_handle *handle,
 	int cpu)
 {
-	struct channel *chan = handle->shadow_chan;
+	struct channel *chan;
 	int *shm_fd, *wait_fd;
 	uint64_t *memory_map_size;
 	struct lttng_ust_lib_ring_buffer *buf;
@@ -741,6 +741,7 @@ struct lttng_ust_lib_ring_buffer *ustctl_open_stream_read(struct lttng_ust_shm_h
 	if (!handle)
 		return NULL;
 
+	chan = handle->shadow_chan;
 	buf = channel_get_ring_buffer(&chan->backend.config,
 		chan, cpu, handle, &shm_fd, &wait_fd, &memory_map_size);
 	if (!buf)
@@ -784,11 +785,12 @@ int ustctl_get_mmap_len(struct lttng_ust_shm_handle *handle,
 		unsigned long *len)
 {
 	unsigned long mmap_buf_len;
-	struct channel *chan = handle->shadow_chan;
+	struct channel *chan;
 
 	if (!handle || !buf || !len)
 		return -EINVAL;
 
+	chan = handle->shadow_chan;
 	if (chan->backend.config.output != RING_BUFFER_MMAP)
 		return -EINVAL;
 	mmap_buf_len = chan->backend.buf_size;
@@ -805,11 +807,12 @@ int ustctl_get_max_subbuf_size(struct lttng_ust_shm_handle *handle,
 		struct lttng_ust_lib_ring_buffer *buf,
 		unsigned long *len)
 {
-	struct channel *chan = handle->shadow_chan;
+	struct channel *chan;
 
 	if (!handle || !buf || !len)
 		return -EINVAL;
 
+	chan = handle->shadow_chan;
 	*len = chan->backend.subbuf_size;
 	return 0;
 }
@@ -823,12 +826,13 @@ int ustctl_get_max_subbuf_size(struct lttng_ust_shm_handle *handle,
 int ustctl_get_mmap_read_offset(struct lttng_ust_shm_handle *handle,
 		struct lttng_ust_lib_ring_buffer *buf, unsigned long *off)
 {
-	struct channel *chan = handle->shadow_chan;
+	struct channel *chan;
 	unsigned long sb_bindex;
 
 	if (!handle || !buf || !off)
 		return -EINVAL;
 
+	chan = handle->shadow_chan;
 	if (chan->backend.config.output != RING_BUFFER_MMAP)
 		return -EINVAL;
 	sb_bindex = subbuffer_id_get_index(&chan->backend.config,
@@ -841,11 +845,12 @@ int ustctl_get_mmap_read_offset(struct lttng_ust_shm_handle *handle,
 int ustctl_get_subbuf_size(struct lttng_ust_shm_handle *handle,
 		struct lttng_ust_lib_ring_buffer *buf, unsigned long *len)
 {
-	struct channel *chan = handle->shadow_chan;
+	struct channel *chan;
 
 	if (!handle || !buf || !len)
 		return -EINVAL;
 
+	chan = handle->shadow_chan;
 	*len = lib_ring_buffer_get_read_data_size(&chan->backend.config, buf,
 		handle);
 	return 0;
@@ -855,11 +860,12 @@ int ustctl_get_subbuf_size(struct lttng_ust_shm_handle *handle,
 int ustctl_get_padded_subbuf_size(struct lttng_ust_shm_handle *handle,
 		struct lttng_ust_lib_ring_buffer *buf, unsigned long *len)
 {
-	struct channel *chan = handle->shadow_chan;
+	struct channel *chan;
 
 	if (!handle || !buf || !len)
 		return -EINVAL;
 
+	chan = handle->shadow_chan;
 	*len = lib_ring_buffer_get_read_data_size(&chan->backend.config, buf,
 		handle);
 	*len = PAGE_ALIGN(*len);



More information about the lttng-dev mailing list