summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorнаб <nabijaczleweli@nabijaczleweli.xyz>2024-11-12 13:28:04 +0100
committerнаб <nabijaczleweli@nabijaczleweli.xyz>2024-11-12 13:46:06 +0100
commit78e503bc1d79bc4fc29bc9cbe1dfb68ae4d16acf (patch)
tree67beaeec79a01ea97785bc5ad1476f3c2315e107
parentc87f3bdd1790bb75447c2ec8f95e5e07bdce58d5 (diff)
Turn unique_ptr<decltype(fclose and free)> into real deleter types (warnings now, UB in C++20)
-rw-r--r--apt-pkg/acquire-item.cc4
-rw-r--r--apt-pkg/acquire.cc2
-rw-r--r--apt-pkg/contrib/gpgv.cc21
-rw-r--r--apt-pkg/contrib/strutl.cc2
-rw-r--r--apt-pkg/contrib/strutl.h9
5 files changed, 25 insertions, 13 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index b534d56a3..3016dad59 100644
--- a/apt-pkg/acquire-item.cc
+++ b/apt-pkg/acquire-item.cc
@@ -4065,7 +4065,7 @@ static std::string GetAuxFileNameFromURIInLists(std::string const &uri)
auto const dirname = flCombine(_config->FindDir("Dir::State::lists"), "auxfiles/");
char const * const filetag = ".apt-acquire-privs-test.XXXXXX";
std::string const tmpfile_tpl = flCombine(dirname, filetag);
- std::unique_ptr<char, decltype(std::free) *> tmpfile { strdup(tmpfile_tpl.c_str()), std::free };
+ std::unique_ptr<char, FreeDeleter> tmpfile { strdup(tmpfile_tpl.c_str()) };
int const fd = mkstemp(tmpfile.get());
if (fd == -1)
return "";
@@ -4081,7 +4081,7 @@ static std::string GetAuxFileNameFromURI(std::string const &uri)
std::string tmpdir_tpl;
strprintf(tmpdir_tpl, "%s/apt-auxfiles-XXXXXX", GetTempDir().c_str());
- std::unique_ptr<char, decltype(std::free) *> tmpdir { strndup(tmpdir_tpl.data(), tmpdir_tpl.length()), std::free };
+ std::unique_ptr<char, FreeDeleter> tmpdir { strndup(tmpdir_tpl.data(), tmpdir_tpl.length()) };
if (mkdtemp(tmpdir.get()) == nullptr)
{
_error->Errno("GetAuxFileNameFromURI", "mkdtemp of %s failed", tmpdir.get());
diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc
index 7ebfa4ffe..f367e4310 100644
--- a/apt-pkg/acquire.cc
+++ b/apt-pkg/acquire.cc
@@ -605,7 +605,7 @@ static bool IsAccessibleBySandboxUser(std::string const &filename, bool const Re
char const * const filetag = ".apt-acquire-privs-test.XXXXXX";
std::string const tmpfile_tpl = flCombine(dirname, filetag);
- std::unique_ptr<char, decltype(std::free) *> tmpfile { strdup(tmpfile_tpl.c_str()), std::free };
+ std::unique_ptr<char, FreeDeleter> tmpfile { strdup(tmpfile_tpl.c_str()) };
int const fd = mkstemp(tmpfile.get());
if (fd == -1 && errno == EACCES)
return false;
diff --git a/apt-pkg/contrib/gpgv.cc b/apt-pkg/contrib/gpgv.cc
index 225acae88..9ab3e066e 100644
--- a/apt-pkg/contrib/gpgv.cc
+++ b/apt-pkg/contrib/gpgv.cc
@@ -28,14 +28,17 @@
#include <apti18n.h>
/*}}}*/
-// syntactic sugar to wrap a raw pointer with a custom deleter in a std::unique_ptr
-static std::unique_ptr<char, decltype(&free)> make_unique_char(void *const str = nullptr)
-{
- return {static_cast<char *>(str), &free};
+namespace {
+ struct FILEDeleter {
+ void operator()(FILE *p) {
+ fclose(p);
+ }
+ };
}
-static std::unique_ptr<FILE, decltype(&fclose)> make_unique_FILE(std::string const &filename, char const *const mode)
+
+static std::unique_ptr<FILE, FILEDeleter> make_unique_FILE(std::string const &filename, char const *const mode)
{
- return {fopen(filename.c_str(), mode), &fclose};
+ return {fopen(filename.c_str(), mode), {}};
}
class LineBuffer /*{{{*/
@@ -207,9 +210,9 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
}
enum { DETACHED, CLEARSIGNED } releaseSignature = (FileGPG != File) ? DETACHED : CLEARSIGNED;
- auto sig = make_unique_char();
- auto data = make_unique_char();
- auto conf = make_unique_char();
+ std::unique_ptr<char, FreeDeleter> sig;
+ std::unique_ptr<char, FreeDeleter> data;
+ std::unique_ptr<char, FreeDeleter> conf;
// Dump the configuration so apt-key picks up the correct Dir values
{
diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc
index 3689dc17a..ec61c7e2b 100644
--- a/apt-pkg/contrib/strutl.cc
+++ b/apt-pkg/contrib/strutl.cc
@@ -1421,7 +1421,7 @@ unsigned long RegexChoice(RxChoiceList *Rxs,const char **ListBegin,
and to allow reordering of parameters */
bool iovprintf(std::ostream &out, const char *format,
va_list &args, ssize_t &size) {
- auto S = std::unique_ptr<char,decltype(&free)>{static_cast<char*>(malloc(size)), &free};
+ auto S = std::unique_ptr<char,FreeDeleter>{static_cast<char*>(malloc(size))};
ssize_t const n = vsnprintf(S.get(), size, format, args);
if (n > -1 && n < size) {
out << S.get();
diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h
index 7cf9b456d..152477eee 100644
--- a/apt-pkg/contrib/strutl.h
+++ b/apt-pkg/contrib/strutl.h
@@ -31,6 +31,15 @@
#include "macros.h"
+namespace {
+ struct FreeDeleter {
+ void operator()(void *p) {
+ free(p);
+ }
+ };
+}
+
+
namespace APT {
namespace String {
APT_PUBLIC std::string Strip(const std::string &s);