int __device_set_driver_override(struct device *dev, const char *s, size_t len)
{
- const char *new, *old;
- char *cp;
+ const char *new = NULL, *old;
if (!s)
return -EINVAL;
*/
len = strlen(s);
- if (!len) {
- /* Empty string passed - clear override */
- spin_lock(&dev->driver_override.lock);
- old = dev->driver_override.name;
- dev->driver_override.name = NULL;
- spin_unlock(&dev->driver_override.lock);
- kfree(old);
+ /* Handle trailing newline */
+ if (len) {
+ char *cp;
- return 0;
+ cp = strnchr(s, len, '\n');
+ if (cp)
+ len = cp - s;
}
- cp = strnchr(s, len, '\n');
- if (cp)
- len = cp - s;
-
- new = kstrndup(s, len, GFP_KERNEL);
- if (!new)
- return -ENOMEM;
+ /*
+ * If empty string or "\n" passed, new remains NULL, clearing
+ * the driver_override.name.
+ */
+ if (len) {
+ new = kstrndup(s, len, GFP_KERNEL);
+ if (!new)
+ return -ENOMEM;
+ }
- spin_lock(&dev->driver_override.lock);
- old = dev->driver_override.name;
- if (cp != s) {
+ scoped_guard(spinlock, &dev->driver_override.lock) {
+ old = dev->driver_override.name;
dev->driver_override.name = new;
- spin_unlock(&dev->driver_override.lock);
- } else {
- /* "\n" passed - clear override */
- dev->driver_override.name = NULL;
- spin_unlock(&dev->driver_override.lock);
-
- kfree(new);
}
+
kfree(old);
return 0;