From b40802973a43811e89fbaa593b677638665bf003 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 27 Mar 2008 04:26:43 +0000 Subject: [PATCH] Addressed memory leaks in the MIME sniffer code. Fixes bug #1660. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24604 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/storage/sniffer/Pattern.cpp | 4 ++++ src/servers/registrar/mime/SnifferRules.cpp | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/kits/storage/sniffer/Pattern.cpp b/src/kits/storage/sniffer/Pattern.cpp index bbc8a80121..a77af1e283 100644 --- a/src/kits/storage/sniffer/Pattern.cpp +++ b/src/kits/storage/sniffer/Pattern.cpp @@ -13,6 +13,8 @@ #include // for SEEK_* defines #include +#include + using namespace BPrivate::Storage::Sniffer; Pattern::Pattern(const std::string &string, const std::string &mask) @@ -115,6 +117,7 @@ Pattern::Sniff(off_t start, off_t size, BPositionIO *data, bool caseInsensitive) off_t len = fString.length(); char *buffer = new(nothrow) char[len+1]; if (buffer) { + ArrayDeleter _(buffer); ssize_t bytesRead = data->ReadAt(start, buffer, len); // \todo If there are fewer bytes left in the data stream // from the given position than the length of our data @@ -160,6 +163,7 @@ Pattern::Sniff(off_t start, off_t size, BPositionIO *data, bool caseInsensitive) off_t len = fString.length(); char *buffer = new(std::nothrow) char[len+1]; if (buffer) { + ArrayDeleter _(buffer); ssize_t bytesRead = data->ReadAt(start, buffer, len); // \todo If there are fewer bytes left in the data stream // from the given position than the length of our data diff --git a/src/servers/registrar/mime/SnifferRules.cpp b/src/servers/registrar/mime/SnifferRules.cpp index fac96ec377..3183dd94d2 100644 --- a/src/servers/registrar/mime/SnifferRules.cpp +++ b/src/servers/registrar/mime/SnifferRules.cpp @@ -163,14 +163,15 @@ SnifferRules::GuessMimeType(const entry_ref *ref, BString *type) if (bytes < 0) err = bytes; } - + // Next read that many bytes (or fewer, if the file isn't // that long) into a buffer if (!err) { buffer = new(std::nothrow) char[bytes]; if (!buffer) err = B_NO_MEMORY; - } + } + if (!err) err = file.SetTo(ref, B_READ_ONLY); if (!err) { @@ -182,7 +183,9 @@ SnifferRules::GuessMimeType(const entry_ref *ref, BString *type) // Now sniff the buffer if (!err) err = GuessMimeType(&file, buffer, bytes, type); - + + delete[] buffer; + return err; }