History

Merge pull request #227 from mstorsjo/snprintf-fixes

Fix handling of snprintf return values and buffer size calculations

volvet committed 12 years ago

Commit cbe650a2 parents 4d22d91 076b1113 files · +81 −57Browse files

Unified · Split

3 files
  1. codec/decoder/plus/src/welsDecoderExt.cpp +33 −17
  2. codec/encoder/core/src/slice_multi_threading.cpp +6 −14
  3. codec/encoder/plus/src/welsEncoderExt.cpp +42 −26
codec/decoder/plus/src/welsDecoderExt.cpp+33−17
@@ -90,10 +90,12 @@ CWelsDecoder::CWelsDecoder (void_t) · 89 unmodified lines
9090 str_t chFileName[1024] = { 0 }; //for .264
9191 int iBufUsed = 0;
9292 int iBufLeft = 1023;
93+ int iCurUsed;
9394
9495 str_t chFileNameSize[1024] = { 0 }; //for .len
9596 int iBufUsedSize = 0;
9697 int iBufLeftSize = 1023;
98+ int iCurUsedSize;
9799 #endif//OUTPUT_BIT_STREAM
98100
99101 m_pTrace = CreateWelsTrace (Wels_Trace_Type);
@@ -106,30 +108,44 @@ CWelsDecoder::CWelsDecoder (void_t) · 6 unmodified lines
106108
107109 WelsGetTimeOfDay (&sCurTime);
108110
109− iBufUsed += WelsSnprintf (chFileName, iBufLeft, "bs_0x%p_", (void_t*)this);
110− iBufUsedSize += WelsSnprintf (chFileNameSize, iBufLeftSize, "size_0x%p_", (void_t*)this);
111+ iCurUsed = WelsSnprintf (chFileName, iBufLeft, "bs_0x%p_", (void_t*)this);
112+ iCurUsedSize = WelsSnprintf (chFileNameSize, iBufLeftSize, "size_0x%p_", (void_t*)this);
111113
112− iBufLeft -= iBufUsed;
113− if (iBufLeft > iBufUsed) {
114− iBufUsed += WelsStrftime (&chFileName[iBufUsed], iBufLeft, "%y%m%d%H%M%S", &sCurTime);
115− iBufLeft -= iBufUsed;
114+ if (iCurUsed > 0) {
115+ iBufUsed += iCurUsed;
116+ iBufLeft -= iCurUsed;
117+ }
118+ if (iBufLeft > 0) {
119+ iCurUsed = WelsStrftime (&chFileName[iBufUsed], iBufLeft, "%y%m%d%H%M%S", &sCurTime);
120+ iBufUsed += iCurUsed;
121+ iBufLeft -= iCurUsed;
116122 }
117123
118− iBufLeftSize -= iBufUsedSize;
119− if (iBufLeftSize > iBufUsedSize) {
120− iBufUsedSize += WelsStrftime (&chFileNameSize[iBufUsedSize], iBufLeftSize, "%y%m%d%H%M%S", &sCurTime);
121− iBufLeftSize -= iBufUsedSize;
124+ if (iCurUsedSize > 0) {
125+ iBufUsedSize += iCurUsedSize;
126+ iBufLeftSize -= iCurUsedSize;
127+ }
128+ if (iBufLeftSize > 0) {
129+ iCurUsedSize = WelsStrftime (&chFileNameSize[iBufUsedSize], iBufLeftSize, "%y%m%d%H%M%S", &sCurTime);
130+ iBufUsedSize += iCurUsedSize;
131+ iBufLeftSize -= iCurUsedSize;
122132 }
123133
124− if (iBufLeft > iBufUsed) {
125− iBufUsed += WelsSnprintf (&chFileName[iBufUsed], iBufLeft, ".%03.3u.264", WelsGetMillsecond (&sCurTime));
126− iBufLeft -= iBufUsed;
134+ if (iBufLeft > 0) {
135+ iCurUsed = WelsSnprintf (&chFileName[iBufUsed], iBufLeft, ".%03.3u.264", WelsGetMillsecond (&sCurTime));
136+ if (iCurUsed > 0) {
137+ iBufUsed += iCurUsed;
138+ iBufLeft -= iCurUsed;
139+ }
127140 }
128141
129− if (iBufLeftSize > iBufUsedSize) {
130− iBufUsedSize += WelsSnprintf (&chFileNameSize[iBufUsedSize], iBufLeftSize, ".%03.3u.len",
131− WelsGetMillsecond (&sCurTime));
132− iBufLeftSize -= iBufUsedSize;
142+ if (iBufLeftSize > 0) {
143+ iCurUsedSize = WelsSnprintf (&chFileNameSize[iBufUsedSize], iBufLeftSize, ".%03.3u.len",
144+ WelsGetMillsecond (&sCurTime));
145+ if (iCurUsedSize > 0) {
146+ iBufUsedSize += iCurUsedSize;
147+ iBufLeftSize -= iCurUsedSize;
148+ }
133149 }
134150
135151
codec/encoder/core/src/slice_multi_threading.cpp+6−14
@@ -443,7 +443,6 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 442 unmodified lines
443443 while (iIdx < iThreadNum) {
444444 #if defined(__GNUC__) && !defined(_WIN32) // for posix threading
445445 str_t name[SEM_NAME_MAX] = {0};
446− int32_t used_len = 0;
447446 WELS_THREAD_ERROR_CODE err = 0;
448447 #endif//__GNUC__
449448 pSmt->pThreadPEncCtx[iIdx].pWelsPEncCtx = (void*) (*ppCtx);
@@ -462,8 +461,7 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 12 unmodified lines
462461 #if defined(ENABLE_TRACE_MT)
463462 WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pUpdateMbListEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno);
464463 #endif
465− used_len = SNPRINTF (name, SEM_NAME_MAX, "fu%d%p", iIdx, (void*) (*ppCtx));
466− name[used_len] = '\0';
464+ SNPRINTF (name, SEM_NAME_MAX, "fu%d%p", iIdx, (void*) (*ppCtx));
467465 err = WelsEventOpen (&pSmt->pFinUpdateMbListEvent[iIdx], name);
468466 #if defined(ENABLE_TRACE_MT)
469467 WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pFinUpdateMbListEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno);
@@ -477,14 +475,12 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 7 unmodified lines
477475 WelsEventInit (&pSmt->pFinSliceCodingEvent[iIdx]);
478476 WelsEventInit (&pSmt->pExitEncodeEvent[iIdx]);
479477 #else
480− used_len = SNPRINTF (name, SEM_NAME_MAX, "sc%d%p", iIdx, (void*) (*ppCtx));
481− name[used_len] = '\0';
478+ SNPRINTF (name, SEM_NAME_MAX, "sc%d%p", iIdx, (void*) (*ppCtx));
482479 err = WelsEventOpen (&pSmt->pSliceCodedEvent[iIdx], name);
483480 #if defined(ENABLE_TRACE_MT)
484481 WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pSliceCodedEvent%d named(%s) ret%d err%d\n", iIdx, name, err, errno);
485482 #endif
486− used_len = SNPRINTF (name, SEM_NAME_MAX, "rc%d%p", iIdx, (void*) (*ppCtx));
487− name[used_len] = '\0';
483+ SNPRINTF (name, SEM_NAME_MAX, "rc%d%p", iIdx, (void*) (*ppCtx));
488484 err = WelsEventOpen (&pSmt->pReadySliceCodingEvent[iIdx], name);
489485 #if defined(ENABLE_TRACE_MT)
490486 WelsLog ((*ppCtx), WELS_LOG_INFO, "[MT] Open pReadySliceCodingEvent%d = 0x%p named(%s) ret%d err%d\n", iIdx,
@@ -577,19 +573,15 @@ void ReleaseMtResource (sWelsEncCtx** ppCtx) { · 86 unmodified lines
577573 #endif//DYNAMIC_SLICE_ASSIGN && TRY_SLICING_BALANCE
578574 #else
579575 str_t ename[SEM_NAME_MAX] = {0};
580− int32_t used_len = 0;
581576 // length of semaphore name should be system constrained at least on mac 10.7
582577 SNPRINTF (ename, SEM_NAME_MAX, "sc%d%p", iIdx, (void*) (*ppCtx));
583578 WelsEventClose (pSmt->pSliceCodedEvent[iIdx], ename);
584− used_len = SNPRINTF (ename, SEM_NAME_MAX, "rc%d%p", iIdx, (void*) (*ppCtx));
585− ename[used_len] = '\0';
579+ SNPRINTF (ename, SEM_NAME_MAX, "rc%d%p", iIdx, (void*) (*ppCtx));
586580 WelsEventClose (pSmt->pReadySliceCodingEvent[iIdx], ename);
587581 #if defined(DYNAMIC_SLICE_ASSIGN) && defined(TRY_SLICING_BALANCE)
588− used_len = SNPRINTF (ename, SEM_NAME_MAX, "ud%d%p", iIdx, (void*) (*ppCtx));
589− ename[used_len] = '\0';
582+ SNPRINTF (ename, SEM_NAME_MAX, "ud%d%p", iIdx, (void*) (*ppCtx));
590583 WelsEventClose (pSmt->pUpdateMbListEvent[iIdx], ename);
591− used_len = SNPRINTF (ename, SEM_NAME_MAX, "fu%d%p", iIdx, (void*) (*ppCtx));
592− ename[used_len] = '\0';
584+ SNPRINTF (ename, SEM_NAME_MAX, "fu%d%p", iIdx, (void*) (*ppCtx));
593585 WelsEventClose (pSmt->pFinUpdateMbListEvent[iIdx], ename);
594586 #endif//DYNAMIC_SLICE_ASSIGN && TRY_SLICING_BALANCE
595587 #endif//_WIN32
codec/encoder/plus/src/welsEncoderExt.cpp+42−26
@@ -77,10 +77,12 @@ CWelsH264SVCEncoder::CWelsH264SVCEncoder() · 76 unmodified lines
7777 str_t strStreamFileName[1024] = { 0 }; //for .264
7878 int32_t iBufferUsed = 0;
7979 int32_t iBufferLeft = 1023;
80+ int32_t iCurUsed;
8081
8182 str_t strLenFileName[1024] = { 0 }; //for .len
8283 int32_t iBufferUsedSize = 0;
8384 int32_t iBufferLeftSize = 1023;
85+ int32_t iCurUsedSize;
8486 #endif//OUTPUT_BIT_STREAM
8587
8688 #ifdef OUTPUT_BIT_STREAM
@@ -118,26 +120,29 @@ CWelsH264SVCEncoder::CWelsH264SVCEncoder() · 31 unmodified lines
118120 #ifdef _WIN32
119121 #if defined(_MSC_VER)
120122 #if _MSC_VER>=1500
121− iBufferUsed += SNPRINTF (strStreamFileName, iBufferLeft, iBufferLeft, "enc_bs_0x%p_", (void*)this);
122− iBufferUsedSize += SNPRINTF (strLenFileName, iBufferLeftSize, iBufferLeftSize, "enc_size_0x%p_", (void*)this);
123+ iCurUsed = SNPRINTF (strStreamFileName, iBufferLeft, iBufferLeft, "enc_bs_0x%p_", (void*)this);
124+ iCurUsedSize = SNPRINTF (strLenFileName, iBufferLeftSize, iBufferLeftSize, "enc_size_0x%p_", (void*)this);
123125 #else
124− iBufferUsed += SNPRINTF (strStreamFileName, iBufferLeft, "enc_bs_0x%p_", (void*)this);
125− iBufferUsedSize += SNPRINTF (strLenFileName, iBufferLeftSize, "enc_size_0x%p_", (void*)this);
126+ iCurUsed = SNPRINTF (strStreamFileName, iBufferLeft, "enc_bs_0x%p_", (void*)this);
127+ iCurUsedSize = SNPRINTF (strLenFileName, iBufferLeftSize, "enc_size_0x%p_", (void*)this);
126128 #endif//_MSC_VER>=1500
127129 #endif//_MSC_VER
128130 #else
129− iBufferUsed += SNPRINTF (strStreamFileName, iBufferLeft, "/tmp/enc_bs_0x%p_", (void*)this);
130− iBufferUsedSize += SNPRINTF (strLenFileName, iBufferLeftSize, "/tmp/enc_size_0x%p", (void*)this);
131+ iCurUsed = SNPRINTF (strStreamFileName, iBufferLeft, "/tmp/enc_bs_0x%p_", (void*)this);
132+ iCurUsedSize = SNPRINTF (strLenFileName, iBufferLeftSize, "/tmp/enc_size_0x%p", (void*)this);
131133 #endif//WIN32
132134
133135
134− iBufferLeft -= iBufferUsed;
135− if (iBufferLeft > iBufferUsed) {
136+ if (iCurUsed > 0) {
137+ iBufferUsed += iCurUsed;
138+ iBufferLeft -= iCurUsed;
139+ }
140+ if (iBufferLeft > 0) {
136141 #if defined(_GNUC__)
137− iBufferUsed += strftime (&strStreamFileName[iBufferUsed], iBufferLeft, "%y%m%d%H%M%S", tTimeNow);
142+ iCurUsed = strftime (&strStreamFileName[iBufferUsed], iBufferLeft, "%y%m%d%H%M%S", tTimeNow);
138143 #else
139144 #if defined(_MSC_VER)
140− iBufferUsed += strftime (&strStreamFileName[iBufferUsed], iBufferLeft, "%y%m%d%H%M%S",
145+ iCurUsed = strftime (&strStreamFileName[iBufferUsed], iBufferLeft, "%y%m%d%H%M%S",
141146 #if _MSC_VER>=1500
142147 & tTimeNow
143148 #else
@@ -146,16 +151,20 @@ CWelsH264SVCEncoder::CWelsH264SVCEncoder() · 2 unmodified lines
146151 );
147152 #endif//_MSC_VER
148153 #endif//__GNUC__
149− iBufferLeft -= iBufferUsed;
154+ iBufferUsed += iCurUsed;
155+ iBufferLeft -= iCurUsed;
150156 }
151157
152− iBufferLeftSize -= iBufferUsedSize;
153− if (iBufferLeftSize > iBufferUsedSize) {
158+ if (iCurUsedSize > 0) {
159+ iBufferUsedSize += iCurUsedSize;
160+ iBufferLeftSize -= iCurUsedSize;
161+ }
162+ if (iBufferLeftSize > 0) {
154163 #if defined(_GNUC__)
155− iBufferUsedSize += strftime (&strLenFileName[iBufferUsedSize], iBufferLeftSize, "%y%m%d%H%M%S", tTimeNow);
164+ iCurUsedSize = strftime (&strLenFileName[iBufferUsedSize], iBufferLeftSize, "%y%m%d%H%M%S", tTimeNow);
156165 #else
157166 #if defined(_MSC_VER)
158− iBufferUsedSize += strftime (&strLenFileName[iBufferUsedSize], iBufferLeftSize, "%y%m%d%H%M%S",
167+ iCurUsedSize = strftime (&strLenFileName[iBufferUsedSize], iBufferLeftSize, "%y%m%d%H%M%S",
159168 #if _MSC_VER>=1500
160169 & tTimeNow
161170 #else
@@ -164,38 +173,45 @@ CWelsH264SVCEncoder::CWelsH264SVCEncoder() · 2 unmodified lines
164173 );
165174 #endif//_MSC_VER
166175 #endif//__GNUC__
167− iBufferLeftSize -= iBufferUsedSize;
176+ iBufferUsedSize += iCurUsedSize;
177+ iBufferLeftSize -= iCurUsedSize;
168178 }
169179
170− if (iBufferLeft > iBufferUsed) {
180+ if (iBufferLeft > 0) {
171181 #ifdef _WIN32
172182 #if defined(_MSC_VER)
173183 #if _MSC_VER>=1500
174− iBufferUsed += SNPRINTF (&strStreamFileName[iBufferUsed], iBufferLeft, iBufferLeft, ".%03.3u.264", tTimeb.millitm);
184+ iCurUsed = SNPRINTF (&strStreamFileName[iBufferUsed], iBufferLeft, iBufferLeft, ".%03.3u.264", tTimeb.millitm);
175185 #else
176− iBufferUsed += SNPRINTF (&strStreamFileName[iBufferUsed], iBufferLeft, ".%03.3u.264", tTimeb.millitm);
186+ iCurUsed = SNPRINTF (&strStreamFileName[iBufferUsed], iBufferLeft, ".%03.3u.264", tTimeb.millitm);
177187 #endif//_MSC_VER>=1500
178188 #endif//_MSC_VER
179189 #else
180− iBufferUsed += SNPRINTF (&strStreamFileName[iBufferUsed], iBufferLeft, ".%03.3u.264", tTimev.tv_usec / 1000);
190+ iCurUsed = SNPRINTF (&strStreamFileName[iBufferUsed], iBufferLeft, ".%03.3u.264", tTimev.tv_usec / 1000);
181191 #endif//WIN32
182− iBufferLeft -= iBufferUsed;
192+ if (iCurUsed > 0) {
193+ iBufferUsed += iCurUsed;
194+ iBufferLeft -= iCurUsed;
195+ }
183196 }
184197
185− if (iBufferLeftSize > iBufferUsedSize) {
198+ if (iBufferLeftSize > 0) {
186199 #ifdef _WIN32
187200 #if defined(_MSC_VER)
188201 #if _MSC_VER>=1500
189− iBufferUsedSize += SNPRINTF (&strLenFileName[iBufferUsedSize], iBufferLeftSize, iBufferLeftSize, ".%03.3u.len",
202+ iCurUsedSize = SNPRINTF (&strLenFileName[iBufferUsedSize], iBufferLeftSize, iBufferLeftSize, ".%03.3u.len",
190203 tTimeb.millitm);
191204 #else
192− iBufferUsedSize += SNPRINTF (&strLenFileName[iBufferUsedSize], iBufferLeftSize, ".%03.3u.len", tTimeb.millitm);
205+ iCurUsedSize = SNPRINTF (&strLenFileName[iBufferUsedSize], iBufferLeftSize, ".%03.3u.len", tTimeb.millitm);
193206 #endif//_MSC_VER>=1500
194207 #endif//_MSC_VER
195208 #else
196− iBufferUsedSize += SNPRINTF (&strLenFileName[iBufferUsedSize], iBufferLeftSize, ".%03.3u.len", tTimev.tv_usec / 1000);
209+ iCurUsedSize = SNPRINTF (&strLenFileName[iBufferUsedSize], iBufferLeftSize, ".%03.3u.len", tTimev.tv_usec / 1000);
197210 #endif//WIN32
198− iBufferLeftSize -= iBufferUsedSize;
211+ if (iCurUsedSize > 0) {
212+ iBufferUsedSize += iCurUsedSize;
213+ iBufferLeftSize -= iCurUsedSize;
214+ }
199215 }
200216
201217 #if defined(__GNUC__)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t