[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202512161840.rzIo5czd-lkp@intel.com>
Date: Tue, 16 Dec 2025 14:42:04 +0300
From: Dan Carpenter <dan.carpenter@...aro.org>
To: oe-kbuild@...ts.linux.dev,
Uwe Kleine-König <u.kleine-koenig@...libre.com>
Cc: lkp@...el.com, oe-kbuild-all@...ts.linux.dev,
linux-kernel@...r.kernel.org
Subject: drivers/pwm/core.c:2291 pwm_cdev_ioctl() warn: maybe return -EFAULT
instead of the bytes remaining?
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 40fbbd64bba6c6e7a72885d2f59b6a3be9991eeb
commit: 9c06f26ba5f5da14bcac405c7a652dcf578a785d pwm: Add support for pwmchip devices for faster and easier userspace access
config: sparc-randconfig-r072-20251213 (https://download.01.org/0day-ci/archive/20251216/202512161840.rzIo5czd-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 15.1.0
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@...el.com>
| Reported-by: Dan Carpenter <dan.carpenter@...aro.org>
| Closes: https://lore.kernel.org/r/202512161840.rzIo5czd-lkp@intel.com/
New smatch warnings:
drivers/pwm/core.c:2291 pwm_cdev_ioctl() warn: maybe return -EFAULT instead of the bytes remaining?
Old smatch warnings:
drivers/pwm/core.c:2325 pwm_cdev_ioctl() warn: maybe return -EFAULT instead of the bytes remaining?
vim +2291 drivers/pwm/core.c
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2229 static long pwm_cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2230 {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2231 int ret = 0;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2232 struct pwm_cdev_data *cdata = file->private_data;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2233 struct pwm_chip *chip = cdata->chip;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2234
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2235 guard(mutex)(&pwm_lock);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2236
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2237 if (!chip->operational)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2238 return -ENODEV;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2239
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2240 switch (cmd) {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2241 case PWM_IOCTL_REQUEST:
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2242 {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2243 unsigned int hwpwm = arg;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2244
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2245 return pwm_cdev_request(cdata, hwpwm);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2246 }
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2247
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2248 case PWM_IOCTL_FREE:
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2249 {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2250 unsigned int hwpwm = arg;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2251
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2252 return pwm_cdev_free(cdata, hwpwm);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2253 }
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2254
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2255 case PWM_IOCTL_ROUNDWF:
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2256 {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2257 struct pwmchip_waveform cwf;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2258 struct pwm_waveform wf;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2259 struct pwm_device *pwm;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2260
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2261 ret = copy_from_user(&cwf,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2262 (struct pwmchip_waveform __user *)arg,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2263 sizeof(cwf));
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2264 if (ret)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2265 return -EFAULT;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2266
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2267 if (cwf.__pad != 0)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2268 return -EINVAL;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2269
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2270 pwm = pwm_cdev_get_requested_pwm(cdata, cwf.hwpwm);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2271 if (IS_ERR(pwm))
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2272 return PTR_ERR(pwm);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2273
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2274 wf = (struct pwm_waveform) {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2275 .period_length_ns = cwf.period_length_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2276 .duty_length_ns = cwf.duty_length_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2277 .duty_offset_ns = cwf.duty_offset_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2278 };
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2279
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2280 ret = pwm_round_waveform_might_sleep(pwm, &wf);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2281 if (ret < 0)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2282 return ret;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2283
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2284 cwf = (struct pwmchip_waveform) {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2285 .hwpwm = cwf.hwpwm,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2286 .period_length_ns = wf.period_length_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2287 .duty_length_ns = wf.duty_length_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2288 .duty_offset_ns = wf.duty_offset_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2289 };
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2290
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 @2291 return copy_to_user((struct pwmchip_waveform __user *)arg,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2292 &cwf, sizeof(cwf));
if (copy_to_user())
return -EFAULT;
return 0;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2293 }
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2294
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2295 case PWM_IOCTL_GETWF:
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2296 {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2297 struct pwmchip_waveform cwf;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2298 struct pwm_waveform wf;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2299 struct pwm_device *pwm;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2300
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2301 ret = copy_from_user(&cwf,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2302 (struct pwmchip_waveform __user *)arg,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2303 sizeof(cwf));
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2304 if (ret)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2305 return -EFAULT;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2306
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2307 if (cwf.__pad != 0)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2308 return -EINVAL;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2309
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2310 pwm = pwm_cdev_get_requested_pwm(cdata, cwf.hwpwm);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2311 if (IS_ERR(pwm))
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2312 return PTR_ERR(pwm);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2313
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2314 ret = pwm_get_waveform_might_sleep(pwm, &wf);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2315 if (ret)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2316 return ret;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2317
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2318 cwf = (struct pwmchip_waveform) {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2319 .hwpwm = cwf.hwpwm,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2320 .period_length_ns = wf.period_length_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2321 .duty_length_ns = wf.duty_length_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2322 .duty_offset_ns = wf.duty_offset_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2323 };
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2324
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2325 return copy_to_user((struct pwmchip_waveform __user *)arg,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2326 &cwf, sizeof(cwf));
if (copy_to_user())
return -EFAULT;
return 0;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2327 }
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2328
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2329 case PWM_IOCTL_SETROUNDEDWF:
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2330 case PWM_IOCTL_SETEXACTWF:
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2331 {
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2332 struct pwmchip_waveform cwf;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2333 struct pwm_waveform wf;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2334 struct pwm_device *pwm;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2335
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2336 ret = copy_from_user(&cwf,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2337 (struct pwmchip_waveform __user *)arg,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2338 sizeof(cwf));
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2339 if (ret)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2340 return -EFAULT;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2341
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2342 if (cwf.__pad != 0)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2343 return -EINVAL;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2344
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2345 wf = (struct pwm_waveform){
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2346 .period_length_ns = cwf.period_length_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2347 .duty_length_ns = cwf.duty_length_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2348 .duty_offset_ns = cwf.duty_offset_ns,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2349 };
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2350
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2351 if (!pwm_wf_valid(&wf))
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2352 return -EINVAL;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2353
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2354 pwm = pwm_cdev_get_requested_pwm(cdata, cwf.hwpwm);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2355 if (IS_ERR(pwm))
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2356 return PTR_ERR(pwm);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2357
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2358 ret = pwm_set_waveform_might_sleep(pwm, &wf,
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2359 cmd == PWM_IOCTL_SETEXACTWF);
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2360
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2361 /*
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2362 * If userspace cares about rounding deviations it has
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2363 * to check the values anyhow, so simplify handling for
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2364 * them and don't signal uprounding. This matches the
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2365 * behaviour of PWM_IOCTL_ROUNDWF which also returns 0
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2366 * in that case.
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2367 */
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2368 if (ret == 1)
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2369 ret = 0;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2370
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2371 return ret;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2372 }
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2373
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2374 default:
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2375 return -ENOTTY;
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2376 }
9c06f26ba5f5da Uwe Kleine-König 2025-04-30 2377 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Powered by blists - more mailing lists