<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Spot the Bug!</title><link>http://blogs.msdn.com/rsamona/default.aspx</link><description>Do you think you have the skills to find security vulnerabilities before they find you? See if you can Spot the Bug!</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Nice weather!</title><link>http://blogs.msdn.com/rsamona/archive/2007/05/09/nice-weather.aspx</link><pubDate>Wed, 09 May 2007 20:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2506471</guid><dc:creator>rsamona</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/2506471.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=2506471</wfw:commentRss><description>Well, we are finally starting to see some nice weather in Seattle! I don't know if there is a better place to be on a sunny day!&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2506471" width="1" height="1"&gt;</description></item><item><title>Microsoft Threat Analysis &amp; Modeling v2.0 </title><link>http://blogs.msdn.com/rsamona/archive/2006/03/13/550953.aspx</link><pubDate>Tue, 14 Mar 2006 07:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:550953</guid><dc:creator>rsamona</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/550953.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=550953</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;BETA2 of Microsoft Threat Analysis &amp;amp; Modeling v2.0 (formerly codenamed “ACE Torpedo”) is now available for download &lt;/FONT&gt;&lt;A href="http://www.msdn.microsoft.com/security/acetm"&gt;&lt;FONT face=Verdana color=#0000cc size=2&gt;here&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;Check out this blog for more info: &lt;A HREF="/threatmodeling/"&gt;http://blogs.msdn.com/threatmodeling/&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;For those of you that haven't downloaded it yet, you should. It's a great tool that helps automate the creation of a threat model. Very slick and very useful!&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=550953" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Microsoft+Developer+Security/default.aspx">Microsoft Developer Security</category></item><item><title>Spot the Bug - March 13, 2006</title><link>http://blogs.msdn.com/rsamona/archive/2006/03/13/550949.aspx</link><pubDate>Tue, 14 Mar 2006 07:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:550949</guid><dc:creator>rsamona</dc:creator><slash:comments>25</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/550949.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=550949</wfw:commentRss><description>&lt;P&gt;It seems like more and more developers are making security mistakes when dealing with sockets. See if you can Spot the Bug.&lt;/P&gt;
&lt;P&gt;void Socket_Setup(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; WORD wVersionRequested;&lt;BR&gt;&amp;nbsp; WSADATA wsaData;&lt;BR&gt;&amp;nbsp; wVersionRequested = MAKEWORD( 2, 2 );&lt;BR&gt;&amp;nbsp; ::WSAStartup(wVersionRequested, &amp;amp;wsaData);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; SOCKET sTCPServer = ::socket(AF_INET, SOCK_STREAM, 0);&lt;BR&gt;&amp;nbsp; struct sockaddr_in saTCPServAddr;&lt;BR&gt;&amp;nbsp; saTCPServAddr.sin_family = AF_INET;&lt;BR&gt;&amp;nbsp; saTCPServAddr.sin_addr.S_un.S_addr = ::htonl(INADDR_ANY);&lt;BR&gt;&amp;nbsp; saTCPServAddr.sin_port = ::htons(5678);&lt;BR&gt;&amp;nbsp; int len = sizeof(saTCPServAddr);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; int iFail =::bind(sTCPServer, (struct sockaddr*)&amp;amp;saTCPServAddr, len);&lt;BR&gt;&amp;nbsp; DWORD dwErr;&lt;BR&gt;&amp;nbsp; if(0 != iFail)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwErr = ::WSAGetLastError();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("\n\t Error occured.\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; iFail = ::listen(sTCPServer, 2);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; struct sockaddr_in saClient;&lt;BR&gt;&amp;nbsp; int iClsize = sizeof(saClient);&lt;BR&gt;&amp;nbsp; SOCKET sClient = ::accept(sTCPServer, (struct sockaddr*)&amp;amp;saClient ,&amp;amp;iClsize);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; char strData[1024];&lt;BR&gt;&amp;nbsp; ::recv(sClient, strData, 1024, 0);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; printf("\n\nRealServer--Data from client --- %s ---", strData);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; ::shutdown(sTCPServer, SD_BOTH);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; ::WSACleanup();&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; return;&lt;BR&gt;} &lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=550949" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Spot+the+Bug/default.aspx">Spot the Bug</category></item><item><title>Spot the Bug - Feb 2, 2006</title><link>http://blogs.msdn.com/rsamona/archive/2006/02/02/523659.aspx</link><pubDate>Fri, 03 Feb 2006 03:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:523659</guid><dc:creator>rsamona</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/523659.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=523659</wfw:commentRss><description>&lt;P&gt;Great discussion on the last bug. For those of you that took a look at it, it dealt with insecure use of cryptography resulting in exposure to dictionary attacks. Here's a new one:&lt;/P&gt;
&lt;P&gt;class CDatabase&lt;BR&gt;{&lt;BR&gt;private:&lt;BR&gt;&amp;nbsp; HANDLE m_hwndMutex;&lt;BR&gt;public:&lt;BR&gt;&amp;nbsp; void InitDBConnection(void);&lt;BR&gt;&amp;nbsp; void UpdateDB(void);&lt;BR&gt;};&lt;BR&gt;&amp;nbsp;&lt;BR&gt;int _tmain(int argc, _TCHAR* argv[])&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; CDatabase obj1;&lt;BR&gt;&amp;nbsp; obj1.InitDBConnectionEx();&lt;BR&gt;&amp;nbsp; obj1.UpdateDB();&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; return 0;&lt;BR&gt;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;void CDatabase::InitDBConnection(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; SECURITY_DESCRIPTOR SecurityDescriptor;&lt;BR&gt;&amp;nbsp; InitializeSecurityDescriptor(&amp;amp;SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; SetSecurityDescriptorDacl(&amp;amp;SecurityDescriptor, TRUE, NULL, FALSE);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; SECURITY_ATTRIBUTES secAttribMutex;&lt;BR&gt;&amp;nbsp; secAttribMutex.nLength = sizeof(SECURITY_ATTRIBUTES);&lt;BR&gt;&amp;nbsp; secAttribMutex.lpSecurityDescriptor = &amp;amp;SecurityDescriptor;&lt;BR&gt;&amp;nbsp; secAttribMutex.bInheritHandle = TRUE;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; m_hwndMutex = ::CreateMutex(&amp;amp;secAttribMutex,FALSE,"GUARD_DB_ACCESS_MUTEX");&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; return;&lt;BR&gt;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;void CDatabase::UpdateDB(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; //Acquire the db mutex&lt;BR&gt;&amp;nbsp; WaitForSingleObject(m_hwndMutex,INFINITE);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; //Update the database&lt;BR&gt;&amp;nbsp; //&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; //Release the db mutex&lt;BR&gt;&amp;nbsp; ReleaseMutex(m_hwndMutex);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; return;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Solution&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 0pt"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"&gt;Kernel objects are used for inter process synchronization purposes viz. guarding access to the database, signaling occurrence of an event etc. Insecure creation of kernel objects may allow a malicious attacker to cause denial of service attacks. In the above example, in the insecure approach, a malicious attacker can lock the mutex and deny the valid application access to the database. Care must be taken while creating kernel objects to make sure that they do not exist before you actually create them. If they already exist, then before continuing the ownership and the access control on the kernel object must be changed. In the event that the kernel object did not exist before care must be taken to enforce strong access control on the kernel object. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;void CDatabase::InitDBConnection(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; m_hwndMutex = ::OpenMutex(MUTEX_ALL_ACCESS, TRUE, "GUARD_DB_ACCESS");&lt;BR&gt;&amp;nbsp; if(NULL != m_hwndMutex)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //The mutex has already been created by some other process!&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Either return an error OR change the ownership and the allowed access of the already existing mutex.&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; SECURITY_DESCRIPTOR SecurityDescriptor;&lt;BR&gt;InitializeSecurityDescriptor(&amp;amp;SecurityDescriptor,SECURITY_DESCRIPTOR_REVISION);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; char strUserName[2048];&lt;BR&gt;&amp;nbsp; ULONG uLen = 2048;&lt;BR&gt;&amp;nbsp; ::GetUserName(strUserName, &amp;amp;uLen);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; PSID psidUser = ::LocalAlloc(LPTR, sizeof(SID)); &lt;BR&gt;&amp;nbsp; DWORD dwSidSize = sizeof(SID);&lt;BR&gt;&amp;nbsp; char strReferencedDomainName[2048]="";&lt;BR&gt;&amp;nbsp; DWORD dwDomainNameLen = sizeof(strReferencedDomainName);&lt;BR&gt;&amp;nbsp; SID_NAME_USE sidAccType;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; BOOL bSuccess = ::LookupAccountName(NULL, strUserName, psidUser, &amp;amp;dwSidSize, strReferencedDomainName, &amp;amp;dwDomainNameLen, &amp;amp;sidAccType);&lt;BR&gt;&amp;nbsp; if(FALSE == bSuccess)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwErrorcode = ::GetLastError();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ERROR_INSUFFICIENT_BUFFER == dwErrorcode)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; psidUser = ::LocalAlloc(LPTR, dwSidSize); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bSuccess = ::LookupAccountName(NULL, strUserName, psidUser, &amp;amp;dwSidSize, strReferencedDomainName, &amp;amp;dwDomainNameLen, &amp;amp;sidAccType);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; PACL pAcl = NULL;&lt;BR&gt;&amp;nbsp; DWORD cbAcl = 0;&lt;BR&gt;&amp;nbsp; cbAcl = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + GetLengthSid(psidUser);&lt;BR&gt;&amp;nbsp; pAcl = (ACL*)LocalAlloc(LPTR, cbAcl);&lt;BR&gt;&amp;nbsp; InitializeAcl(pAcl, cbAcl, ACL_REVISION);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; bSuccess = ::AddAccessAllowedAce(pAcl, ACL_REVISION_DS, GENERIC_ALL , psidUser);&lt;/P&gt;
&lt;P&gt;&amp;nbsp; //Only allow access to required users &lt;BR&gt;&amp;nbsp; SetSecurityDescriptorDacl(&amp;amp;SecurityDescriptor, TRUE, pAcl, FALSE);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; SECURITY_ATTRIBUTES secAttribMutex;&lt;BR&gt;&amp;nbsp; secAttribMutex.nLength = sizeof(SECURITY_ATTRIBUTES);&lt;BR&gt;&amp;nbsp; secAttribMutex.lpSecurityDescriptor = &amp;amp;SecurityDescriptor;&lt;BR&gt;&amp;nbsp; secAttribMutex.bInheritHandle = TRUE;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; m_hwndMutex = ::CreateMutex(&amp;amp;secAttribMutex,FALSE,"GUARD_DB_ACCESS_MUTEX");&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; return;&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=523659" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item><item><title>Spot the Bug - Jan 5, 2006</title><link>http://blogs.msdn.com/rsamona/archive/2006/01/05/509946.aspx</link><pubDate>Fri, 06 Jan 2006 06:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:509946</guid><dc:creator>rsamona</dc:creator><slash:comments>23</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/509946.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=509946</wfw:commentRss><description>&lt;p&gt;Wow, we had great feedback on the last bug. Someone emailed me and said that the biggest bug was the blue font on the black background. :)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br/&gt;&lt;br/&gt;Here is another fun bug - &lt;br/&gt;&lt;span style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;em&gt;Courtesy of Neelay Shah, Consultant, Foundstone&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;class CUserManager&lt;br/&gt;{&lt;br/&gt;public:&lt;br/&gt;&amp;nbsp; void&amp;nbsp;&amp;nbsp; CreateLogin(String * strUserName, String * strPassword);&lt;br/&gt;&amp;nbsp; void&amp;nbsp;&amp;nbsp; AddLoginToDB(String * strUserName, Byte bytePasswordHash[]);&lt;br/&gt;};&lt;br/&gt;&amp;nbsp;&lt;br/&gt;int _tmain()&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; CUserManager objUsrMgr;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; String * struser = S"newuser";&lt;br/&gt;&amp;nbsp; String * struserpass = S"password";&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; objUsrMgr.CreateLogin(struser, struserpass);&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; return 0;&lt;br/&gt;}&lt;br/&gt;&amp;nbsp;&lt;br/&gt;void CUserManager::CreateLogin(String * strUserName, String * strPassword)&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; System::Text::ASCIIEncoding *pAscii = new System::Text::ASCIIEncoding();&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; Byte bytePassword[] = pAscii-&amp;gt;GetBytes(strPassword);&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; SHA1CryptoServiceProvider *pSha1 = new SHA1CryptoServiceProvider();&lt;br/&gt;&amp;nbsp; Byte byteHash[] = pSha1-&amp;gt;ComputeHash(bytePassword);&amp;nbsp; &lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; AddLoginToDB(strUserName, byteHash);&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; return;&lt;br/&gt;}&lt;br/&gt;&amp;nbsp;&lt;br/&gt;void CUserManager::AddLoginToDB(String * strUserName, Byte bytePasswordHash [])&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; //Add the user name and the password hash to the database&lt;br/&gt;&amp;nbsp; return;&lt;br/&gt;}&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;void CUserManager::CreateLogin(String * strUserName, String * strPassword)&lt;br/&gt;{&lt;br/&gt;&amp;nbsp; System::Text::ASCIIEncoding *pAscii = new System::Text::ASCIIEncoding();&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; String * strPrependedSalt = CUserManager::GenerateRandomSalt();&lt;br/&gt;&amp;nbsp; String * strAppendedSalt&amp;nbsp; = CUserManager::GenerateRandomSalt();&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp;&amp;nbsp; //Prepend and apppend a random salt to the clear-text password so that making the dictionary attacks difficult.&lt;br/&gt;&amp;nbsp; String * strPasswordWithSalt = String::Concat(strPrependedSalt, strPassword, strAppendedSalt);&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; Byte bytePassword[] = pAscii-&amp;gt;GetBytes(strPasswordWithSalt);&lt;br/&gt;&amp;nbsp; SHA1CryptoServiceProvider *pSha1 = new SHA1CryptoServiceProvider();&lt;br/&gt;&amp;nbsp; Byte byteHash[] = pSha1-&amp;gt;ComputeHash(bytePassword);&amp;nbsp; &lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; //Add the 2 clear-text salts to the hash itself.&lt;br/&gt;&amp;nbsp; String * strHash = String::Concat(strPrependedSalt, pAscii-&amp;gt;GetString(byteHash), strAppendedSalt);&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; AddLoginToDB(strUserName, pAscii-&amp;gt;GetBytes(strHash));&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&amp;nbsp; return;&lt;br/&gt;}&lt;/p&gt;
&lt;p class=MsoNormal style="BACKGROUND: white; MARGIN: 0in 0in 0pt"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-bidi-font-family: 'Courier New'"&gt;Description:&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;The given code snippet creates a new user. It takes care as in not storing the clear text password anywhere but instead stores the SHA1 hash of the users password in the database. However, one way hash functions are deterministic in nature. Given a string, the resultant hash produced by the one way hash algorithm is always the same. Using the hash algorithms alone can expose the application to “dictionary attacks”. Suppose a malicious user of the application gets hold of the user names and the associated password hashes (may be from the log file) the user can find out if there is any user who has the same password as his or if two users have the same password! Another twist to this is, if the one way hash algorithm is well known the attacker can pre-compute the hashes of all the well known passwords offline, and then employ a brute force attack to get access to the application&lt;/span&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=509946" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item><item><title>1 inch of snow equals 100% panic!</title><link>http://blogs.msdn.com/rsamona/archive/2005/12/02/499350.aspx</link><pubDate>Fri, 02 Dec 2005 16:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:499350</guid><dc:creator>rsamona</dc:creator><slash:comments>18</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/499350.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=499350</wfw:commentRss><description>&lt;P&gt;For those of you that don't know, Seattle doesn't typically get snow.&amp;nbsp;Sure, it snows in the mountains and keeps us snowboarders and skiers happy, but the city is fairly mild. It actually snowed today in Seattle, Redmond, and surrounding cities, and people were panicking. Many left work early. Some went to buy tire chains. There was literally a dusting of snow on the ground because as soon as the big snowflakes hit the earth, they melted.&lt;/P&gt;
&lt;P&gt;Bear in mind that I spent my entire life in Michigan. A 6 inch snow storm is not considered all that bad, but to Seattleites, 1 inch of snow that instantly melts causes chaos. Yes, downtown Seattle has some steep hills, but come on people -- there is almost no snow sticking to the ground!&lt;/P&gt;
&lt;P&gt;The irony is that many left work in the early afternoon when "the blizzard" was at its worst. The weather and mass exodus of people caused the highways to get backed up early in the day. I left work during what should have been peak rush hour. The snow had stopped, there were far fewer people on the road, and I managed to get home quickly.&lt;/P&gt;
&lt;P&gt;Since I feel like bantering some more, let me talk about snow + SUV drivers. I drove&amp;nbsp;a sports car for 6 years in Michigan. Sports car + snow storm&amp;nbsp;= death trap. I vowed that when I get a 4x4, I will drive at the same speed during storms that I did when I had my sports car. The only difference would be that this time I wouldn't be as worried about doing 360s on the freeway. I have since bought a SUV to accomodate my outdoor lifestyle and more treacherous driving conditions, and&amp;nbsp;I love it.&amp;nbsp;Every winter, I see people driving SUVs and pickup trucks whip past me and other cars during a cold, snow, icy night. "I've got 4x4. I can still go 70 MPH," they&amp;nbsp;say.&amp;nbsp;Ice is the great equalizer, my friends. 4x4s do a great job of helping you accelerate more quickly in slick conditions, but they do nothing to help you slow down. At the end of the day, when an automobile is whipping down the road at 70 MPH and slams on the brakes, there are 4 pieces of rubber touching the ground. Oh yeah, and lets not forget that SUVs weigh more than cars, so assuming all other variables, such as tires and ABS, are the same, the car will stop in a shorter distance.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=499350" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Personal+Blabbering/default.aspx">Personal Blabbering</category></item><item><title>Spot the Bug - November 28, 2005</title><link>http://blogs.msdn.com/rsamona/archive/2005/11/28/497712.aspx</link><pubDate>Tue, 29 Nov 2005 05:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:497712</guid><dc:creator>rsamona</dc:creator><slash:comments>17</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/497712.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=497712</wfw:commentRss><description>&lt;P&gt;Some people commented that the last bug was too easy, and it was, but buffer overruns are still common enough that I wanted to send the point home.&amp;nbsp;This one is a bit more challenging.&lt;BR&gt;&lt;EM&gt;&lt;FONT color=#000000&gt;Courtesy of Neelay Shah, Consultant, Foundstone&lt;/FONT&gt;&lt;/EM&gt;&lt;FONT color=#0000ff size=1&gt;&lt;FONT size=3&gt;&lt;BR&gt;&lt;BR&gt;void&lt;/FONT&gt;&lt;/FONT&gt; Socket_Setup(&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WORD wVersionRequested;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WSADATA wsaData;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;wVersionRequested = MAKEWORD( 2, 2 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;::WSAStartup(wVersionRequested, &amp;amp;wsaData);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SOCKET sTCPServer = ::socket(AF_INET, SOCK_STREAM, 0);&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;/FONT&gt; sockaddr_in saTCPServAddr;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;saTCPServAddr.sin_family = AF_INET;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;saTCPServAddr.sin_addr.S_un.S_addr = ::htonl(INADDR_ANY);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;saTCPServAddr.sin_port = ::htons(5678);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; len = &lt;FONT color=#0000ff&gt;sizeof&lt;/FONT&gt;(saTCPServAddr);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&lt;/FONT&gt; iFail =::bind(sTCPServer, (&lt;FONT color=#0000ff&gt;struct&lt;/FONT&gt; sockaddr*)&amp;amp;saTCPServAddr, len);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD dwErr;&amp;nbsp;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/FONT&gt;(0 != iFail)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwErr = ::WSAGetLastError();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("\n\t Error occured.\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;return&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;iFail = ::listen(sTCPServer, 2);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;/FONT&gt; sockaddr_in saClient;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&lt;/FONT&gt; iClsize = &lt;FONT color=#0000ff&gt;sizeof&lt;/FONT&gt;(saClient);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SOCKET sClient = ::accept(sTCPServer, (&lt;FONT color=#0000ff&gt;struct&lt;/FONT&gt; sockaddr*)&amp;amp;saClient ,&amp;amp;iClsize);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&lt;/FONT&gt; strData[1024];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;::recv(sClient, strData, 1024, 0);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("\n\nRealServer--Data from client --- %s ---", strData);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;::shutdown(sTCPServer, SD_BOTH);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;::WSACleanup();&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT size=3&gt;;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=3&gt;}&lt;/FONT&gt; &lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;U&gt;&lt;STRONG&gt;Solution&lt;/STRONG&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Wow, we had a lot of great posts to this one!&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Assuming nothing was missed, here is the solution:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;void Socket_Setup(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; WORD wVersionRequested;&lt;BR&gt;&amp;nbsp; WSADATA wsaData;&lt;BR&gt;&amp;nbsp; wVersionRequested = MAKEWORD( 2, 2 );&lt;BR&gt;&amp;nbsp; ::WSAStartup(wVersionRequested, &amp;amp;wsaData);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; SOCKET sTCPServer = ::socket(AF_INET, SOCK_STREAM, 0);&lt;BR&gt;&amp;nbsp; struct sockaddr_in saTCPServAddr;&lt;BR&gt;&amp;nbsp; saTCPServAddr.sin_family = AF_INET;&lt;BR&gt;&amp;nbsp; saTCPServAddr.sin_addr.S_un.S_addr = ::htonl(INADDR_ANY);&lt;BR&gt;&amp;nbsp; saTCPServAddr.sin_port = ::htons(5678);&lt;BR&gt;&amp;nbsp; int len = sizeof(saTCPServAddr);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; //Approach 1 &lt;BR&gt;&amp;nbsp; //Enable exclusive use so that another process cannot bind to the same socket&lt;BR&gt;&amp;nbsp; //BOOL bExclusiveUse = TRUE;&lt;BR&gt;&amp;nbsp; //int iValLen = sizeof(BOOL);&lt;BR&gt;&amp;nbsp; //::setsockopt(sTCPServer, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, &lt;BR&gt;&amp;nbsp; //(char*)&amp;amp;bExclusiveUse, iValLen); &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; int iFail =::bind(sTCPServer, (struct sockaddr*)&amp;amp;saTCPServAddr, len);&lt;BR&gt;&amp;nbsp; DWORD dwErr;&lt;BR&gt;&amp;nbsp; if(0 != iFail)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwErr = ::WSAGetLastError();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("\n\t Error occured.\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; //Approach 2: &lt;BR&gt;&amp;nbsp; //Strong ACL the socket only local admin’s and local service can bind&lt;BR&gt;&amp;nbsp; //Starting Win 2003 Server SP1&lt;BR&gt;&amp;nbsp; PSECURITY_DESCRIPTOR psD = NULL;&lt;BR&gt;&amp;nbsp; if(!ConvertStringSecurityDescriptorToSecurityDescriptor(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "D:(A;;GA;;;LS)(A;;GA;;;BA)", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SECURITY_DESCRIPTOR_REVISION, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;psD, NULL)) &lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Convert Failed \n");&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; if(!SetKernelObjectSecurity(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (HANDLE)sTCPServer, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DACL_SECURITY_INFORMATION, psD))&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf ("SetKernelObjectSecurity failed %d",GetLastError());&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; iFail = ::listen(sTCPServer, 2);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; struct sockaddr_in saClient;&lt;BR&gt;&amp;nbsp; int iClsize = sizeof(saClient);&lt;BR&gt;&amp;nbsp; SOCKET sClient = ::accept(sTCPServer, (struct sockaddr*)&amp;amp;saClient ,&amp;amp;iClsize);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; char strData[1024];&lt;BR&gt;&amp;nbsp; ::recv(sClient, strData, 1024, 0);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; printf("\n\nRealServer--Data from client --- %s ---", strData);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; ::shutdown(sTCPServer, SD_BOTH);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; ::WSACleanup();&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; return;&lt;BR&gt;}&lt;SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;BR style="PAGE-BREAK-BEFORE: always; mso-break-type: section-break" clear=all&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Description:&lt;/STRONG&gt;&lt;BR&gt;Creating sockets and binding them to any interface can be tricky. This can enable a malicious attacker to write a malicious server program which binds to same port but to a specific port which results in the malicious server getting the client connections along with their data. This is referred as “socket hijacking”. One approach is to strong ACL the socket (starting Win 2003 server and above). The above example shows the socket to be strong ACLed to allow only the local administrators and the Local Service account.&amp;nbsp; Another approach is to set the “SO_EXCLUSIVEADDRUSE” socket option which disallows another process to bind to the same port on all available interfaces. &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=497712" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item><item><title>Spot the Bug - October 24, 2005</title><link>http://blogs.msdn.com/rsamona/archive/2005/10/24/484449.aspx</link><pubDate>Tue, 25 Oct 2005 06:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:484449</guid><dc:creator>rsamona</dc:creator><slash:comments>14</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/484449.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=484449</wfw:commentRss><description>&lt;P&gt;It has been a while since the last bug was up. We certainly had some great discussion around it. I will try to get more bugs up on the site on a regular basis to keep everyone on their toes at all times :-)&lt;BR&gt;&lt;EM&gt;Courtesy of &lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;Neelay Shah, Consultant (Foundstone)&lt;BR&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;BR&gt;#define MAX_STR_LEN&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;255&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;char strUserInput[MAX_STR_LEN+1];&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;scanf(“%s”, &amp;amp;strUserInput);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;U&gt;&lt;STRONG&gt;Solution&lt;/STRONG&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;#define MAX_STR_LEN&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;255&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;char strUserInput[MAX_STRING_LEN+1];&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;fgets(strUserInput,MAX_STR_LEN+1,stdin);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Arial"&gt;Everyone figured out that in the bad way of programming the ‘scanf()’ function is used to read the user input from the console. Now, scanf() does not check for the length of the input string and if a malicious user enters a string longer than the maximum length it will lead to overwriting the memory following ‘strUserInput’.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; There is more than one good way to fix this. &lt;/SPAN&gt;In our solution, we use the ‘fgets()’ function to read the user input and using which you can control the maximum length of the user input. This is a case of buffer overflow and perhaps easy but I added it because I think it is still very prevalent. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=484449" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item><item><title>Spot the Bug - August 31, 2005</title><link>http://blogs.msdn.com/rsamona/archive/2005/08/31/458815.aspx</link><pubDate>Thu, 01 Sep 2005 04:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:458815</guid><dc:creator>rsamona</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/458815.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=458815</wfw:commentRss><description>&lt;P&gt;It's been a little while since we've had a new bug up. We had some good feedback on the last one. Here is a shorter one:&lt;BR&gt;&lt;EM&gt;Courtesy of Shanit Gupta, Consultant (Foundstone)&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ElevatePrivilege();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadSecretFile();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LowerPrivilege();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch(FileException fe)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReportException();&lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;&lt;STRONG&gt;&lt;U&gt;Suggested Implementation:&lt;/U&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face="Times New Roman" size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face="Times New Roman" size=3&gt;&amp;nbsp; &lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ElevatePrivilege();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadSecretFile();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch(FileException fe)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReportFileException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch(Exception e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReportException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;finally()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LowerPrivilege();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AllDone();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face="Times New Roman" size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;&lt;STRONG&gt;Description:&lt;/STRONG&gt; In the error prone code there is no way for the application to lower privileges if there is any exception in “ReadSecretFile” function. But in the suggested code, the finally block will execute irrespective of whether exception occurs or not and hence the privileges will be lowered once the secret file is read. &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=458815" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item><item><title>Spot the Bug - August 16, 2005</title><link>http://blogs.msdn.com/rsamona/archive/2005/08/16/452463.aspx</link><pubDate>Wed, 17 Aug 2005 05:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:452463</guid><dc:creator>rsamona</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/452463.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=452463</wfw:commentRss><description>&lt;P&gt;If you haven't taken a look at the solution to the last bug, please do so. There were 4 bugs in that short chink of code -- all of which are found in Visual Studio 2005! One is issued as a compiler warning and the other 3 are found by PREfast.&lt;/P&gt;
&lt;P&gt;Here is the next "Spot the Bug." This one is certainly more lengthy and complex than the last. There were some typos in the original post which were fixed.&lt;BR&gt;&lt;EM&gt;Courtesy of Shanit Gupta, Consultant (Foundstone)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;private void TransferFunds () &lt;BR&gt;{&lt;BR&gt;... &lt;BR&gt;&amp;nbsp;if (fromaccount.balance&amp;nbsp; &amp;gt; amount) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;fromaccount.balance -= amount;&lt;BR&gt;&amp;nbsp;&amp;nbsp;toaccount.balance += amount;&amp;nbsp;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;...&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;private void RetrieveAccountInfo (int payer, int payee) &lt;BR&gt;{&lt;BR&gt;...&lt;BR&gt;...&lt;BR&gt;...&lt;BR&gt;fromAccount = RetrieveFundInfo(myConnection, payer);&lt;BR&gt;toAccount = RetrieveFundInfo(myConnection, payee); &lt;BR&gt;TransferFunds();&lt;BR&gt;CommitChanges (fromAccount.number, fromAccount.balance);&lt;BR&gt;CommitChanges (toAccount.number, toAccount.balance); &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;private int RetrieveFundInfo (SqlConnection myConnection, int accountNumber) &lt;BR&gt;{&lt;BR&gt;&amp;nbsp;string mySelectQuery = "SELECT balance FROM Customers where accountnumber = " + “’” + accountNumber + “’”;&lt;BR&gt;&amp;nbsp;SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);&lt;BR&gt;&amp;nbsp;SqlDataReader myReader = myCommand.ExecuteReader();&lt;BR&gt;&amp;nbsp;return myReader.GetInt32(0); &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;private void CommitChanges (int accountNumber, int balance); &lt;BR&gt;{&lt;BR&gt;&amp;nbsp;string mySelectQuery = "UPDATE Customers Set Balance = “ + “’” + balance + “’”&amp;nbsp; + “where AccountNumber = " + “’” + accountNumber + “’”;&lt;BR&gt;&amp;nbsp;SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);&lt;BR&gt;&amp;nbsp;myCommand.ExecuteNonQuery();&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Suggested Implementation:&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;private void TransferFunds () &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;.. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if (fromaccount.balance&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&amp;gt; amount) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;fromaccount.balance -= amount;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;toaccount.balance += amount;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;private void RetrieveAccountInfo (int payer, int payee) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;SqlTransaction myTrans;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;myTrans = myConnection.BeginTransaction("SampleTransaction");&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;try&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;fromAccount = RetrieveFundInfo(myConnection, payer);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;toAccount = RetrieveFundInfo(myConnection, payee); &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;TransferFunds();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;CommitChanges (fromAccount.number, fromAccount.balance);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;CommitChanges (toAccount.number, toAccount.balance);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;myTrans.Commit();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;catch(Exception e)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;try&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;myTrans.Rollback("SampleTransaction");&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;catch (SqlException ex)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if (myTrans.Connection != null)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Console.WriteLine("An exception of type " + ex.GetType() +&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;" was encountered while attempting to roll back the transaction.");&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Console.WriteLine("An exception of type " + e.GetType() +&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;" was encountered while inserting the data.");&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Console.WriteLine("Neither record was written to database.");&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;finally &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;myConnection.Close();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;private int RetrieveFundInfo (SqlConnection myConnection, int accountNumber) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;string mySelectQuery = "SELECT balance FROM Customers where accountnumber = " + “’” + accountNumber + “’”;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;SqlDataReader myReader = myCommand.ExecuteReader();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Return myReader.GetInt32(0); &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;private void CommitChanges (int accountNumber, int balance); &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;string mySelectQuery = "UPDATE Customers Set Balance = “ + “’” + balance + “’”&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;+ “where AccountNumber = " + “’” + accountNumber + “’”;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;myCommand.ExecuteNonQuery();&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Description:&lt;/B&gt; Race conditions happen in a multi-threaded (process) environment where there is a window of vulnerability for state corruption and compromise. The condition occurs owing to the fact that the information read is different from information processed, which leaves the state inconsistent or incorrect. One way to avoid this possibility is by gaining exclusive locks on the rows that are being read and updated. The suggested code uses “SqlTransaction myTrans” which locks the rows for isolation property of the transaction.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=452463" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item><item><title>Spot the Bug - August 14, 2005</title><link>http://blogs.msdn.com/rsamona/archive/2005/08/14/451670.aspx</link><pubDate>Mon, 15 Aug 2005 09:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:451670</guid><dc:creator>rsamona</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/451670.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=451670</wfw:commentRss><description>&lt;P&gt;I created this bug a&amp;nbsp;couple of weeks ago for a conference I spoke at to illustrate how so few lines of code could be so buggy. Where's the bug here?&lt;/P&gt;
&lt;P&gt;char dest[50], src[100];&lt;BR&gt;int x, y;&lt;/P&gt;
&lt;P&gt;if (x=1) &lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp; strcpy(dest,src);&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; dest[50] = '\0';&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;return y;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;Solution:&lt;BR&gt;&lt;/STRONG&gt;Alright, so I admit it -- this chunk of code is a bit nonsensical. But I will say that people do make these mistakes all the time, but probably not all at the same time. :)&lt;/P&gt;
&lt;P&gt;This code has 4 security defects:&lt;BR&gt;1. The if statement with "=" instead of "==". Many of you would argue that this is of a quality issue than a security issue, and you'd be right. But security is certainly a subset of quality, and this can cause the code to do things that it shouldn't do.&lt;BR&gt;2. In strcpy, src is larger than dest, causing a buffer overrun.&lt;BR&gt;3. Arrays start at 0, not 1! Therefore,&amp;nbsp;we are writing&amp;nbsp;past the last allocated spot on the array.&lt;BR&gt;4.&amp;nbsp;The variable y is not initialized.&lt;/P&gt;
&lt;P&gt;Now that&amp;nbsp;you've heard the bad news about all that's wrong with this code, it's time for some good news.&amp;nbsp;I bet you didn't know that Visual Studio 2005&amp;nbsp;catches &lt;STRONG&gt;&lt;U&gt;all&lt;/U&gt;&lt;/STRONG&gt; of these problems! Strcpy is caught by the compiler and noted as a warning. We've created safe versions of these libraries in Visual Studio 2005 called Safe CRT libraries. PREfast catches the other 3 bugs -- even the "=" error. With these tools and proper education, we hope to get developers all over the world wrting more secure code!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=451670" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item><item><title>Spot the Bug - August 4, 2005</title><link>http://blogs.msdn.com/rsamona/archive/2005/08/04/447904.aspx</link><pubDate>Fri, 05 Aug 2005 02:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:447904</guid><dc:creator>rsamona</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/447904.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=447904</wfw:commentRss><description>&lt;P&gt;I think the last bug stumped a few people. Can you find the security vulnerability in this one?&lt;BR&gt;&lt;EM&gt;Courtesy of Neelay Shah, Consultant, Foundstone&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;#define STD_HASH_LEN&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;11&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;#define MAX_HASH_LEN 31&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;char * strPassHash = (char*)malloc(sizeof(char)*STD_HASH_LEN); &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;//Create the hash&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;// Now suppose you need to recreate the hash which would be of length = MAX_HASH_LEN&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;strPassHash = (char*)realloc(strPassHash, MAX_HASH_LEN);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;STRONG&gt;&lt;U&gt;Solution&lt;/U&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;#define STD_HASH_LEN&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;11&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;#define MAX_HASH_LEN 31&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;char * strPassHash = (char*)malloc(sizeof(char)*STD_HASH_LEN); &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;//Create the hash&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;// Now suppose you need to recreate the hash which would be of length = //MAX_HASH_LEN&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;char * strNewPassHash = (char*)realloc(strPassHash, MAX_HASH_LEN);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;if(NULL == strNewPassHash)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;// Not enough free memory…free the old hash and return an error.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;free(StrPassHash); &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;printf(“Error…Not enough free memory”);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;return;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;strPassHash = strNewPassHash;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Arial"&gt;Description:&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Arial"&gt;In the bad way, if realloc() fails for want of memory it returns a NULL and the pointer to the old memory is lost. Now in normal cases this memory leak may not be a security threat but in case the memory is shared and its contents are sensitive like a password hash for example it may lead to a security threat. The good way of programming gets around this by using an extra pointer.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=447904" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item><item><title>Spot the Bug - July 27, 2005</title><link>http://blogs.msdn.com/rsamona/archive/2005/07/27/444248.aspx</link><pubDate>Thu, 28 Jul 2005 09:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:444248</guid><dc:creator>rsamona</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/444248.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=444248</wfw:commentRss><description>&lt;FONT face="Courier New" size=2&gt;&lt;/FONT&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;Alright all, here is the next bug. This one is courtesy of Mike Howard.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;__&lt;FONT face="Courier New" color=blue size=2&gt;declspec&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;(&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;noinline&lt;/SPAN&gt;&lt;/FONT&gt;) &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;* AllocBlocks(size_t cBlocks) {&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;&lt;SPAN style="COLOR: green"&gt;// allocating no blocks is an error&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;&lt;/FONT&gt; (cBlocks == 0)&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;/FONT&gt; NULL;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;&lt;SPAN style="COLOR: green"&gt;// Allocate enough memory&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;&lt;SPAN style="COLOR: green"&gt;// Upcast the result to a 64-bit integer&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;&lt;SPAN style="COLOR: green"&gt;// and then check result against 32-bit UINT_MAX&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=green&gt;&lt;SPAN style="COLOR: green"&gt;// this makes sure there's no integer overflow&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONGLONG alloc = cBlocks * 16;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt;&lt;/FONT&gt; (alloc &amp;lt; UINT_MAX) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;? malloc(cBlocks * 16)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;: NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;STRONG&gt;&lt;U&gt;Solution&lt;/U&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;We did not have a lot of activity around this bug. This one was tough.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;The problem is that the int overflow check doesn’t work…&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM: 12pt; MARGIN-LEFT: 0in; LINE-HEIGHT: 18pt; MARGIN-RIGHT: 0in; mso-margin-top-alt: 6.0pt"&gt;&lt;FONT face="Courier New" color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;__declspec&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;(&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Verdana"&gt;noinline&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;) &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Verdana"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;* AllocBlocks(size_t cBlocks) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM: 12pt; MARGIN-LEFT: 0in; LINE-HEIGHT: 18pt; MARGIN-RIGHT: 0in; mso-margin-top-alt: 6.0pt"&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=green size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Verdana"&gt;// allocating no blocks is an error&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Verdana"&gt;if&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt; (cBlocks == 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Verdana"&gt;return&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt; NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM: 12pt; MARGIN-LEFT: 0in; LINE-HEIGHT: 18pt; MARGIN-RIGHT: 0in; mso-margin-top-alt: 6.0pt"&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=green size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Verdana"&gt;// Allocate enough memory&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=green size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Verdana"&gt;// Upcast the result to a 64-bit integer&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=green size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Verdana"&gt;// and then check result against 32-bit UINT_MAX&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=green size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Verdana"&gt;// this makes sure there's no integer overflow&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM: 12pt; MARGIN-LEFT: 0in; LINE-HEIGHT: 18pt; MARGIN-RIGHT: 0in; mso-margin-top-alt: 6.0pt"&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONGLONG alloc = cBlocks * 16;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Verdana"&gt;return&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt; (alloc &amp;lt; UINT_MAX) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM: 12pt; MARGIN-LEFT: 0in; LINE-HEIGHT: 18pt; MARGIN-RIGHT: 0in; mso-margin-top-alt: 6.0pt"&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;? malloc(cBlocks * 16)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM: 12pt; MARGIN-LEFT: 0in; LINE-HEIGHT: 18pt; MARGIN-RIGHT: 0in; mso-margin-top-alt: 6.0pt"&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT color=black&gt;&lt;SPAN style="COLOR: black"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;These lines are all wrong&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-BOTTOM: 12pt; MARGIN-LEFT: 0in; LINE-HEIGHT: 18pt; MARGIN-RIGHT: 0in; mso-margin-top-alt: 6.0pt"&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONGLONG alloc = cBlocks * 16;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Verdana color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Verdana"&gt;return&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt; (alloc &amp;lt; UINT_MAX) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;cBlocks * 16 is a 32-bit multiply, so the multiply always yields a 32-bit value. Then that result is assigned to a ULONGLONG, but the result is always less than UINT_MAX, because the calculation may have already overflowed. Fix is:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=black size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONGLONG alloc = (ULONGLONG)cBlocks * 16;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=444248" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item><item><title>Escape Yesterworld - funny!</title><link>http://blogs.msdn.com/rsamona/archive/2005/07/26/443631.aspx</link><pubDate>Wed, 27 Jul 2005 02:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:443631</guid><dc:creator>rsamona</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/443631.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=443631</wfw:commentRss><description>&lt;P&gt;If you have a few minutes, check this out. It is hilarious!!!&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.escapeYESTERWORLD.com"&gt;www.escapeYESTERWORLD.com&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=443631" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Personal+Blabbering/default.aspx">Personal Blabbering</category></item><item><title>Spot the Bug - July 23, 2005</title><link>http://blogs.msdn.com/rsamona/archive/2005/07/23/442499.aspx</link><pubDate>Sat, 23 Jul 2005 22:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:442499</guid><dc:creator>rsamona</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/rsamona/comments/442499.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rsamona/commentrss.aspx?PostID=442499</wfw:commentRss><description>&lt;P&gt;The first bug was just a warm-up and people were asking for a more difficult bug. What's wrong with this chunk of code, and better yet, how do you fix it?&lt;BR&gt;&lt;EM&gt;Courtesy of Shanit Gupta, Consultant, Foundstone&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;private HttpCookie SessionIdentifier () &lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpCookie myCookie = new HttpCookie("SessionId");&lt;BR&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Random objRand = new Random (DateTime.Now.Millisecond);&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;myCookie.Value(“SessionId”) = random(objRand.Next()) ;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return myCookie;&lt;BR&gt;&lt;/STRONG&gt;&lt;STRONG&gt;}&lt;/STRONG&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Solution:&lt;BR&gt;&lt;BR&gt;&lt;/U&gt;&lt;/STRONG&gt;There was a good chat around this one. Here's one good way to implement it:&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;byte[] randomCharacters = new Byte[64];&lt;BR&gt;&lt;BR&gt;//RNGCryptoServiceProvider is an implementation of a random number generator.&lt;BR&gt;&lt;BR&gt;RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;private HttpCookie SessionIdentifier (RNGCryptoServiceProvider cryptoRNG) &lt;BR&gt;{&lt;BR&gt;&amp;nbsp;HttpCookie myCookie = new HttpCookie("SessionId")&lt;BR&gt;&amp;nbsp;crptoRNG.GetBytes(randomCharacters); // The array is now filled with cryptographically strong random bytes.&lt;BR&gt;&amp;nbsp;myCookie.Value(“SessionId”) = randomCharacters.toString();&amp;nbsp; return myCookie; &lt;BR&gt;}&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Description: Many developers think that a function/class such as “random” or likes is capable of generating random numbers that are not predictable. Some of them go on to believe that that time in seconds or even milliseconds can server as a good random number or at least a good seed for the random number. Further the deterministic nature of computers makes it extremely simple to calculate the seed of PRNG and the following pseudo random numbers provided a good sample of inputs are available. We recommend the use of cryptographically secure PRNGs which do not generate the same set of random numbers even when seeded with the same string. More information can be found &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecuritycryptographyrngcryptoserviceproviderclasstopic.asp"&gt;here&lt;/A&gt;.&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=442499" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rsamona/archive/tags/Bug+Squashed/default.aspx">Bug Squashed</category></item></channel></rss>