aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/of/device.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/of/device.c b/drivers/of/device.c
index c5c06997fdd2..11a17582e568 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -195,10 +195,11 @@ EXPORT_SYMBOL(of_device_get_match_data);
195 195
196static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len) 196static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len)
197{ 197{
198 const char *compat, *start = str; 198 const char *compat;
199 char *c; 199 char *c;
200 struct property *p; 200 struct property *p;
201 ssize_t csize; 201 ssize_t csize;
202 ssize_t tsize;
202 203
203 if ((!dev) || (!dev->of_node)) 204 if ((!dev) || (!dev->of_node))
204 return -ENODEV; 205 return -ENODEV;
@@ -206,12 +207,16 @@ static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len
206 /* Name & Type */ 207 /* Name & Type */
207 csize = snprintf(str, len, "of:N%sT%s", dev->of_node->name, 208 csize = snprintf(str, len, "of:N%sT%s", dev->of_node->name,
208 dev->of_node->type); 209 dev->of_node->type);
210 tsize = csize;
209 len -= csize; 211 len -= csize;
210 str += csize; 212 if (str)
213 str += csize;
211 214
212 of_property_for_each_string(dev->of_node, "compatible", p, compat) { 215 of_property_for_each_string(dev->of_node, "compatible", p, compat) {
213 if (strlen(compat) + 2 > len) 216 csize = strlen(compat) + 1;
214 break; 217 tsize += csize;
218 if (csize > len)
219 continue;
215 220
216 csize = snprintf(str, len, "C%s", compat); 221 csize = snprintf(str, len, "C%s", compat);
217 for (c = str; c; ) { 222 for (c = str; c; ) {
@@ -223,7 +228,7 @@ static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len
223 str += csize; 228 str += csize;
224 } 229 }
225 230
226 return str - start; 231 return tsize;
227} 232}
228 233
229int of_device_request_module(struct device *dev) 234int of_device_request_module(struct device *dev)