Skip to content

Commit 937379b

Browse files
committed
catch nullptr in const char*
1 parent 0b24de9 commit 937379b

File tree

4 files changed

+34
-36
lines changed

4 files changed

+34
-36
lines changed

src/Audio.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5186,7 +5186,7 @@ void Audio::setDecoderItems() {
51865186
setChannels(m_decoder->getChannels());
51875187
setSampleRate(m_decoder->getSampleRate());
51885188
setBitsPerSample(m_decoder->getBitsPerSample());
5189-
info(*this, evt_info, "%s", m_decoder->arg1());
5189+
if(m_decoder->arg1()) info(*this, evt_info, "%s", m_decoder->arg1());
51905190

51915191
if (m_decoder->getAudioDataStart() > 0) { // only flac-ogg, native flac sets audioDataStart in readFlacHeader()
51925192
m_audioDataStart = m_decoder->getAudioDataStart();

src/Audio.h

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -510,33 +510,27 @@ class Audio {
510510

511511
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
512512
public:
513-
template <typename T> static auto safe_arg(T&& v) -> decltype(auto) {
514-
using U = std::decay_t<T>;
513+
// 🎯 overload for char*-Pointer (maybe nullptr)
514+
static const char* safe_arg(const char* v) { return v ? v : "(null)"; }
515+
static char* safe_arg(char* v) { return v ? v : (char*)"(null)"; }
515516

516-
// case 2: char arrays (string literals, fixed buffers)
517-
if constexpr (std::is_array_v<U> && std::is_same_v<std::remove_cv_t<std::remove_extent_t<U>>, char>) {
518-
return v; // Arrays sind niemals nullptr
519-
}
520-
// case 3: std::string
521-
else if constexpr (std::is_same_v<U, std::string>) {
522-
if (!v) v = (char*)"(null)";
523-
return v.c_str();
524-
}
525-
// case 4: std::string_view
526-
else if constexpr (std::is_same_v<U, std::string_view>) {
527-
return v.data(); // Attention: not zero -terminated!
528-
}
529-
// default: everything else unchanged
530-
else {
531-
return std::forward<T>(v);
532-
}
533-
}
517+
// 🎯 overload for char-Arrays (necer nullptr)
518+
template <size_t N> static const char* safe_arg(const char (&v)[N]) { return v; }
519+
520+
// 🎯 overload for string
521+
static const char* safe_arg(const std::string& v) { return v.c_str(); }
534522

535-
template <size_t N> static const char* safe_arg(const char (&v)[N]) {
536-
// Arrays sind niemals null → direkter Pointer
537-
return v;
523+
// 🎯 overload for string_view
524+
static const char* safe_arg(std::string_view v) {
525+
return v.data(); // Achtung: evtl. nicht nullterminiert
538526
}
539527

528+
// 🎯 Catch-all for all other types
529+
template <typename T> static auto safe_arg(T&& v) -> decltype(auto) { return std::forward<T>(v); }
530+
531+
// specialization für nullptr / NULL
532+
static const char* safe_arg(std::nullptr_t) { return "(null)"; }
533+
540534
template <typename... Args> static bool info(Audio& instance, event_t e, const char* fmt, Args&&... args) {
541535
std::lock_guard<std::mutex> lock(instance.mutex_info); // lock mutex
542536
// -------------------------------------------------------------------------------------------------------------------
@@ -557,7 +551,7 @@ class Audio {
557551
return -1; // no number found
558552
};
559553
// -------------------------------------------------------------------------------------------------------------------
560-
if(!fmt) return false;
554+
if (!fmt) return false;
561555
if (!audio_info_callback) return false;
562556
ps_ptr<char> result(__LINE__);
563557
// First run: determine size

src/flac_decoder/flac_decoder.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ const uint32_t mask[33] = {0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x000
110110
uint8_t temp = *(m_flacInptr + m_rIndex);
111111
m_rIndex++;
112112
(*bytesLeft)--;
113-
if(*bytesLeft < 0) { FLAC_LOG_ERROR("error in bitreader"); m_f_bitReaderError = true; break;}
113+
if(*bytesLeft < 0) {
114+
FLAC_LOG_ERROR("error in bitreader"); m_f_bitReaderError = true; break;
115+
}
114116
m_flac_bitBuffer = (m_flac_bitBuffer << 8) | temp;
115117
m_flacBitBufferLen += 8;
116118
}
@@ -527,12 +529,13 @@ int32_t FlacDecoder::decode(uint8_t *inbuf, int32_t *bytesLeft, int16_t *outbuf)
527529

528530
int32_t ret = 0;
529531
uint32_t segmLen = 0;
530-
static uint32_t segmLenTmp = 0;
532+
533+
m_segmLenTmp = 0;
531534

532535
if(m_f_flacFirstCall){ // determine if ogg or flag
533536
m_f_flacFirstCall = false;
534537
m_nBytes = 0;
535-
segmLenTmp = 0;
538+
m_segmLenTmp = 0;
536539
if(specialIndexOf(inbuf, "OggS", 5) == 0){
537540
m_f_oggWrapper = true;
538541
m_f_flacParseOgg = true;
@@ -541,16 +544,16 @@ int32_t FlacDecoder::decode(uint8_t *inbuf, int32_t *bytesLeft, int16_t *outbuf)
541544

542545
if(m_f_oggWrapper){
543546

544-
if(segmLenTmp){ // can't skip more than 16K
545-
if(segmLenTmp > FLAC_MAX_BLOCKSIZE){
547+
if(m_segmLenTmp){ // can't skip more than 16K
548+
if(m_segmLenTmp > FLAC_MAX_BLOCKSIZE){
546549
m_flacCurrentFilePos += FLAC_MAX_BLOCKSIZE;
547550
*bytesLeft -= FLAC_MAX_BLOCKSIZE;
548-
segmLenTmp -= FLAC_MAX_BLOCKSIZE;
551+
m_segmLenTmp -= FLAC_MAX_BLOCKSIZE;
549552
}
550553
else{
551-
m_flacCurrentFilePos += segmLenTmp;
552-
*bytesLeft -= segmLenTmp;
553-
segmLenTmp = 0;
554+
m_flacCurrentFilePos += m_segmLenTmp;
555+
*bytesLeft -= m_segmLenTmp;
556+
m_segmLenTmp = 0;
554557
}
555558
return FLAC_PARSE_OGG_DONE;
556559
}
@@ -628,7 +631,7 @@ int32_t FlacDecoder::decode(uint8_t *inbuf, int32_t *bytesLeft, int16_t *outbuf)
628631
break;
629632
}
630633
if(segmLen > FLAC_MAX_BLOCKSIZE){
631-
segmLenTmp = segmLen;
634+
m_segmLenTmp = segmLen;
632635
return FLAC_PARSE_OGG_DONE;
633636
}
634637
*bytesLeft -= segmLen;
@@ -1024,5 +1027,5 @@ int32_t FlacDecoder::specialIndexOf(uint8_t* base, const char* str, int32_t base
10241027
return result;
10251028
}
10261029
// —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
1027-
const char* FlacDecoder::arg1() {return "";} // virtual method
1030+
const char* FlacDecoder::arg1() {return nullptr;} // virtual method
10281031
const char* FlacDecoder::arg2() {return "";} // virtual method

src/flac_decoder/flac_decoder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ class FlacDecoder : public Decoder {
184184
uint32_t m_flacBlockPicLen = 0;
185185
uint32_t m_flacAudioDataStart = 0;
186186
int32_t m_flacRemainBlockPicLen = 0;
187+
uint32_t m_segmLenTmp = 0;
187188
const uint16_t m_flacOutBuffSize = 2048;
188189
uint16_t m_numOfOutSamples = 0;
189190
uint16_t m_flacValidSamples = 0;

0 commit comments

Comments
 (0)