On 2/22/21 7:12 AM, Romain Perier wrote:
> The strlcpy() reads the entire source buffer first, it is dangerous if
> the source buffer lenght is unbounded or possibility non NULL-terminated.

length

> It can lead to linear read overflows, crashes, etc...
> 
Not here. This description is misleading.

> As recommended in the deprecated interfaces [1], it should be replaced
> by strscpy.
> 
> This commit replaces all calls to strlcpy that handle the return values
> by the corresponding strscpy calls with new handling of the return
> values (as it is quite different between the two functions).
> 
> [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
> 
> Signed-off-by: Romain Perier <romain.per...@gmail.com>

This patch just adds pain to injury, as the source 'buffers' are all fixed
strings and their length will never exceed the maximum buffer length.
I really don't see the point of using strscpy() in this situation.

> ---
>  drivers/hwmon/pmbus/max20730.c |   66 
> +++++++++++++++++++++--------------------

This patch only modifies a single driver and should be tagged as such.

>  1 file changed, 35 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/hwmon/pmbus/max20730.c b/drivers/hwmon/pmbus/max20730.c
> index 9dd3dd79bc18..a384b57b7327 100644
> --- a/drivers/hwmon/pmbus/max20730.c
> +++ b/drivers/hwmon/pmbus/max20730.c
> @@ -107,7 +107,8 @@ struct max20730_debugfs_data {
>  static ssize_t max20730_debugfs_read(struct file *file, char __user *buf,
>                                    size_t count, loff_t *ppos)
>  {
> -     int ret, len;
> +     int ret;
> +     ssize_t len;
>       int *idxp = file->private_data;
>       int idx = *idxp;
>       struct max20730_debugfs_data *psu = to_psu(idxp, idx);
> @@ -148,13 +149,13 @@ static ssize_t max20730_debugfs_read(struct file *file, 
> char __user *buf,
>                       >> MAX20730_MFR_DEVSET1_TSTAT_BIT_POS;
>  
>               if (val == 0)
> -                     len = strlcpy(tbuf, "2000\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "2000\n", DEBUG_FS_DATA_MAX);
>               else if (val == 1)
> -                     len = strlcpy(tbuf, "125\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "125\n", DEBUG_FS_DATA_MAX);
>               else if (val == 2)
> -                     len = strlcpy(tbuf, "62.5\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "62.5\n", DEBUG_FS_DATA_MAX);
>               else
> -                     len = strlcpy(tbuf, "32\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "32\n", DEBUG_FS_DATA_MAX);
>               break;
>       case MAX20730_DEBUGFS_INTERNAL_GAIN:
>               val = (data->mfr_devset1 & MAX20730_MFR_DEVSET1_RGAIN_MASK)
> @@ -163,35 +164,35 @@ static ssize_t max20730_debugfs_read(struct file *file, 
> char __user *buf,
>               if (data->id == max20734) {
>                       /* AN6209 */
>                       if (val == 0)
> -                             len = strlcpy(tbuf, "0.8\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "0.8\n", DEBUG_FS_DATA_MAX);
>                       else if (val == 1)
> -                             len = strlcpy(tbuf, "3.2\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "3.2\n", DEBUG_FS_DATA_MAX);
>                       else if (val == 2)
> -                             len = strlcpy(tbuf, "1.6\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "1.6\n", DEBUG_FS_DATA_MAX);
>                       else
> -                             len = strlcpy(tbuf, "6.4\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "6.4\n", DEBUG_FS_DATA_MAX);
>               } else if (data->id == max20730 || data->id == max20710) {
>                       /* AN6042 or AN6140 */
>                       if (val == 0)
> -                             len = strlcpy(tbuf, "0.9\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "0.9\n", DEBUG_FS_DATA_MAX);
>                       else if (val == 1)
> -                             len = strlcpy(tbuf, "3.6\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "3.6\n", DEBUG_FS_DATA_MAX);
>                       else if (val == 2)
> -                             len = strlcpy(tbuf, "1.8\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "1.8\n", DEBUG_FS_DATA_MAX);
>                       else
> -                             len = strlcpy(tbuf, "7.2\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "7.2\n", DEBUG_FS_DATA_MAX);
>               } else if (data->id == max20743) {
>                       /* AN6042 */
>                       if (val == 0)
> -                             len = strlcpy(tbuf, "0.45\n", 
> DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "0.45\n", 
> DEBUG_FS_DATA_MAX);
>                       else if (val == 1)
> -                             len = strlcpy(tbuf, "1.8\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "1.8\n", DEBUG_FS_DATA_MAX);
>                       else if (val == 2)
> -                             len = strlcpy(tbuf, "0.9\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "0.9\n", DEBUG_FS_DATA_MAX);
>                       else
> -                             len = strlcpy(tbuf, "3.6\n", DEBUG_FS_DATA_MAX);
> +                             len = strscpy(tbuf, "3.6\n", DEBUG_FS_DATA_MAX);
>               } else {
> -                     len = strlcpy(tbuf, "Not supported\n", 
> DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "Not supported\n", 
> DEBUG_FS_DATA_MAX);
>               }
>               break;
>       case MAX20730_DEBUGFS_BOOT_VOLTAGE:
> @@ -199,26 +200,26 @@ static ssize_t max20730_debugfs_read(struct file *file, 
> char __user *buf,
>                       >> MAX20730_MFR_DEVSET1_VBOOT_BIT_POS;
>  
>               if (val == 0)
> -                     len = strlcpy(tbuf, "0.6484\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "0.6484\n", DEBUG_FS_DATA_MAX);
>               else if (val == 1)
> -                     len = strlcpy(tbuf, "0.8984\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "0.8984\n", DEBUG_FS_DATA_MAX);
>               else if (val == 2)
> -                     len = strlcpy(tbuf, "1.0\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "1.0\n", DEBUG_FS_DATA_MAX);
>               else
> -                     len = strlcpy(tbuf, "Invalid\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "Invalid\n", DEBUG_FS_DATA_MAX);
>               break;
>       case MAX20730_DEBUGFS_OUT_V_RAMP_RATE:
>               val = (data->mfr_devset2 & MAX20730_MFR_DEVSET2_VRATE)
>                       >> MAX20730_MFR_DEVSET2_VRATE_BIT_POS;
>  
>               if (val == 0)
> -                     len = strlcpy(tbuf, "4\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "4\n", DEBUG_FS_DATA_MAX);
>               else if (val == 1)
> -                     len = strlcpy(tbuf, "2\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "2\n", DEBUG_FS_DATA_MAX);
>               else if (val == 2)
> -                     len = strlcpy(tbuf, "1\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "1\n", DEBUG_FS_DATA_MAX);
>               else
> -                     len = strlcpy(tbuf, "Invalid\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "Invalid\n", DEBUG_FS_DATA_MAX);
>               break;
>       case MAX20730_DEBUGFS_OC_PROTECT_MODE:
>               ret = (data->mfr_devset2 & MAX20730_MFR_DEVSET2_OCPM_MASK)
> @@ -230,13 +231,13 @@ static ssize_t max20730_debugfs_read(struct file *file, 
> char __user *buf,
>                       >> MAX20730_MFR_DEVSET2_SS_BIT_POS;
>  
>               if (val == 0)
> -                     len = strlcpy(tbuf, "0.75\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "0.75\n", DEBUG_FS_DATA_MAX);
>               else if (val == 1)
> -                     len = strlcpy(tbuf, "1.5\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "1.5\n", DEBUG_FS_DATA_MAX);
>               else if (val == 2)
> -                     len = strlcpy(tbuf, "3\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "3\n", DEBUG_FS_DATA_MAX);
>               else
> -                     len = strlcpy(tbuf, "6\n", DEBUG_FS_DATA_MAX);
> +                     len = strscpy(tbuf, "6\n", DEBUG_FS_DATA_MAX);
>               break;
>       case MAX20730_DEBUGFS_IMAX:
>               ret = (data->mfr_devset2 & MAX20730_MFR_DEVSET2_IMAX_MASK)
> @@ -287,9 +288,12 @@ static ssize_t max20730_debugfs_read(struct file *file, 
> char __user *buf,
>                               "%d.%d\n", ret / 10000, ret % 10000);
>               break;
>       default:
> -             len = strlcpy(tbuf, "Invalid\n", DEBUG_FS_DATA_MAX);
> +             len = strscpy(tbuf, "Invalid\n", DEBUG_FS_DATA_MAX);
>       }
>  
> +     if (len == -E2BIG)
> +             return -E2BIG;
> +
>       return simple_read_from_buffer(buf, count, ppos, tbuf, len);
>  }
>  
> 

Reply via email to