From 4438f9defcd18bc1ded87f69d9ab8f6441218ec4 Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 15:43:56 +0100 Subject: Replace constant-size never-reallicated getservbyport_r() std::vector buffer with std::array --- apt-pkg/contrib/srvrec.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apt-pkg/contrib/srvrec.cc b/apt-pkg/contrib/srvrec.cc index 4a68f3578..3ddb95abb 100644 --- a/apt-pkg/contrib/srvrec.cc +++ b/apt-pkg/contrib/srvrec.cc @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -47,7 +48,7 @@ bool GetSrvRecords(std::string host, int port, std::vector &Result) int res; struct servent s_ent_buf; struct servent *s_ent = nullptr; - std::vector buf(1024); + std::array buf; res = getservbyport_r(htons(port), "tcp", &s_ent_buf, buf.data(), buf.size(), &s_ent); if (res != 0 || s_ent == nullptr) -- cgit v1.2.3-70-g09d2 From 4df49c4db761e2ad053a1b250463b6b9e4770932 Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 15:50:23 +0100 Subject: Bump pkgTagFile default Size from 32k to APT_BUFFER_SIZE --- apt-pkg/tagfile.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apt-pkg/tagfile.h b/apt-pkg/tagfile.h index 45529c9f5..60fca09c1 100644 --- a/apt-pkg/tagfile.h +++ b/apt-pkg/tagfile.h @@ -201,11 +201,11 @@ public: SUPPORT_COMMENTS = 1 << 0, }; - void Init(FileFd * const F, pkgTagFile::Flags const Flags, unsigned long long Size = 32*1024); - void Init(FileFd * const F,unsigned long long const Size = 32*1024); + void Init(FileFd * const F, pkgTagFile::Flags const Flags, unsigned long long Size = APT_BUFFER_SIZE); + void Init(FileFd * const F,unsigned long long const Size = APT_BUFFER_SIZE); - pkgTagFile(FileFd * const F, pkgTagFile::Flags const Flags, unsigned long long Size = 32*1024); - pkgTagFile(FileFd * const F,unsigned long long Size = 32*1024); + pkgTagFile(FileFd * const F, pkgTagFile::Flags const Flags, unsigned long long Size = APT_BUFFER_SIZE); + pkgTagFile(FileFd * const F,unsigned long long Size = APT_BUFFER_SIZE); virtual ~pkgTagFile(); }; -- cgit v1.2.3-70-g09d2 From c87f3bdd1790bb75447c2ec8f95e5e07bdce58d5 Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 16:35:18 +0100 Subject: mthdcat: use APT_BUFFER_SIZE I/O buffer --- test/interactive-helper/mthdcat.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/interactive-helper/mthdcat.cc b/test/interactive-helper/mthdcat.cc index 2961b2080..8826faad3 100644 --- a/test/interactive-helper/mthdcat.cc +++ b/test/interactive-helper/mthdcat.cc @@ -3,13 +3,14 @@ the file ends */ #include +#include #include int main() { - char Buffer[4096]; - + char Buffer[APT_BUFFER_SIZE]; + while (1) { int Res = read(STDIN_FILENO,Buffer,sizeof(Buffer)); -- cgit v1.2.3-70-g09d2 From 78e503bc1d79bc4fc29bc9cbe1dfb68ae4d16acf Mon Sep 17 00:00:00 2001 From: наб Date: Tue, 12 Nov 2024 13:28:04 +0100 Subject: Turn unique_ptr into real deleter types (warnings now, UB in C++20) --- apt-pkg/acquire-item.cc | 4 ++-- apt-pkg/acquire.cc | 2 +- apt-pkg/contrib/gpgv.cc | 21 ++++++++++++--------- apt-pkg/contrib/strutl.cc | 2 +- apt-pkg/contrib/strutl.h | 9 +++++++++ 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 tmpfile { strdup(tmpfile_tpl.c_str()), std::free }; + std::unique_ptr 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 tmpdir { strndup(tmpdir_tpl.data(), tmpdir_tpl.length()), std::free }; + std::unique_ptr 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 tmpfile { strdup(tmpfile_tpl.c_str()), std::free }; + std::unique_ptr 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 /*}}}*/ -// syntactic sugar to wrap a raw pointer with a custom deleter in a std::unique_ptr -static std::unique_ptr make_unique_char(void *const str = nullptr) -{ - return {static_cast(str), &free}; +namespace { + struct FILEDeleter { + void operator()(FILE *p) { + fclose(p); + } + }; } -static std::unique_ptr make_unique_FILE(std::string const &filename, char const *const mode) + +static std::unique_ptr 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 sig; + std::unique_ptr data; + std::unique_ptr 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{static_cast(malloc(size)), &free}; + auto S = std::unique_ptr{static_cast(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); -- cgit v1.2.3-70-g09d2 From 9f81a8dd0ee585a360ae0ae7786959630a8d0be0 Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 16:17:35 +0100 Subject: dpkgpm: lift out CopyIndented() and make_unique_*() for FILEs; use getline() for reading lines instead of 1k buffer --- apt-pkg/contrib/fileutl.h | 29 +++++++++++++++++++ apt-pkg/contrib/gpgv.cc | 12 -------- apt-pkg/deb/dpkgpm.cc | 74 +++++++++++++++++------------------------------ 3 files changed, 55 insertions(+), 60 deletions(-) diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h index 11f4871f6..938d1d8bc 100644 --- a/apt-pkg/contrib/fileutl.h +++ b/apt-pkg/contrib/fileutl.h @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -284,4 +285,32 @@ APT_HIDDEN bool OpenConfigurationFileFd(std::string const &File, FileFd &Fd); APT_HIDDEN int Inhibit(const char *what, const char *who, const char *why, const char *mode); + +namespace { + struct FILEFcloseDeleter { + void operator()(FILE *p) { + fclose(p); + } + }; + struct FILEPcloseDeleter { + void operator()(FILE *p) { + pclose(p); + } + }; + + [[maybe_unused]] std::unique_ptr make_unique_FILE(const char *const filename, char const *const mode) + { + return {fopen(filename, mode), {}}; + } + [[maybe_unused]] std::unique_ptr make_unique_FILE(std::string const &filename, char const *const mode) + { + return make_unique_FILE(filename.c_str(), mode); + } + + [[maybe_unused]] std::unique_ptr make_unique_popen(const char *program, char const *const mode) + { + return {popen(program, mode), {}}; + } +} + #endif diff --git a/apt-pkg/contrib/gpgv.cc b/apt-pkg/contrib/gpgv.cc index 9ab3e066e..c5ea19aa8 100644 --- a/apt-pkg/contrib/gpgv.cc +++ b/apt-pkg/contrib/gpgv.cc @@ -28,18 +28,6 @@ #include /*}}}*/ -namespace { - struct FILEDeleter { - void operator()(FILE *p) { - fclose(p); - } - }; -} - -static std::unique_ptr make_unique_FILE(std::string const &filename, char const *const mode) -{ - return {fopen(filename.c_str(), mode), {}}; -} class LineBuffer /*{{{*/ { diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 82035ee65..31f81af7c 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -2233,6 +2234,27 @@ void pkgDPkgPM::Reset() { List.erase(List.begin(),List.end()); } + +template +struct AptScopeWrapper { + F func; + ~AptScopeWrapper() { func(); } +}; +template +AptScopeWrapper(F) -> AptScopeWrapper; + +static void CopyIndented(const char *header, FILE *from, FILE *to) +{ + if (!from) + return; + + fputs(header, to); + char *line{}; + size_t linelen; + AptScopeWrapper line_deleter{[&] { free(line); }}; + while (getline(&line, &linelen, from) != -1) + fprintf(to, " %s", line); +} /*}}}*/ // pkgDpkgPM::WriteApportReport - write out error report pkg failure /*{{{*/ // --------------------------------------------------------------------- @@ -2406,35 +2428,12 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) // attach terminal log it if we have it string logfile_name = _config->FindFile("Dir::Log::Terminal", "/dev/null"); if (logfile_name != "/dev/null") - { - FILE *log = NULL; - - fprintf(report, "DpkgTerminalLog:\n"); - log = fopen(logfile_name.c_str(),"r"); - if(log != NULL) - { - char buf[1024]; - while( fgets(buf, sizeof(buf), log) != NULL) - fprintf(report, " %s", buf); - fprintf(report, " \n"); - fclose(log); - } - } + CopyIndented("DpkgTerminalLog:\n", make_unique_FILE(logfile_name, "r").get(), report); // attach history log it if we have it string histfile_name = _config->FindFile("Dir::Log::History", "/dev/null"); if (histfile_name != "/dev/null") - { - fprintf(report, "DpkgHistoryLog:\n"); - FILE* log = fopen(histfile_name.c_str(),"r"); - if(log != NULL) - { - char buf[1024]; - while( fgets(buf, sizeof(buf), log) != NULL) - fprintf(report, " %s", buf); - fclose(log); - } - } + CopyIndented("DpkgHistoryLog:\n", make_unique_FILE(histfile_name, "r").get(), report); // log the ordering, see dpkgpm.h and the "Ops" enum there fprintf(report, "AptOrdering:\n"); @@ -2458,32 +2457,11 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) // attach dmesg log (to learn about segfaults) if (FileExists("/bin/dmesg")) - { - fprintf(report, "Dmesg:\n"); - FILE *log = popen("/bin/dmesg","r"); - if(log != NULL) - { - char buf[1024]; - while( fgets(buf, sizeof(buf), log) != NULL) - fprintf(report, " %s", buf); - pclose(log); - } - } + CopyIndented("Dmesg:\n", make_unique_popen("/bin/dmesg","r").get(), report); // attach df -l log (to learn about filesystem status) if (FileExists("/bin/df")) - { - - fprintf(report, "Df:\n"); - FILE *log = popen("/bin/df -l -x squashfs","r"); - if(log != NULL) - { - char buf[1024]; - while( fgets(buf, sizeof(buf), log) != NULL) - fprintf(report, " %s", buf); - pclose(log); - } - } + CopyIndented("Df:\n", make_unique_popen("/bin/df -l -x squashfs","r").get(), report); fclose(report); -- cgit v1.2.3-70-g09d2 From 83e4e77dc2ac0c2a03769f5ccc6649bd6594c480 Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 16:21:04 +0100 Subject: pkgDPkgPMPrivate::dpkgbuf: char[1024] -> array --- apt-pkg/deb/dpkgpm.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 31f81af7c..461a901d3 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -117,7 +117,7 @@ public: bool stdin_is_dev_null; bool status_fd_reached_end_of_file; // the buffer we use for the dpkg status-fd reading - char dpkgbuf[1024]; + std::array dpkgbuf; size_t dpkgbuf_pos; FILE *term_out; FILE *history_out; @@ -947,7 +947,7 @@ void pkgDPkgPM::handleCrossUpgradeAction(string const &pkgname) /*{{{*/ // DPkgPM::DoDpkgStatusFd /*{{{*/ void pkgDPkgPM::DoDpkgStatusFd(int statusfd) { - auto const remainingBuffer = (sizeof(d->dpkgbuf) / sizeof(d->dpkgbuf[0])) - d->dpkgbuf_pos; + auto const remainingBuffer = d->dpkgbuf.size() - d->dpkgbuf_pos; if (likely(remainingBuffer > 0) && d->status_fd_reached_end_of_file == false) { auto const len = read(statusfd, &d->dpkgbuf[d->dpkgbuf_pos], remainingBuffer); @@ -958,12 +958,12 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd) d->status_fd_reached_end_of_file = true; return; } - d->dpkgbuf_pos += (len / sizeof(d->dpkgbuf[0])); + d->dpkgbuf_pos += len; } // process line by line from the buffer - char *p = d->dpkgbuf, *q = nullptr; - while((q=(char*)memchr(p, '\n', (d->dpkgbuf + d->dpkgbuf_pos) - p)) != nullptr) + char *p = d->dpkgbuf.data(), *q = nullptr; + while((q=(char*)memchr(p, '\n', &d->dpkgbuf[d->dpkgbuf_pos] - p)) != nullptr) { *q = '\0'; ProcessDpkgStatusLine(p); @@ -971,15 +971,15 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd) } // check if we stripped the buffer clean - if (p > (d->dpkgbuf + d->dpkgbuf_pos)) + if (p > (d->dpkgbuf.data() + d->dpkgbuf_pos)) { d->dpkgbuf_pos = 0; return; } // otherwise move the unprocessed tail to the start and update pos - memmove(d->dpkgbuf, p, (p - d->dpkgbuf)); - d->dpkgbuf_pos = (d->dpkgbuf + d->dpkgbuf_pos) - p; + memmove(d->dpkgbuf.data(), p, (p - d->dpkgbuf.data())); + d->dpkgbuf_pos = &d->dpkgbuf[d->dpkgbuf_pos] - p; } /*}}}*/ // DPkgPM::WriteHistoryTag /*{{{*/ -- cgit v1.2.3-70-g09d2 From 38a43428497c3be15642c6d1d62084bc16b636a5 Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 16:23:42 +0100 Subject: dpkgpm: use sysconf(_SC_GETPW_R_SIZE_MAX)-sized + growing buffer for getpwuid_r() instead of 255 --- apt-pkg/deb/dpkgpm.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 461a901d3..709f4a289 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -77,8 +77,13 @@ APT_PURE static string AptHistoryRequestingUser() /*{{{*/ if (uid > 0) { struct passwd pwd; struct passwd *result; - char buf[255]; - if (getpwuid_r(uid, &pwd, buf, sizeof(buf), &result) == 0 && result != NULL) { + int tmp = sysconf(_SC_GETPW_R_SIZE_MAX); + if(tmp <= 0) + tmp = 256; + std::vector buf(tmp); + while ((tmp = getpwuid_r(uid, &pwd, buf.data(), buf.size(), &result)) == -1 && errno == ERANGE) + buf.resize(buf.size() * 2); + if (tmp == 0 && result != NULL) { std::string res; strprintf(res, "%s (%d)", pwd.pw_name, uid); return res; -- cgit v1.2.3-70-g09d2 From a3fe93f15d0c3570a653bc50cf87dfd20c9bd671 Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 16:24:54 +0100 Subject: dpkgpm: use std::array for I/O copy buffers --- apt-pkg/deb/dpkgpm.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 709f4a289..6b9b25e8b 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -534,10 +534,10 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf) */ void pkgDPkgPM::DoStdin(int master) { - unsigned char input_buf[256] = {0,}; - ssize_t len = read(STDIN_FILENO, input_buf, sizeof(input_buf)); + std::array input_buf; + ssize_t len = read(STDIN_FILENO, input_buf.data(), input_buf.size()); if (len) - FileFd::Write(master, input_buf, len); + FileFd::Write(master, input_buf.data(), len); else d->stdin_is_dev_null = true; } @@ -549,9 +549,9 @@ void pkgDPkgPM::DoStdin(int master) */ void pkgDPkgPM::DoTerminalPty(int master) { - unsigned char term_buf[1024] = {0,0, }; + std::array term_buf; - ssize_t len=read(master, term_buf, sizeof(term_buf)); + ssize_t len=read(master, term_buf.data(), term_buf.size()); if(len == -1 && errno == EIO) { // this happens when the child is about to exit, we @@ -563,9 +563,9 @@ void pkgDPkgPM::DoTerminalPty(int master) } if(len <= 0) return; - FileFd::Write(1, term_buf, len); + FileFd::Write(1, term_buf.data(), len); if(d->term_out) - fwrite(term_buf, len, sizeof(char), d->term_out); + fwrite(term_buf.data(), len, sizeof(char), d->term_out); } /*}}}*/ // DPkgPM::ProcessDpkgStatusBuf /*{{{*/ -- cgit v1.2.3-70-g09d2 From 90d89c7c1a39aca33fad430f04e09b44d4b7319a Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 16:30:40 +0100 Subject: dpkgpm: use getline() for Apport var/crash lines Also remove useless condition: sscanf() already direct-matches non-whitespace bytes --- apt-pkg/deb/dpkgpm.cc | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 6b9b25e8b..65a3e9170 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -2382,30 +2382,25 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) reportfile = flCombine(_config->FindDir("Dir::Apport", "var/crash"), pkgname+".0.crash"); if(FileExists(reportfile)) { - struct stat buf; - char strbuf[255]; - // check atime/mtime + struct stat buf{}; stat(reportfile.c_str(), &buf); if(buf.st_mtime > buf.st_atime) return; + char *line{}; + size_t linelen; + AptScopeWrapper line_deleter{[&] { free(line); }}; // check if the existing report is the same version report = fopen(reportfile.c_str(),"r"); - while(fgets(strbuf, sizeof(strbuf), report) != NULL) + AptScopeWrapper report_deleter{[&] { fclose(report); }}; + while(getline(&line, &linelen, report) != -1) { - if(strstr(strbuf,"Package:") == strbuf) - { - char pkgname[255], version[255]; - if(sscanf(strbuf, "Package: %254s %254s", pkgname, version) == 2) - if(strcmp(pkgver.c_str(), version) == 0) - { - fclose(report); - return; - } - } + char pkgname[255], version[255]; + if(sscanf(line, "Package: %254s %254s", pkgname, version) == 2) + if(strcmp(pkgver.c_str(), version) == 0) + return; } - fclose(report); } // now write the report @@ -2413,6 +2408,7 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) report = fopen(reportfile.c_str(),"w"); if(report == NULL) return; + AptScopeWrapper report_deleter{[&] { fclose(report); }}; if(_config->FindB("DPkgPM::InitialReportOnly",false) == true) chmod(reportfile.c_str(), 0); else @@ -2467,8 +2463,5 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) // attach df -l log (to learn about filesystem status) if (FileExists("/bin/df")) CopyIndented("Df:\n", make_unique_popen("/bin/df -l -x squashfs","r").get(), report); - - fclose(report); - } /*}}}*/ -- cgit v1.2.3-70-g09d2 From 0c235200ea804b8c9e47d6021bca85d3d2b37167 Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 18:37:02 +0100 Subject: dpkgpm: append ":$printarchitecture" instead of ':'+${#printarchitecture} to package name --- apt-pkg/deb/dpkgpm.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 65a3e9170..50fa86a16 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -760,7 +760,7 @@ void pkgDPkgPM::ProcessDpkgStatusLine(char *line) char* buf = NULL; size_t bufsize = 0; if (getline(&buf, &bufsize, dpkg) != -1) - pkgname += ':' + bufsize; + (pkgname += ':') += buf; free(buf); fclose(dpkg); } -- cgit v1.2.3-70-g09d2 From a05e6fe18329ff8d91acf10efd4a1408858b0fda Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 18:39:20 +0100 Subject: dpkgpm: fdopen() failing doesn't close the fd --- apt-pkg/deb/dpkgpm.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 50fa86a16..03221ce32 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -486,6 +486,7 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf) close(Pipes[0]); FILE *F = fdopen(Pipes[1],"w"); if (F == 0) { + close(Pipes[1]); result = _error->Errno("fdopen","Failed to open new FD"); break; } @@ -764,6 +765,8 @@ void pkgDPkgPM::ProcessDpkgStatusLine(char *line) free(buf); fclose(dpkg); } + else + close(outputFd); ExecWait(dpkgNativeArch, "dpkg --print-architecture", true); if (pkgname.find(':') != std::string::npos) { -- cgit v1.2.3-70-g09d2