1. 程式人生 > >gsoap一處bug引起的崩潰分析

gsoap一處bug引起的崩潰分析

近日,現場有人反映,平臺某伺服器出現一次崩潰,不過由於看門狗的存在,又自動重啟了,聽到此訊息也比較詫異,因為這臺伺服器已經執行兩三個月了,突然崩潰一次,而後面再怎麼操作又沒問題了,想必是個極難出現的bug,跟現場確認沒有進行過什麼特殊操作,且沒有安裝解除安裝任何程式後,就讓現場把dmp檔案發回來,進行仔細分析。

Dmp檔案很大,約1.54個G,這個我還是比較樂意看到的,因為dump檔案越大,說明包含的資訊越多,越便於分析。

開啟windbg,設定好符號路徑後,輸入!analyze –v 進行分析,稍等片刻,windbg便給出了初步的分析結果。

從圖中可以看出很多資訊,崩潰原因還是一如既往的0xc000005 訪問違例,崩潰的行數為70c7f8d    mov eax,dword ptr [eax+10h] 這行,把eax+10指向的四位元組記憶體讀取到eax中,那最大的可能就是eax的值有問題了,用.ecxr切換至異常所在上下文,然後輸入r檢視暫存器:

果然,eax==0,那麼就來看看這個值為什麼為0吧。

輸入ub . 和u .,把當前執行的程式碼前後幾行反彙編出來,看下eax這個值是從哪來的

可以看出,eax的值是由70c07f7d   mov eax,dword ptr [esi+2fb8h]賦值的,因此再去找找esi這個值是怎麼來的,接著往上看,使用uf .把當前函式整個反彙編。

可以看到,esi的值來自70c07f61    mov esi,dword ptr [esp+8]這行程式碼,esp+8的值是函式的第一個引數,因此再去堆疊裡找下這個引數的值,輸入kb,檢視下呼叫棧:

可以肯定esi的值即函式的第一個引數值,為03bea830,接下來找出這個引數是什麼型別的,就可以解析出這個引數的值了。可以使用ln命令,查詢當前呼叫函式的宣告,從圖中可以看出,第一個引數型別為soap

那麼使用dt 檢視下這個soap結構體,找到其偏移0x2FB8處的值,就知道eax為什麼為0了。

看到其偏移0x2fb8處,soap的成員變數為fault,其值的確為NULL。

梳理下崩潰的流程,首先取了soap偏移0x2fb8處的成員變數fault,這個變數也是個指標,不過其值為NULL,因此當取其偏移0x10

處的值時,即執行到70c7f8d    mov eax,dword ptr [eax+10h] 時,產生了訪問違例。

Gsoap是一個常見的生成webservice的開源工具,我找來它的程式碼,找到soap_set_receiver_error這個函式,我們所使用的是2.7.13版本,程式碼如下

#ifndef PALM_2
SOAP_FMAC1
int
SOAP_FMAC2
soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetailXML, int soaperror)
{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", NULL, faultstring, faultdetailXML, soaperror);
}
#endif
#ifndef PALM_2
static int
soap_set_error(struct soap *soap, const char *faultcode, const char *faultsubcodeQName, const char *faultstring, const char *faultdetailXML, int soaperror)
{ *soap_faultcode(soap) = faultcode;
  if (faultsubcodeQName)
    *soap_faultsubcode(soap) = faultsubcodeQName;
  *soap_faultstring(soap) = faultstring;
  if (faultdetailXML && *faultdetailXML)
  { register const char **s = soap_faultdetail(soap);
    if (s)
      *s = faultdetailXML;
  }
  return soap->error = soaperror;
}
#endif
SOAP_FMAC3 const char ** SOAP_FMAC4 soap_faultcode(struct soap *soap)
{
	soap_fault(soap);
	if (soap->version == 2)
		return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value;
	return (const char**)&soap->fault->faultcode;
}
SOAP_FMAC3 void SOAP_FMAC4 soap_fault(struct soap *soap)
{
	if (!soap->fault)
	{	soap->fault = soap_new_SOAP_ENV__Fault(soap, -1);
		if (!soap->fault)
			return;
		soap_default_SOAP_ENV__Fault(soap, soap->fault);
	}
	if (soap->version == 2 && !soap->fault->SOAP_ENV__Code)
	{	soap->fault->SOAP_ENV__Code = soap_new_SOAP_ENV__Code(soap, -1);
		soap_default_SOAP_ENV__Code(soap, soap->fault->SOAP_ENV__Code);
	}
	if (soap->version == 2 && !soap->fault->SOAP_ENV__Reason)
	{	soap->fault->SOAP_ENV__Reason = soap_new_SOAP_ENV__Reason(soap, -1);
		soap_default_SOAP_ENV__Reason(soap, soap->fault->SOAP_ENV__Reason);
	}
}

