• Joel Stanley's avatar
    powerpc/powernv: Fix sysparam sysfs error handling · ba9a32b1
    Joel Stanley authored
    When a sysparam query in OPAL returned a negative value (error code),
    sysfs would spew out a decent chunk of memory; almost 64K more than
    expected. This was traced to a sign/unsigned mix up in the OPAL sysparam
    sysfs code at sys_param_show.
    
    The return value of sys_param_show is a ssize_t, calculated using
    
      return ret ? ret : attr->param_size;
    
    Alan Modra explains:
    
      "attr->param_size" is an unsigned int, "ret" an int, so the overall
      expression has type unsigned int.  Result is that ret is cast to
      unsigned int before being cast to ssize_t.
    
    Instead of using the ternary operator, set ret to the param_size if an
    error is not detected. The same bug exists in the sysfs write callback;
    this patch fixes it in the same way.
    
    A note on debugging this next time: on my system gcc will warn about
    this if compiled with -Wsign-compare, which is not enabled by -Wall,
    only -Wextra.
    Signed-off-by: default avatarJoel Stanley <joel@jms.id.au>
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    ba9a32b1
opal-sysparam.c 6.96 KB