Source-Changes-D archive

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

Re: CVS commit: src/sys/kern



In article <21271.19186.176517.832253%guava.gson.org@localhost>,
Andreas Gustafsson  <gson%NetBSD.org@localhost> wrote:
>On Feb 27, David Laight said:
>> Module Name: src
>> Committed By:        dsl
>> Date:                Thu Feb 27 22:50:52 UTC 2014
>> 
>> Modified Files:
>>      src/sys/kern: kern_sysctl.c
>> 
>> Log Message:
>> Allow CTLTYPE_INT and CTLTYPE_QUAD to be read and written as either 4 or 8
>>   byte values regardless of the type.
>> 64bit writes to 32bit variables must be valid (signed) values.
>> 32bit reads of large values return -1.
>> Amongst other things this should fix libm's code that reads machdep.sse
>>   as a 32bit int, but I'd changed it to 64bit (to common up some code).
>> 
>> 
>> To generate a diff of this commit:
>> cvs rdiff -u -r1.246 -r1.247 src/sys/kern/kern_sysctl.c
>
>In private correspondence with David, I have objected to this commit
>as well as his earlier change to the type of the machdep.sse
>sysctl variable.
>
>Regrettably, David and I have not been able to reach an agreement, and
>he has requested that I ask for opinions on a public list.  So...
>
>1. I object to the earlier change of the following sysctl variables
>from type CTLTYPE_INT to type CTLTYPE_QUAD:
>
>    machdep.fpu_present
>    machdep.osfxsr
>    machdep.sse
>    machdep.sse2
>    machdep.biosbasemem
>    machdep.biosextmem
>
>My understanding of David's rationale for changing them is that it
>facilitated sharing code with the machdep.xsave_features variable
>which actually needs to be of type CTLTYPE_QUAD.  By my reckoning, 
>the savings from this code sharing amount to eight lines of code.
>
>Changing the types of existing sysctl variables breaks both source 
>and binary compatibility and should not be done lightly; that's
>why we have both both hw.physmem and hw.physmem64, for example.
>Now, the types of multiple variables have been incompatibly changed
>for no reason other than saving a few lines of code.
>
>I believe the harm caused by the incompatible type change far
>outweighs the cost of a few added lines of code, and would like 
>the original types to be restored.  I am attaching a patch to do so;
>it also changes the newly added variables machdep.fpu_save and
>machdep.fpu_save_size to CTLTYPE_INT, but if David really thinks
>those should be CTLTYPE_QUAD, I will not argue that point.
>
>
>2. I also object to the change of kern_syctl.c 1.247.
>
>This change attempts to work around the problems caused by the changes
>to the variable types by making sysctl() return different types
>depending on the value of the *oldlenp argument.
>
>IMO, this is a bad idea.  The *oldlenp argument does *not* specify the
>size of the data type expected by the caller, but rather the size of a
>buffer.  The sysctl() API allows the caller to pass a buffer larger
>than the variable being read, and conversely, guarantees that passing
>a buffer that is too small results in ENOMEM.
>
>Both of these aspects of the API are now broken: reading a 4-byte
>CTLTYPE_INT variable now works for any buffer size >= 4 *except* 8,
>and attempting to read an 8-byte CTLTYPE_QUAD variable into a buffer
>of less than 8 bytes is now guaranteed to yield ENOMEM *except* if the
>buffer size happens to be 4.  IMO, this behavior violates both the
>letter of the sysctl() man page and the principle of least astonishment.
>
>Also, the work-around is ineffective in the case of a caller that
>allocates the buffer dynamically using the size given by an initial
>sysctl() call with oldp = NULL.
>
>If the original types of the sysctl variables are restored, this
>work-around will no longer serve a purpose, and I'm asking for it
>to be removed.
>
>Opinions?

I think you are correct.

christos



Home | Main Index | Thread Index | Old Index