看到fault這個變量了,看下其偏移0x10處的變數為哪個:

為SOAP_ENV_Code 就是說

return (const char**)&soap->fault->SOAP_ENV__Code->SOAP_ENV__Value;

這行程式碼產生了異常,soap_fault裡面new了一個fault,可是後來使用的時候,並未判斷fault這塊記憶體是否建立成功,就取其偏移,因此產生了崩潰。

這算gsoap的一個bug嗎?

相關推薦

gsoapbug引起崩潰分析

近日,現場有人反映,平臺某伺服器出現一次崩潰,不過由於看門狗的存在,又自動重啟了,聽到此訊息也比較詫異,因為這臺伺服器已經執行兩三個月了,突然崩潰一次,而後面再怎麼操作又沒問題了,想必是個極難出現的bug,跟現場確認沒有進行過什麼特殊操作,且沒有安裝解除安裝任何程式後,就讓

CSDN下載上傳資源頁面發現的BUG

提前說明該BUG沒啥破壞性,偶然發現記錄一下,就是在你點選提交按鈕開始上傳資源的過程中,正常情況下提交按鈕是灰色不可點選的,但是如果你將滑鼠點到資源描述框中,按Ctrl+A全選的快捷鍵就會發現提交按鈕又

修正Percona Monitoring Plugins for Zabbix的腳本Bug

con -m 更改 top tor zabb 新的 running 問題 今天小試了一把Percona Monitoring Plugins for Zabbix模板,自己辛辛苦苦寫的那一大堆Python腳本,貌似用這個模板全都覆蓋到了。 但是,我也發現最新的版本perco

記錄次 .Net 框架 Bug 發現和提交過程:SmtpClient程式碼編寫錯誤導致非同步傳送郵件時DeliveryFormat配置項無法正確工作

問題已經發到了開發者社群 developercommunity.visualstudio.com/content/pro… 涉及到的Github倉庫: github.com/xiangyuecn/… .Net開發者社群富文字編輯器太難用了,還是簡書的編輯器好用,然後掘金的版面好看,最後還是喜歡cnb

修正Percona Monitoring Plugins for Zabbix的指令碼Bug

今天小試了一把Percona Monitoring Plugins for Zabbix模板,自己辛辛苦苦寫的那一大堆Python指令碼,貌似用這個模板全都覆蓋到了。但是,我也發現最新的版本percona-monitoring-plugins_1.1.8也還是存在一個問題,那就是用於Mysql Replica

bug 誤匯入com.sun.org.apache.xpath.internal.operations.String 引起

