Solved

VS2005 C++ CString::Format() crashed if invalid format specifier is used

Posted on 2009-05-06
12
1,450 Views
Last Modified: 2013-12-14
A VS2005 release compiled program will crash on the Format instruction below.  Why?  Note the use of the letter O as opposed to the number 0 in the format specifier.

   CString cs;
   try
   {
      cs.Format("%2.Of",0); // as opposed to cs.Format("%2.0f",0);
   }
   catch (...)
   {
      // we neverget here
   }
0
Comment
Question by:mogulza
  • 6
  • 4
  • 2
12 Comments
 
LVL 40

Expert Comment

by:evilrix
ID: 24315710
it's probably a Windows structured exception being thrown and not a C++ exception. A C++ exception handler cannot be used to catch a structured exception.
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24315738
it's probably a Windows structured exception being thrown and not a C++ exception. A C++ exception handler cannot be used to catch a structured exception.
0
 

Author Comment

by:mogulza
ID: 24316033
Thanks evilrix.  The funny thing is that this does not happen with VS 6.0.  So Microsoft have changed the rules for VS2005.  Can you show me what code to use to catchthe exception?
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 

Author Comment

by:mogulza
ID: 24316185
evilrix .. have consulted MSDN and added SEH code (isong _set_se_translator) and this does not help.  Crash still happens .. which implies it is not a structured exception ..... ?
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24316367
VC 6 did indeed catch structured exceptions but this was changed because it was not correct behavior. When I get home I'll see if I can assist more. Meanwhile though since we know the problem it the format string isn't the solution just to correct that?
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24316368
VC 6 did indeed catch structured exceptions but this was changed because it was not correct behavior. When I get home I'll see if I can assist more. Meanwhile though since we know the problem it the format string isn't the solution just to correct that?
0
 

Accepted Solution

by:
mogulza earned 0 total points
ID: 24316492
evilrix .. after further MSDN research I have found the fix !!!  _set_invalid_parameter_handler() resolves the problem.  Thanks for your input
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24316771
>> _set_invalid_parameter_handler()
That's interesting because according to the docs, "Sets a function to be called when the CRT detects an invalid argument." of which CString.Format() isn't a part of (the CRT being the C Runtime). Anyway, further analysis show that the callstack goes into vswprintf_s, which is one of Microsoft's "secure" CRT functions and it seem this is the reason why the CRT invalid parameter handler is fired.

http://msdn.microsoft.com/en-us/library/wd3wzwts.aspx

0
 

Author Comment

by:mogulza
ID: 24322904
evilrix ... to answer a previous question of yours in this thread ... our software program allows users to specify a format string ... so when they enter an incorrect format, thats when things go wrong. Thanks again for your input
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24322934
>> our software program allows users to specify a format string
Ah ok.

>> Thanks again for your input
No worries... sorry I couldn't give you an immediate answer but I was stuck on the train when you first posted your question :)
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 24323390
>>>> our software program allows users to specify a format string ... so when they enter an incorrect format, thats when things go wrong. Thanks again for your input
That is very dangerous. The printf functionality - also used in the CString::Format) - is one of the main reasons for security leaks and process hijacking by malicious attackers. The problem is - beside of the crash issues which hardly can be handled - that wrong format statements may cause printf to overwrite stack addresses what can be used to process malicious code with the access rights of the current user. It is possible that the vswprintf_s behind CString::Format was secure regarding that issue but I wouldn't bet on it.
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 24545211
>>>> Found it myself after further research

Please post your solution so that the thread can be PAQ'd.
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Update (December 2011): Since this article was published, the things have changed for good for Android native developers. The Sequoyah Project (http://www.eclipse.org/sequoyah/) automates most of the tasks discussed in this article. You can even fin…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The viewer will learn how to use NetBeans IDE 8.0 for Windows to connect to a MySQL database. Open Services Panel: Create a new connection using New Connection Wizard: Create a test database called eetutorial: Create a new test tabel called ee…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

837 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question