head 1.2; access; symbols pkgsrc-2026Q1:1.2.0.114 pkgsrc-2026Q1-base:1.2 pkgsrc-2025Q4:1.2.0.112 pkgsrc-2025Q4-base:1.2 pkgsrc-2025Q3:1.2.0.110 pkgsrc-2025Q3-base:1.2 pkgsrc-2025Q2:1.2.0.108 pkgsrc-2025Q2-base:1.2 pkgsrc-2025Q1:1.2.0.106 pkgsrc-2025Q1-base:1.2 pkgsrc-2024Q4:1.2.0.104 pkgsrc-2024Q4-base:1.2 pkgsrc-2024Q3:1.2.0.102 pkgsrc-2024Q3-base:1.2 pkgsrc-2024Q2:1.2.0.100 pkgsrc-2024Q2-base:1.2 pkgsrc-2024Q1:1.2.0.98 pkgsrc-2024Q1-base:1.2 pkgsrc-2023Q4:1.2.0.96 pkgsrc-2023Q4-base:1.2 pkgsrc-2023Q3:1.2.0.94 pkgsrc-2023Q3-base:1.2 pkgsrc-2023Q2:1.2.0.92 pkgsrc-2023Q2-base:1.2 pkgsrc-2023Q1:1.2.0.90 pkgsrc-2023Q1-base:1.2 pkgsrc-2022Q4:1.2.0.88 pkgsrc-2022Q4-base:1.2 pkgsrc-2022Q3:1.2.0.86 pkgsrc-2022Q3-base:1.2 pkgsrc-2022Q2:1.2.0.84 pkgsrc-2022Q2-base:1.2 pkgsrc-2022Q1:1.2.0.82 pkgsrc-2022Q1-base:1.2 pkgsrc-2021Q4:1.2.0.80 pkgsrc-2021Q4-base:1.2 pkgsrc-2021Q3:1.2.0.78 pkgsrc-2021Q3-base:1.2 pkgsrc-2021Q2:1.2.0.76 pkgsrc-2021Q2-base:1.2 pkgsrc-2021Q1:1.2.0.74 pkgsrc-2021Q1-base:1.2 pkgsrc-2020Q4:1.2.0.72 pkgsrc-2020Q4-base:1.2 pkgsrc-2020Q3:1.2.0.70 pkgsrc-2020Q3-base:1.2 pkgsrc-2020Q2:1.2.0.66 pkgsrc-2020Q2-base:1.2 pkgsrc-2020Q1:1.2.0.46 pkgsrc-2020Q1-base:1.2 pkgsrc-2019Q4:1.2.0.68 pkgsrc-2019Q4-base:1.2 pkgsrc-2019Q3:1.2.0.64 pkgsrc-2019Q3-base:1.2 pkgsrc-2019Q2:1.2.0.62 pkgsrc-2019Q2-base:1.2 pkgsrc-2019Q1:1.2.0.60 pkgsrc-2019Q1-base:1.2 pkgsrc-2018Q4:1.2.0.58 pkgsrc-2018Q4-base:1.2 pkgsrc-2018Q3:1.2.0.56 pkgsrc-2018Q3-base:1.2 pkgsrc-2018Q2:1.2.0.54 pkgsrc-2018Q2-base:1.2 pkgsrc-2018Q1:1.2.0.52 pkgsrc-2018Q1-base:1.2 pkgsrc-2017Q4:1.2.0.50 pkgsrc-2017Q4-base:1.2 pkgsrc-2017Q3:1.2.0.48 pkgsrc-2017Q3-base:1.2 pkgsrc-2017Q2:1.2.0.44 pkgsrc-2017Q2-base:1.2 pkgsrc-2017Q1:1.2.0.42 pkgsrc-2017Q1-base:1.2 pkgsrc-2016Q4:1.2.0.40 pkgsrc-2016Q4-base:1.2 pkgsrc-2016Q3:1.2.0.38 pkgsrc-2016Q3-base:1.2 pkgsrc-2016Q2:1.2.0.36 pkgsrc-2016Q2-base:1.2 pkgsrc-2016Q1:1.2.0.34 pkgsrc-2016Q1-base:1.2 pkgsrc-2015Q4:1.2.0.32 pkgsrc-2015Q4-base:1.2 pkgsrc-2015Q3:1.2.0.30 pkgsrc-2015Q3-base:1.2 pkgsrc-2015Q2:1.2.0.28 pkgsrc-2015Q2-base:1.2 pkgsrc-2015Q1:1.2.0.26 pkgsrc-2015Q1-base:1.2 pkgsrc-2014Q4:1.2.0.24 pkgsrc-2014Q4-base:1.2 pkgsrc-2014Q3:1.2.0.22 pkgsrc-2014Q3-base:1.2 pkgsrc-2014Q2:1.2.0.20 pkgsrc-2014Q2-base:1.2 pkgsrc-2014Q1:1.2.0.18 pkgsrc-2014Q1-base:1.2 pkgsrc-2013Q4:1.2.0.16 pkgsrc-2013Q4-base:1.2 pkgsrc-2013Q3:1.2.0.14 pkgsrc-2013Q3-base:1.2 pkgsrc-2013Q2:1.2.0.12 pkgsrc-2013Q2-base:1.2 pkgsrc-2013Q1:1.2.0.10 pkgsrc-2013Q1-base:1.2 pkgsrc-2012Q4:1.2.0.8 pkgsrc-2012Q4-base:1.2 pkgsrc-2012Q3:1.2.0.6 pkgsrc-2012Q3-base:1.2 pkgsrc-2012Q2:1.2.0.4 pkgsrc-2012Q2-base:1.2 pkgsrc-2012Q1:1.2.0.2 pkgsrc-2012Q1-base:1.2 pkgsrc-2011Q4:1.1.0.10 pkgsrc-2011Q4-base:1.1 pkgsrc-2011Q3:1.1.0.8 pkgsrc-2011Q3-base:1.1 pkgsrc-2011Q2:1.1.0.6 pkgsrc-2011Q2-base:1.1 pkgsrc-2011Q1:1.1.0.4 pkgsrc-2011Q1-base:1.1 pkgsrc-2010Q4:1.1.0.2 pkgsrc-2010Q4-base:1.1; locks; strict; comment @# @; 1.2 date 2012.02.22.21.01.53; author shattered; state Exp; branches; next 1.1; 1.1 date 2010.11.17.22.24.40; author is; state Exp; branches; next ; desc @@ 1.2 log @Fix PR/42308 "munpack no longer preserve filenames", using the patch from Debian bug 212283. @ text @$NetBSD$ --- decode.c.orig 2003-07-21 20:47:54.000000000 +0000 +++ decode.c @@@@ -25,6 +25,7 @@@@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ +#include #include #include #include @@@@ -545,8 +546,8 @@@@ getDispositionFilename(char *disposition SkipWhitespace(&disposition); if (!disposition) return 0; - /* If we're looking at a ";", we found what we're looking for */ - if (*disposition++ == ';') break; + /* If we're looking at a "=", we found what we're looking for */ + if (*disposition++ == '=') break; } SkipWhitespace(&disposition); @@@@ -601,7 +602,7 @@@@ int handlePartial(struct part *inpart, c { char *id, *dir, *p; int thispart; - int nparts = 0; + int nparts = 0, onparts=0; char buf[1024]; FILE *partfile, *outfile; struct part *outpart; @@@@ -624,33 +625,44 @@@@ int handlePartial(struct part *inpart, c } thispart = atoi(p); + /* Try to retrieve number of parts from reassembly directory */ + sprintf(buf, "%sCT", dir); + if (partfile = fopen(buf, "r")) { + if (fgets(buf, sizeof(buf), partfile)) { + onparts = atoi(buf); + if (onparts < 0) onparts = 0; + } + fclose(partfile); + } + if (p = getParam(contentParams, "total")) { nparts = atoi(p); if (nparts <= 0) { warn("partial message has invalid number of parts"); goto ignore; } - /* Store number of parts in reassembly directory */ - sprintf(buf, "%sCT", dir); - partfile = os_createnewfile(buf); - if (!partfile) { - os_perror(buf); + if (onparts && nparts && nparts != onparts) { + warn("messages disagree about total number of parts"); goto ignore; } - fprintf(partfile, "%d\n", nparts); - fclose(partfile); - } - else { - /* Try to retrieve number of parts from reassembly directory */ + + /* Store number of parts in reassembly directory */ sprintf(buf, "%sCT", dir); - if (partfile = fopen(buf, "r")) { - if (fgets(buf, sizeof(buf), partfile)) { - nparts = atoi(buf); - if (nparts < 0) nparts = 0; + partfile = fopen(buf, "w"); + if (!partfile) { + if (errno != EEXIST) { + os_perror(buf); + goto ignore; } + onparts = nparts; + } else { + fprintf(partfile, "%d\n", nparts); fclose(partfile); } } + else { + nparts = onparts; + } /* Sanity check */ if (thispart <= 0 || (nparts && thispart > nparts)) { @ 1.1 log @Fix decoding of message/partial. Explanation: mpack-1.6 introduced more security on Unix-like systems by creating and using a helper function, os_createnewfile, that uses O_CREAT|O_EXCL. Unfortunately, it also uses it to write the total number of parts temporary file, which fails if more than one part contains the total number (as mpack creates them!) The new code compares old and new totals, if both exist, and only writes the new total, if the old didn't exist. Problem solved and one sanity check more at the same time. @ text @d13 11 @