diff options
-rw-r--r-- | drivers/of/device.c | 15 |
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 | ||
196 | static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len) | 196 | static 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 | ||
229 | int of_device_request_module(struct device *dev) | 234 | int of_device_request_module(struct device *dev) |