diff options
author | Piotr Kubaj <pkubaj@FreeBSD.org> | 2021-02-03 04:07:02 +0000 |
---|---|---|
committer | Piotr Kubaj <pkubaj@FreeBSD.org> | 2021-02-03 04:07:02 +0000 |
commit | 9c317d3cc11f187bc3fb748317df2d7295873c8d (patch) | |
tree | 022f3681d4e99f96d470c5864dbcc8433e4bba2c /mail/thunderbird | |
parent | 8613b01d64f32d71b982eee3ed8722faa153f4fe (diff) | |
download | ports-9c317d3cc11f187bc3fb748317df2d7295873c8d.tar.gz ports-9c317d3cc11f187bc3fb748317df2d7295873c8d.zip |
mail/thunderbird: fix runtime crashes on powerpc64*
Details in https://bugzilla.mozilla.org/show_bug.cgi?id=1690152
Approved by: tier 2 blanket
Notes
Notes:
svn path=/head/; revision=563867
Diffstat (limited to 'mail/thunderbird')
-rw-r--r-- | mail/thunderbird/Makefile | 2 | ||||
-rw-r--r-- | mail/thunderbird/files/patch-bug1690152 | 97 |
2 files changed, 98 insertions, 1 deletions
diff --git a/mail/thunderbird/Makefile b/mail/thunderbird/Makefile index f07512e67023..994dd076ff4c 100644 --- a/mail/thunderbird/Makefile +++ b/mail/thunderbird/Makefile @@ -3,7 +3,7 @@ PORTNAME= thunderbird DISTVERSION= 78.7.0 -PORTREVISION= 1 +PORTREVISION= 2 CATEGORIES= mail news net-im MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \ MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build2/source diff --git a/mail/thunderbird/files/patch-bug1690152 b/mail/thunderbird/files/patch-bug1690152 new file mode 100644 index 000000000000..49bdaf42be7e --- /dev/null +++ b/mail/thunderbird/files/patch-bug1690152 @@ -0,0 +1,97 @@ + +# HG changeset patch +# User Cameron Kaiser <spectre@floodgap.com> +# Date 1612231460 0 +# Node ID 579a66fd796690fb752485215b2edaa6167ebf16 +# Parent a00504e040bfd34d01c74d478beb9d308ec085be +Bug 1690152 - on ppc64 properly skip parameter slots if we overflow GPRs while still having FPRs to burn. r=tcampbell + +Differential Revision: https://phabricator.services.mozilla.com/D103724 + +diff --git a/xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp b/xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp +--- xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp ++++ xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp +@@ -86,27 +86,37 @@ extern "C" void invoke_copy_to_stack(uin + case nsXPTType::T_WCHAR: value = s->val.wc; break; + default: value = (uint64_t) s->val.p; break; + } + } + + if (!s->IsIndirect() && s->type == nsXPTType::T_DOUBLE) { + if (nr_fpr < FPR_COUNT) { + fpregs[nr_fpr++] = s->val.d; +- nr_gpr++; ++ // Even if we have enough FPRs, still skip space in ++ // the parameter area if we ran out of placeholder GPRs. ++ if (nr_gpr < GPR_COUNT) { ++ nr_gpr++; ++ } else { ++ d++; ++ } + } else { + *((double *)d) = s->val.d; + d++; + } + } + else if (!s->IsIndirect() && s->type == nsXPTType::T_FLOAT) { + if (nr_fpr < FPR_COUNT) { + // Single-precision floats are passed in FPRs too. + fpregs[nr_fpr++] = s->val.f; +- nr_gpr++; ++ if (nr_gpr < GPR_COUNT) { ++ nr_gpr++; ++ } else { ++ d++; ++ } + } else { + #ifdef __LITTLE_ENDIAN__ + *((float *)d) = s->val.f; + #else + // Big endian needs adjustment to point to the least + // significant word. + float* p = (float*)d; + p++; +diff --git a/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp b/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp +--- xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp ++++ xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp +@@ -98,27 +98,37 @@ PrepareAndDispatch(nsXPTCStubBase * self + nr_gpr++; + else + ap++; + } + + if (!param.IsOut() && type == nsXPTType::T_DOUBLE) { + if (nr_fpr < FPR_COUNT) { + dp->val.d = fpregs[nr_fpr++]; +- nr_gpr++; ++ // Even if we have enough FPRs, still skip space in ++ // the parameter area if we ran out of placeholder GPRs. ++ if (nr_gpr < GPR_COUNT) { ++ nr_gpr++; ++ } else { ++ ap++; ++ } + } else { + dp->val.d = *(double*)ap++; + } + continue; + } + if (!param.IsOut() && type == nsXPTType::T_FLOAT) { + if (nr_fpr < FPR_COUNT) { + // Single-precision floats are passed in FPRs too. + dp->val.f = (float)fpregs[nr_fpr++]; +- nr_gpr++; ++ if (nr_gpr < GPR_COUNT) { ++ nr_gpr++; ++ } else { ++ ap++; ++ } + } else { + #ifdef __LITTLE_ENDIAN__ + dp->val.f = *(float*)ap++; + #else + // Big endian needs adjustment to point to the least + // significant word. + float* p = (float*)ap; + p++; + |