aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Andersson <bjorn.andersson@linaro.org>2016-10-18 20:23:44 -0400
committerBjorn Andersson <bjorn.andersson@linaro.org>2016-10-31 18:44:57 -0400
commit93e9324431c9628224886f979dcd59d377b0818a (patch)
tree20d499731182c99deb2be6dfbfdac66b5e201429
parentbbd188092e3bd7536583b37e7d7d2e38a65de74d (diff)
rpmsg: Handle invalid parameters in public API
There are two cases of possible uninitialized pointer usage in the API, either the parameters themselves are invalid or we're trying to jump to functions not required to be implemented by all backends. Suggested-by: Loic Pallardy <loic.pallardy@st.com> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-rw-r--r--drivers/rpmsg/rpmsg_core.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c
index 7561941ba413..a79cb5a9e5f2 100644
--- a/drivers/rpmsg/rpmsg_core.c
+++ b/drivers/rpmsg/rpmsg_core.c
@@ -71,6 +71,9 @@ struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *rpdev,
71 rpmsg_rx_cb_t cb, void *priv, 71 rpmsg_rx_cb_t cb, void *priv,
72 struct rpmsg_channel_info chinfo) 72 struct rpmsg_channel_info chinfo)
73{ 73{
74 if (WARN_ON(!rpdev))
75 return ERR_PTR(-EINVAL);
76
74 return rpdev->ops->create_ept(rpdev, cb, priv, chinfo); 77 return rpdev->ops->create_ept(rpdev, cb, priv, chinfo);
75} 78}
76EXPORT_SYMBOL(rpmsg_create_ept); 79EXPORT_SYMBOL(rpmsg_create_ept);
@@ -80,11 +83,13 @@ EXPORT_SYMBOL(rpmsg_create_ept);
80 * @ept: endpoing to destroy 83 * @ept: endpoing to destroy
81 * 84 *
82 * Should be used by drivers to destroy an rpmsg endpoint previously 85 * Should be used by drivers to destroy an rpmsg endpoint previously
83 * created with rpmsg_create_ept(). 86 * created with rpmsg_create_ept(). As with other types of "free" NULL
87 * is a valid parameter.
84 */ 88 */
85void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) 89void rpmsg_destroy_ept(struct rpmsg_endpoint *ept)
86{ 90{
87 ept->ops->destroy_ept(ept); 91 if (ept)
92 ept->ops->destroy_ept(ept);
88} 93}
89EXPORT_SYMBOL(rpmsg_destroy_ept); 94EXPORT_SYMBOL(rpmsg_destroy_ept);
90 95
@@ -108,6 +113,11 @@ EXPORT_SYMBOL(rpmsg_destroy_ept);
108 */ 113 */
109int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len) 114int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len)
110{ 115{
116 if (WARN_ON(!ept))
117 return -EINVAL;
118 if (!ept->ops->send)
119 return -ENXIO;
120
111 return ept->ops->send(ept, data, len); 121 return ept->ops->send(ept, data, len);
112} 122}
113EXPORT_SYMBOL(rpmsg_send); 123EXPORT_SYMBOL(rpmsg_send);
@@ -132,6 +142,11 @@ EXPORT_SYMBOL(rpmsg_send);
132 */ 142 */
133int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst) 143int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst)
134{ 144{
145 if (WARN_ON(!ept))
146 return -EINVAL;
147 if (!ept->ops->sendto)
148 return -ENXIO;
149
135 return ept->ops->sendto(ept, data, len, dst); 150 return ept->ops->sendto(ept, data, len, dst);
136} 151}
137EXPORT_SYMBOL(rpmsg_sendto); 152EXPORT_SYMBOL(rpmsg_sendto);
@@ -159,6 +174,11 @@ EXPORT_SYMBOL(rpmsg_sendto);
159int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, 174int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
160 void *data, int len) 175 void *data, int len)
161{ 176{
177 if (WARN_ON(!ept))
178 return -EINVAL;
179 if (!ept->ops->send_offchannel)
180 return -ENXIO;
181
162 return ept->ops->send_offchannel(ept, src, dst, data, len); 182 return ept->ops->send_offchannel(ept, src, dst, data, len);
163} 183}
164EXPORT_SYMBOL(rpmsg_send_offchannel); 184EXPORT_SYMBOL(rpmsg_send_offchannel);
@@ -182,6 +202,11 @@ EXPORT_SYMBOL(rpmsg_send_offchannel);
182 */ 202 */
183int rpmsg_trysend(struct rpmsg_endpoint *ept, void *data, int len) 203int rpmsg_trysend(struct rpmsg_endpoint *ept, void *data, int len)
184{ 204{
205 if (WARN_ON(!ept))
206 return -EINVAL;
207 if (!ept->ops->trysend)
208 return -ENXIO;
209
185 return ept->ops->trysend(ept, data, len); 210 return ept->ops->trysend(ept, data, len);
186} 211}
187EXPORT_SYMBOL(rpmsg_trysend); 212EXPORT_SYMBOL(rpmsg_trysend);
@@ -205,6 +230,11 @@ EXPORT_SYMBOL(rpmsg_trysend);
205 */ 230 */
206int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst) 231int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst)
207{ 232{
233 if (WARN_ON(!ept))
234 return -EINVAL;
235 if (!ept->ops->trysendto)
236 return -ENXIO;
237
208 return ept->ops->trysendto(ept, data, len, dst); 238 return ept->ops->trysendto(ept, data, len, dst);
209} 239}
210EXPORT_SYMBOL(rpmsg_trysendto); 240EXPORT_SYMBOL(rpmsg_trysendto);
@@ -231,6 +261,11 @@ EXPORT_SYMBOL(rpmsg_trysendto);
231int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, 261int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
232 void *data, int len) 262 void *data, int len)
233{ 263{
264 if (WARN_ON(!ept))
265 return -EINVAL;
266 if (!ept->ops->trysend_offchannel)
267 return -ENXIO;
268
234 return ept->ops->trysend_offchannel(ept, src, dst, data, len); 269 return ept->ops->trysend_offchannel(ept, src, dst, data, len);
235} 270}
236EXPORT_SYMBOL(rpmsg_trysend_offchannel); 271EXPORT_SYMBOL(rpmsg_trysend_offchannel);