when relay_open_buf fails in relay_open, program will goto free_bufs,
but chan is nowhere freed.

In addition, give warning to users who forget to provide create file
hook.    

Signed-off-by: Zhouyi Zhou <zhouzho...@gmail.com>
---
 kernel/relay.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/kernel/relay.c b/kernel/relay.c
index 074994b..e0990c7 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -589,6 +589,13 @@ struct rchan *relay_open(const char *base_filename,
        chan->parent = parent;
        chan->private_data = private_data;
        if (base_filename) {
+               if (!cb || !cb->create_buf_file) {
+                       printk(KERN_ERR
+                              "relay_open: has base filename without "
+                              "providing hook to create file\n");
+                       kfree(chan);
+                       return NULL;
+               }
                chan->has_base_filename = 1;
                strlcpy(chan->base_filename, base_filename, NAME_MAX);
        }
@@ -614,6 +621,7 @@ free_bufs:
 
        kref_put(&chan->kref, relay_destroy_channel);
        mutex_unlock(&relay_channels_mutex);
+       kfree(chan);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(relay_open);
-- 
1.9.1


Reply via email to