Patch to execve

Kevin M. Kilbride kmk at ssl.org
Mon Feb 28 15:49:20 PST 2005


Joerg Sonnenberger wrote:

On Sun, Feb 27, 2005 at 03:45:39PM -0800, Kevin M. Kilbride wrote:
 

The documentation for the compiler actually points out the problem with 
the write-strings option:

"These warnings will help you find at compile time code that can try to 
write into a string constant, but only if you have been very careful 
about using const in declarations and prototype. Otherwise, it will just 
be a nuisance; this is why we did not make -Wall request these warnings."

It should be removed from WARNS=6.
   

No. Code has to understand that there is a difference between:
const char *
char *
char []
 

It is precisely that difference I am talking about, Joerg. This code is 
safe:

   void function(void) {
      char *x = "some string";
      potential_string_modifier(x);
   }
This code is not safe:

   void function(void) {
     char x[] = "some string";
     potential_string_modifier(x);
   }
In the first case, if the potential modifier attempts to write to the 
string, the program will die. As I pointed out previously, dead programs 
are always safe. In the second case, if the potential modifier attempts 
to write to the string, it will succeed---even if it overwrites the 
stack. It is exercises similar to this that permit stack overflow 
exploits. Moreover, passing truly-writable copies prevents you from 
later finding any calls that should not be modifying strings, but which 
actually do.

Keep in mind what ( char x[] = "some string"; ) is actually doing. It 
declares an automatically-sized array on the stack and then initializes 
it with a string literal. For whatever reason, the userland code I've 
looked at so far often declares string constants as automatic 
variables---but at least it does it with pointers to literals. Doing 
this as a pointer to a string literal can never open the door to safety 
issues. Doing it as an automatic initialization of an array on the 
stack, on the other hand, *may* open the door to potential safety 
issues. Kernel functions should never be a problem, since they are 
absolutely privileged and completely trusted; but if you start 
encouraging WARNS=6 compliance in general, then people will, ironically, 
be given a false sense of security by making their code warnings-free. 
Aside from which, even within their own applications, they will have a 
more difficult time finding bugs related to unintentional writing to 
should-be-constant strings. That is why -Wwrite-strings should be 
removed from WARNS=6.






More information about the Submit mailing list