musikr: fix segfault from logging nullptr

This commit is contained in:
Alexander Capehart 2025-03-04 09:46:41 -07:00
parent 1fc9ca5147
commit fe770337e6
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47

View file

@ -30,7 +30,9 @@
#include "taglib/vorbisfile.h" #include "taglib/vorbisfile.h"
#include "taglib/wavfile.h" #include "taglib/wavfile.h"
bool parseMpeg(const char *name, TagLib::File *file,
bool parseMpeg(const std::string &name, TagLib::File *file,
JMetadataBuilder &jBuilder) { JMetadataBuilder &jBuilder) {
auto *mpegFile = dynamic_cast<TagLib::MPEG::File*>(file); auto *mpegFile = dynamic_cast<TagLib::MPEG::File*>(file);
if (mpegFile == nullptr) { if (mpegFile == nullptr) {
@ -41,7 +43,7 @@ bool parseMpeg(const char *name, TagLib::File *file,
try { try {
jBuilder.setId3v1(*id3v1Tag); jBuilder.setId3v1(*id3v1Tag);
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse ID3v1 tag in %s: %s", name, e.what()); LOGE("Unable to parse ID3v1 tag in %s: %s", name.c_str(), e.what());
} }
} }
auto id3v2Tag = mpegFile->ID3v2Tag(); auto id3v2Tag = mpegFile->ID3v2Tag();
@ -49,13 +51,13 @@ bool parseMpeg(const char *name, TagLib::File *file,
try { try {
jBuilder.setId3v2(*id3v2Tag); jBuilder.setId3v2(*id3v2Tag);
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse ID3v2 tag in %s: %s", name, e.what()); LOGE("Unable to parse ID3v2 tag in %s: %s", name.c_str(), e.what());
} }
} }
return true; return true;
} }
bool parseMp4(const char *name, TagLib::File *file, bool parseMp4(const std::string &name, TagLib::File *file,
JMetadataBuilder &jBuilder) { JMetadataBuilder &jBuilder) {
auto *mp4File = dynamic_cast<TagLib::MP4::File*>(file); auto *mp4File = dynamic_cast<TagLib::MP4::File*>(file);
if (mp4File == nullptr) { if (mp4File == nullptr) {
@ -66,13 +68,13 @@ bool parseMp4(const char *name, TagLib::File *file,
try { try {
jBuilder.setMp4(*tag); jBuilder.setMp4(*tag);
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse MP4 tag in %s: %s", name, e.what()); LOGE("Unable to parse MP4 tag in %s: %s", name.c_str(), e.what());
} }
} }
return true; return true;
} }
bool parseFlac(const char *name, TagLib::File *file, bool parseFlac(const std::string &name, TagLib::File *file,
JMetadataBuilder &jBuilder) { JMetadataBuilder &jBuilder) {
auto *flacFile = dynamic_cast<TagLib::FLAC::File*>(file); auto *flacFile = dynamic_cast<TagLib::FLAC::File*>(file);
if (flacFile == nullptr) { if (flacFile == nullptr) {
@ -83,7 +85,7 @@ bool parseFlac(const char *name, TagLib::File *file,
try { try {
jBuilder.setId3v1(*id3v1Tag); jBuilder.setId3v1(*id3v1Tag);
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse ID3v1 tag in %s: %s", name, e.what()); LOGE("Unable to parse ID3v1 tag in %s: %s", name.c_str(), e.what());
} }
} }
auto id3v2Tag = flacFile->ID3v2Tag(); auto id3v2Tag = flacFile->ID3v2Tag();
@ -91,7 +93,7 @@ bool parseFlac(const char *name, TagLib::File *file,
try { try {
jBuilder.setId3v2(*id3v2Tag); jBuilder.setId3v2(*id3v2Tag);
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse ID3v2 tag in %s: %s", name, e.what()); LOGE("Unable to parse ID3v2 tag in %s: %s", name.c_str(), e.what());
} }
} }
auto xiphComment = flacFile->xiphComment(); auto xiphComment = flacFile->xiphComment();
@ -99,7 +101,7 @@ bool parseFlac(const char *name, TagLib::File *file,
try { try {
jBuilder.setXiph(*xiphComment); jBuilder.setXiph(*xiphComment);
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse Xiph comment in %s: %s", name, e.what()); LOGE("Unable to parse Xiph comment in %s: %s", name.c_str(), e.what());
} }
} }
auto pics = flacFile->pictureList(); auto pics = flacFile->pictureList();
@ -107,7 +109,7 @@ bool parseFlac(const char *name, TagLib::File *file,
return true; return true;
} }
bool parseOpus(const char *name, TagLib::File *file, bool parseOpus(const std::string &name, TagLib::File *file,
JMetadataBuilder &jBuilder) { JMetadataBuilder &jBuilder) {
auto *opusFile = dynamic_cast<TagLib::Ogg::Opus::File*>(file); auto *opusFile = dynamic_cast<TagLib::Ogg::Opus::File*>(file);
if (opusFile == nullptr) { if (opusFile == nullptr) {
@ -118,13 +120,13 @@ bool parseOpus(const char *name, TagLib::File *file,
try { try {
jBuilder.setXiph(*tag); jBuilder.setXiph(*tag);
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse Xiph comment in %s: %s", name, e.what()); LOGE("Unable to parse Xiph comment in %s: %s", name.c_str(), e.what());
} }
} }
return true; return true;
} }
bool parseVorbis(const char *name, TagLib::File *file, bool parseVorbis(const std::string &name, TagLib::File *file,
JMetadataBuilder &jBuilder) { JMetadataBuilder &jBuilder) {
auto *vorbisFile = dynamic_cast<TagLib::Ogg::Vorbis::File*>(file); auto *vorbisFile = dynamic_cast<TagLib::Ogg::Vorbis::File*>(file);
if (vorbisFile == nullptr) { if (vorbisFile == nullptr) {
@ -135,13 +137,13 @@ bool parseVorbis(const char *name, TagLib::File *file,
try { try {
jBuilder.setXiph(*tag); jBuilder.setXiph(*tag);
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse Xiph comment %s: %s", name, e.what()); LOGE("Unable to parse Xiph comment %s: %s", name.c_str(), e.what());
} }
} }
return true; return true;
} }
bool parseWav(const char *name, TagLib::File *file, bool parseWav(const std::string &name, TagLib::File *file,
JMetadataBuilder &jBuilder) { JMetadataBuilder &jBuilder) {
auto *wavFile = dynamic_cast<TagLib::RIFF::WAV::File*>(file); auto *wavFile = dynamic_cast<TagLib::RIFF::WAV::File*>(file);
if (wavFile == nullptr) { if (wavFile == nullptr) {
@ -152,7 +154,7 @@ bool parseWav(const char *name, TagLib::File *file,
try { try {
jBuilder.setId3v2(*tag); jBuilder.setId3v2(*tag);
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse ID3v2 tag in %s: %s", name, e.what()); LOGE("Unable to parse ID3v2 tag in %s: %s", name.c_str(), e.what());
} }
} }
return true; return true;
@ -162,7 +164,7 @@ extern "C" JNIEXPORT jobject JNICALL
Java_org_oxycblt_musikr_metadata_TagLibJNI_openNative(JNIEnv *env, Java_org_oxycblt_musikr_metadata_TagLibJNI_openNative(JNIEnv *env,
jobject /* this */, jobject /* this */,
jobject inputStream) { jobject inputStream) {
const char *name = nullptr; std::string name = "unknown file";
try { try {
JInputStream jStream {env, inputStream}; JInputStream jStream {env, inputStream};
name = jStream.name(); name = jStream.name();
@ -189,12 +191,12 @@ Java_org_oxycblt_musikr_metadata_TagLibJNI_openNative(JNIEnv *env,
} else if (parseWav(name, file, jBuilder)) { } else if (parseWav(name, file, jBuilder)) {
jBuilder.setMimeType("audio/wav"); jBuilder.setMimeType("audio/wav");
} else { } else {
LOGE("File format in %s is not supported", name); LOGE("File format in %s is not supported", name.c_str());
return nullptr; return nullptr;
} }
return jBuilder.build(); return jBuilder.build();
} catch (std::exception &e) { } catch (std::exception &e) {
LOGE("Unable to parse metadata in %s: %s", name != nullptr ? name : "unknown file", e.what()); LOGE("Unable to parse metadata in %s: %s", name.c_str(), e.what());
return nullptr; return nullptr;
} }
} }