在學習rabbit時,列印生產者匯入的資訊時,報錯:   Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [java.lang.St

Spring Boot + Spring Security 防止使用者在多同時登入(一個使用者同時只能登入次)及原始碼分析

網上很多文章的實現方法寫得比較複雜 這裡介紹一個簡單的方法。 實現 @Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfig

v8-4.8版本的崩潰

測試js在最下面。 原因是ParseFunctionDeclaration裡會建立一個 SloppyBlockFunctionStatement* delegate放到scope_->DeclarationScope()->sloppy_block_functi

可能由_wordcopy_fwd_dest_aligned 引起記憶體出錯

 ==28356== Thread 9: 1481 ==28356== Invalid read of size 8 1482 ==28356== at 0x3328A7BA95: _wordcopy_fwd_dest_aligned (in /lib64/libc

指標引起崩潰分析

指標引起的崩潰問題,常見的原因如下: 指標未判空 勞資還沒幹貨呢,你就讓勞資幹活了。 這種情況實際專案當中是非常多的,即使你用了智慧指標,也還是無法避免。當工程很龐大複雜而且一個類都有可能多個人負責的時候,那麼這個指標的訪問堆疊確實千變萬化,你無法確定

windowsclient崩潰分析和調試

而在 ros lag this指向 eas 位置 call 即使 多個實例 本文介紹windows上崩潰分析的一些手段,順便提多進程調試、死鎖等。 1.崩潰分析過程 1.1 確認錯誤碼 不管是用windbg還是用vs。首先應該註意的是錯誤碼,而90%以上的崩潰都是非法

折騰筆記:Android內嵌html5加入原生微信分享的解決的方法

產品 rac 移動開發 sap card 整理 方法 gravity 首頁 有一段時間沒有瞎折騰了。這周一剛上班萌主過來反映說:微信裏面打開聚客寶。分享功能是能夠的(這裏是用微信自身的js-sdk實現的)。可是在android應用裏面打開點擊就沒反應了;接下來狡猾的

深入了解View()—— measure測量流程分析

sans asc res markdown pla 轉換成 高亮 trac 體驗 歡迎使用Markdown編輯器寫博客 本Markdown編輯器使用StackEdit改動而來,用它寫博客。將會帶來全新的體驗哦: Markdown和擴展Markdow

次VS Code崩潰的解決(Win10掃描自動回復系統文件)

jpg 所有 dwr 查看系統 查看 表示 reg 存在 信息 早上修改Vue.js框架搭建的項目,正高興著,突然電腦崩潰,重啟後VS code打不開,報錯如下: DWrite.dll丟失 然後查看了一下 C:\windows\system32\下 DWrite.dl

打造款虛擬幣交易分析軟件

wire pyqt lan asc post請求 不能 baidu 手機流量 article   由於各大虛擬幣交易平臺更多地顯示自己平臺上的虛擬幣交易信息,如果想同時看不同平臺上的虛擬幣交易情況時,就要打開很多頁面而且需要不停地切換頁面,操作非常不方便,於是就想著做一款工

街角劍光河流成形即便是融天境沁各種琳瑯

xxd cfb bsh bcb gmv dea cde drp dad 至各引式火水兒著任問型類大強結就料裝下上書品領區法後太海成年如代外七便眼片權快格數容展先入適兒眾事查種成處交進局心個需到直立 http://baobao.baidu.com/article/b475ce

工作小記——賬通平臺設計分析及結果

bsp from 搭建 blog 結構 當前 多次調用 延遲 原本 公司業務各方面展開,要新上多個平臺。需要不同域名的多個平臺可以共享登陸狀態。準確得說,就是需要一賬通平臺 現狀:海銀會(非標固收)與海銀財富(公募基金)兩個數據庫、海銀會平臺一套系統 1.單點登錄實現方案。

《機器學習實戰》第7章的代碼錯誤

traceback com post cond 解決 elm back document image --------------------------------------------------------------------------- IndexError

條SQL引起的MySQL主從復制報錯1205

MySQL主從復制 Error_code: 1205 鎖表 SQL優化 大家都知道DBA就像是消(背)防(鍋)員(俠),因為前端應用還有開發上線的新版本都會影響到位於最底層的數據庫,前方稍微有些風吹草動,就能反應在數據庫的性能上。但是有的時候SQL不僅能決定數據庫的性能,還能決定數據庫的生死,

節電池引起的恐慌

一節電池引起的恐慌  前幾年,單位為我們配備了電腦,高大上的還把鍵盤鼠標換成了無線的了。當時還比較少見,覺得使用比較方便,炫耀了很長時間,更主要的是覺得領導比較重視我們的工作。虛榮心達到了高潮。   前天晚上,正常的進行著加班工作,趕著手中的活。突然出問題了。  輸入文字沒反映,刪除,回車,各種鍵盤鍵盤操作