[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] xen/hypfs: fix writing of custom parameter


  • To: Jürgen Groß <jgross@xxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • Date: Fri, 11 Sep 2020 15:02:05 +0100
  • Authentication-results: esa4.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
  • Cc: George Dunlap <george.dunlap@xxxxxxxxxx>, Ian Jackson <iwj@xxxxxxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Julien Grall <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>
  • Delivery-date: Fri, 11 Sep 2020 14:02:24 +0000
  • Ironport-sdr: NvgtSIcY35h8+3qtVZnf5tum/94NwL8TK8Fg4BqP9OBooDfMBSS8sX5kUtS32OOxGn/WVflOmk /lOnW7z9WjNeTx5sqX3ko+IqTewkAgBzcmKvHt96Di74AGN0tfaHo8UwFi8+GdLuTt6fATsebC i+UqOGgbZKQT4d3IDC5KY591wTVxDV2mqDxs88UBHAK4l2eLNeVc3/72NxaVYYENjWNtw/jHji uT2zFAE9MZfu2UKjFWmOjM6YyXS7kfwnYteeI+9f+YlWrfG4Cguyk1YoL7iYJFUMD1PptqyBEm r54=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 11/09/2020 13:28, Jürgen Groß wrote:
> On 11.09.20 14:14, Andrew Cooper wrote:
>> On 11/09/2020 06:30, Juergen Gross wrote:
>>> Today the maximum allowed data length for writing a hypfs node is
>>> tested in the generic hypfs_write() function. For custom runtime
>>> parameters this might be wrong, as the maximum allowed size is derived
>>> from the buffer holding the current setting, while there might be ways
>>> to set the parameter needing more characters than the minimal
>>> representation of that value.
>>>
>>> One example for this is the "ept" parameter. Its value buffer is sized
>>> to be able to hold the string "exec-sp=0" or "exec-sp=1", while it is
>>> allowed to use e.g. "no-exec-sp" or "exec-sp=yes" for setting it.
>>
>> If you're looking for silly examples, exec-sp=disabled is also legal
>> boolean notation for Xen.
>>
>>>
>>> Fix that by moving the length check one level down to the type
>>> specific write function.
>>>
>>> In order to avoid allocation of arbitrary sized buffers use a new
>>> MAX_PARAM_SIZE macro as an upper limit for custom writes. The value
>>> of MAX_PARAM_SIZE is the same as the limit in parse_params() for a
>>> single parameter.
>>>
>>> Fixes: 5b5ccafb0c42 ("xen: add basic hypervisor filesystem support")
>>> Reported-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>>> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
>>
>> This does fix my bug, so Tested-by: Andrew Cooper
>> <andrew.cooper3@xxxxxxxxxx>
>>
>> This does need backporting to 4.14, so maybe is best to take in this
>> form for now.
>>
>> However, I'm rather uneasy about the approach.
>>
>> Everything here derives from command line semantics, and it's probably
>> not going to be long until we get runtime modification of two sub
>> parameters.
>>
>> In a theoretical world where all the EPT suboptions were runtime
>> modifiable, it would be legal to try and pass
>>
>> ept=exec-sp,pml,no-pml,no-ad,ad,no-ad
>
> Correct.
>
>> While being fairly nonsensical, it is well formed on the command line.
>> We go left to right, and latest takes precedence.
>
> Yes.
>
>> Given that we do have buffer containing everything provided by
>> userspace, and all internal logic organised with const char *, why do we
>> need an intermediate allocation at all?
>
> Which intermediate allocation?

Sorry.  Intermediate buffer.

>
>> Can't we just pass that all the way down, rather than leaving the same
>> bug to hit at some point when we do have a parameter which legitimately
>> takes 128 characters of configuration?
>
> The problem is we can't just set the current value with the string
> passed in from the user.

Why ever not?  It is parsed as per the command line, not taken
verbatim.  It has no bearing on size of the output buffer.

>
> Imagine above example with ept, just two calls with:
>
> ept=exec-sp
> ept=no-pml
>
> Your idea is to return only no-pml, while the truth would be
> exec-sp=1,pml=0 (in the notation produced by the current code).

In this example,

The semantic gap is that "xenhypfs cat /params/ept" doesn't mean "tell
me what the user (last?) put on the command line for ept=".  It means
"tell me the current state of the ept= runtime options".

I agree that reading it should always return something of the form
exec-sp=X,pml=Y.

However, writing it should not require the user to provide both in one
go.  Its a horrible (and racy) interface when you only want to change
one of the options.

Specifically, the following should work:

# xenhypfs cat /params/ept
exec-sp=A,pml=B
# xenhypfs write /params/ept exec-sp=C
# xenhypfs cat /params/ept
exec-sp=C,pml=B
# xenhypfs write /params/ept pml=D
# xenhypfs cat /params/ept
exec-sp=C,pml=D

~Andrew

P.S. What stability guarantees have we made about the structure layout? 
Didn't we agree that a top level /params/ wasn't necessarily the best
hierarchy to turn into an ABI.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.