From c57f78fef43d0b35cbb26e3961a9c33de4d5f096 Mon Sep 17 00:00:00 2001 From: Jerry James Date: Oct 13 2018 17:02:33 +0000 Subject: Add -bruch patch to fix use-after-free problems in the bruch code. Add -int32 patch to fix problems on 64-bit systems. Add -rec01 patch to fix return values of rec01(). Add -seq-point patch to fix undefined behavior. Add -deref patch to fix a pointer to character comparison. --- diff --git a/symmetrica-bruch.patch b/symmetrica-bruch.patch new file mode 100644 index 0000000..64ff568 --- /dev/null +++ b/symmetrica-bruch.patch @@ -0,0 +1,38 @@ +--- bruch.c.orig 2012-05-08 10:27:19.153254904 -0600 ++++ bruch.c 2018-10-11 14:42:27.394653564 -0600 +@@ -975,14 +975,16 @@ INT kuerzen_integer_integer(bruch) OP br + ggterg = ggt_i(S_B_UI(bruch),S_B_OI(bruch)); + + if (ggterg == S_B_UI(bruch)) { ++ INT tmp = S_B_OI(bruch); + freeself_bruch(bruch); +- M_I_I(S_B_OI(bruch) / ggterg,bruch); ++ M_I_I(tmp / ggterg,bruch); + goto ende; + } + + if (-ggterg == S_B_UI(bruch)) { ++ INT tmp = - S_B_OI(bruch); + freeself_bruch(bruch); +- M_I_I(- S_B_OI(bruch) / ggterg,bruch); ++ M_I_I(tmp / ggterg,bruch); + goto ende; + } + +@@ -1032,12 +1034,14 @@ INT kuerzen_integer_longint(bruch) OP br + + if (S_O_K(S_B_U(bruch)) == INTEGER) + if (S_B_UI(bruch) == 1) { ++ INT tmp = S_B_OI(bruch); + freeself_bruch(bruch); +- M_I_I(S_B_OI(bruch),bruch); ++ M_I_I(tmp,bruch); + goto ende; } + else if (S_B_UI(bruch) == -1) { ++ INT tmp = - S_B_OI(bruch); + freeself_bruch(bruch); +- M_I_I( - S_B_OI(bruch),bruch); ++ M_I_I(tmp,bruch); + goto ende; } + if (NEGP(S_B_O(bruch)) && NEGP(S_B_U(bruch))) + { diff --git a/symmetrica-deref.patch b/symmetrica-deref.patch new file mode 100644 index 0000000..3c80bac --- /dev/null +++ b/symmetrica-deref.patch @@ -0,0 +1,11 @@ +--- vc.c.orig 2018-10-11 15:53:27.897984344 -0600 ++++ vc.c 2018-10-11 16:11:13.670048917 -0600 +@@ -665,7 +665,7 @@ INT sscan_permvector(t,a) OP a; char *t; + w++; + while (*w != ']') + { +- if (w == '\0') {erg = ERROR; goto spe;} ++ if (*w == '\0') {erg = ERROR; goto spe;} + else w++; + } + } diff --git a/symmetrica-int32.patch b/symmetrica-int32.patch new file mode 100644 index 0000000..a6d0fcb --- /dev/null +++ b/symmetrica-int32.patch @@ -0,0 +1,557 @@ +--- bar.c.orig 2018-10-11 15:11:31.451675197 -0600 ++++ bar.c 2018-10-11 15:12:56.278168734 -0600 +@@ -798,7 +798,7 @@ INT starting_bar_schubert(n,res) OP n,re + FILE *fp; + char s[100]; + +- sprintf(s,"startbarschubert%d",S_I_I(n)); ++ sprintf(s,"startbarschubert%" PRIdPTR,S_I_I(n)); + fp = fopen(s,"r"); + if (fp != NULL) + { +--- de.c.orig 2018-10-11 15:11:31.455675126 -0600 ++++ de.c 2018-10-11 15:13:29.444579721 -0600 +@@ -505,7 +505,7 @@ INT debugprint(a) OP a; + /* abschluss immer mit newline */ + { + case 0: +- fprintf(stderr,"kind:0=empty self=%d\n",s_o_s(a).ob_INT); ++ fprintf(stderr,"kind:0=empty self=%" PRIdPTR "\n",s_o_s(a).ob_INT); + break; + case 1: + fprintf(stderr,"kind:1=integer value:"); +@@ -738,7 +738,7 @@ INT debugprint(a) OP a; + case 36: return debugprint_reihe(a); + #endif /* REIHETRUE */ + default: +- fprintf(stderr,"kind:%d unknown\n",s_o_k(a)); ++ fprintf(stderr,"kind:%" PRIdPTR " unknown\n",s_o_k(a)); + break; + } + return OK; +--- def.h.orig 2018-10-11 15:11:31.454675144 -0600 ++++ def.h 2018-10-11 15:12:27.054687725 -0600 +@@ -2,7 +2,7 @@ + /* INT should always be 4 byte */ + #ifndef DEF_H + +-#include ++#include + typedef int32_t INT; + typedef uint32_t UINT; + +@@ -60,10 +60,13 @@ typedef uint32_t UINT; + + + /* definitionen fuer object.c */ +-typedef INT OBJECTKIND; /* 4 byte */ ++/* NOTE: partition code assumes that there is no unused space in the ++ * object struct when an INT is stored. This requires both OBJECTKIND ++ * and OBJECTSELF to have a size equal to a machine word. */ ++typedef intptr_t OBJECTKIND; + + typedef union { +- INT ob_INT; ++ intptr_t ob_INT; + INT * ob_INTpointer; + char *ob_charpointer; + struct bruch *ob_bruch; +--- di.c.orig 2012-05-08 08:29:01.773059259 -0600 ++++ di.c 2018-10-11 15:14:00.583026723 -0600 +@@ -1285,7 +1285,7 @@ INT get_orb_rep(G,m,n,L,len,konstr) + m_il_nv(0L,FP); + + Ggen(G); +- fprintf(stderr,"Gruppe erzeugt Ordnung %d\n",S_V_LI(G)); ++ fprintf(stderr,"Gruppe erzeugt Ordnung %" PRIdPTR "\n",S_V_LI(G)); + + if(S_I_I(len) == 0L) + M_I_I(S_V_LI(G),len); +@@ -1314,7 +1314,7 @@ INT get_orb_rep(G,m,n,L,len,konstr) + Mggen(G,C,Cdegrees,weight,Mg); + + MGgen(Mg,G,Cdegrees,MG); +- printf("Anzahl Bahnrepraesentanten: %d\n",S_I_I(MG)); ++ printf("Anzahl Bahnrepraesentanten: %" PRIdPTR "\n",S_I_I(MG)); + + m_il_nv(S_V_LI(Cdegrees),propab); + build_propab_vector(propab,Cdegrees,G,MG,Mg); +--- ff.c.orig 2018-10-11 15:11:31.452675179 -0600 ++++ ff.c 2018-10-11 15:14:50.997131402 -0600 +@@ -2165,7 +2165,7 @@ INT objectwrite_ff(f,a) FILE *f; OP a; + CTO(FF,"objectwrite_ff(2)",a); + { + INT i,*ip; +- fprintf(f,"%d\n%d\n%d ", ++ fprintf(f,"%d\n%" PRIdPTR "\n%d ", + (INT)FF,S_FF_CI(a),S_FF_DI(a)); + ip = S_FF_IP(a); + for (i=0;i1 == collision)\n"); + for (i=0;i1L) +- fprintf(texout," x_{%d,%d}^{%d} ", ++ fprintf(texout," x_{%d,%d}^{%" PRIdPTR "} ", + i,j,S_M_IJI(z,i,j)); + else + fprintf(texout," x_{%d,%d} ", i,j); +@@ -2048,7 +2048,7 @@ INT tex_polynom(poly) OP poly; + texposition ++; + if (S_PO_SII(zeiger,i) != 1L) + { +- fprintf(texout,"^{%d}",S_PO_SII(zeiger,i)); ++ fprintf(texout,"^{%" PRIdPTR "}",S_PO_SII(zeiger,i)); + texposition += 10L; + }; + }; +@@ -2952,7 +2952,7 @@ INT maple_polynom(poly) OP poly; + texposition ++; + if (S_PO_SII(zeiger,i) != 1L) + { +- fprintf(texout,"^%d",S_PO_SII(zeiger,i)); ++ fprintf(texout,"^%" PRIdPTR,S_PO_SII(zeiger,i)); + texposition += 10L; + }; + }; +--- rest.c.orig 2018-10-11 15:11:24.963790418 -0600 ++++ rest.c 2018-10-11 15:27:17.021882596 -0600 +@@ -2551,11 +2551,11 @@ INT tex_integer(a) OP a; + if (S_I_I(a) <0L) texposition++; + if (ts == 0L) + { +- fprintf(texout," $%d$ ",S_I_I(a)); ++ fprintf(texout," $%" PRIdPTR "$ ",S_I_I(a)); + texposition += 4L; + } + else +- fprintf(texout," %d ",S_I_I(a)); ++ fprintf(texout," %" PRIdPTR " ",S_I_I(a)); + return OK; + } + +@@ -2636,7 +2636,7 @@ INT objectwrite_integer(filename,obj) FI + { + INT erg = OK; + COP("objectwrite_integer(1)",filename); +- fprintf(filename," %d %d\n",(INT)INTEGER,S_I_I(obj)); ++ fprintf(filename," %d %" PRIdPTR "\n",(INT)INTEGER,S_I_I(obj)); + ENDR("objectwrite_integer"); + } + +@@ -2646,7 +2646,7 @@ INT sprint_integer(string,a) char *strin + { + INT erg = OK; + CTO(INTEGER,"sprint_integer(2)",a); +- sprintf(string,"%d",S_I_I(a)); ++ sprintf(string,"%" PRIdPTR,S_I_I(a)); + ENDR("sprint_integer"); + } + +@@ -2675,7 +2675,7 @@ INT fprint_integer(f,a) FILE *f; OP a; + if (S_I_I(a) < 0) + zeilenposition++; /* for the leading sign */ + } +- fprintf(f,"%d",S_I_I(a)); ++ fprintf(f,"%" PRIdPTR,S_I_I(a)); + if (f == stdout) + if (zeilenposition >= row_length) + { fprintf(f,"\n"); zeilenposition = 0; } +@@ -3562,7 +3562,7 @@ INT test_callocobject() + } + printf("test_callocobject: a=%p\n",a); + printf("test_callocobject: a->ob_kind=%d\n",(INT) (a->ob_kind)); +- printf("test_callocobject: a->ob_self.ob_INT=%d\n", ++ printf("test_callocobject: a->ob_self.ob_INT=%" PRIdPTR "\n", + (a->ob_self).ob_INT); + SYM_free(a); + return(OK); +@@ -3575,7 +3575,7 @@ INT debugprint_object(a) OP a; + fprintf(stderr,"debugprint_object: NULL-object");return(OK);} + fprintf(stderr,"debugprint_object: a=%p\n",a); + fprintf(stderr,"debugprint_object: kind=%d\n",(INT)a->ob_kind); +- fprintf(stderr,"debugprint_object: self.INT=%d\n",a->ob_self.ob_INT); ++ fprintf(stderr,"debugprint_object: self.INT=%" PRIdPTR "\n",a->ob_self.ob_INT); + return(OK); + } + +--- sb.c.orig 2012-05-08 10:54:36.240451596 -0600 ++++ sb.c 2018-10-11 15:28:04.083046837 -0600 +@@ -880,7 +880,7 @@ gedruckt werden nur die stellen die vers + (i (INT)1) + { +- fprintf(texout,"$ (x_%d - y_%d)^%d $ ",j,k-j,S_PO_SII(z,i)); ++ fprintf(texout,"$ (x_%d - y_%d)^%" PRIdPTR " $ ",j,k-j,S_PO_SII(z,i)); + texposition += (INT)10; + } + +--- vc.c.orig 2018-10-11 15:11:31.451675197 -0600 ++++ vc.c 2018-10-11 15:28:36.354473729 -0600 +@@ -1633,7 +1633,7 @@ INT sprint_integervector(t,a) char *t; O + for (i=0;i0) { sprintf(t,","); t++; } +- sprintf(t,"%d",S_V_II(a,i)); ++ sprintf(t,"%" PRIdPTR,S_V_II(a,i)); + t += intlog(S_V_I(a,i)); + if (S_V_II(a,i) < 0) t++; + } +@@ -1716,7 +1716,7 @@ INT objectwrite_bv(filename,vec) FILE *f + size_t n; + COP("objectwrite_bv(1)",filename); + COP("objectwrite_bv(2)",vec); +- fprintf(filename," %d ",S_O_K(vec)); ++ fprintf(filename," %" PRIdPTR " ",S_O_K(vec)); + objectwrite(filename,S_V_L(vec)); + n = fwrite(S_V_S(vec),(size_t)1,(size_t)S_BV_LI(vec),filename); + if (n != S_BV_LI(vec)) +@@ -1737,7 +1737,7 @@ INT objectwrite_vector(filename,vec) FIL + INT erg = OK; + COP("objectwrite_vector(1)",filename); + COP("objectwrite_vector(2)",vec); +- fprintf(filename," %d ",S_O_K(vec)); ++ fprintf(filename," %" PRIdPTR " ",S_O_K(vec)); + + erg += objectwrite(filename,S_V_L(vec)); + +--- zykelind.c.orig 2012-05-08 10:57:55.321204819 -0600 ++++ zykelind.c 2018-10-11 15:29:01.005035959 -0600 +@@ -4244,7 +4244,7 @@ INT frip_latex_zykelind(a) OP a; + if (!nullp(S_V_I(S_PO_S(monom),i))) + { + if (!einsp(S_V_I(S_PO_S(monom),i))) +- printf("x_{%ld}^{%d}\n",i+1L,S_V_II(S_PO_S(monom),i)); ++ printf("x_{%ld}^{%" PRIdPTR "}\n",i+1L,S_V_II(S_PO_S(monom),i)); + else + printf("x_{%ld}\n",i+1L); + } diff --git a/symmetrica-rec01.patch b/symmetrica-rec01.patch new file mode 100644 index 0000000..af42ff3 --- /dev/null +++ b/symmetrica-rec01.patch @@ -0,0 +1,13 @@ +--- part.c.orig 2018-10-11 14:39:55.425356265 -0600 ++++ part.c 2018-10-11 14:47:36.000165576 -0600 +@@ -1767,8 +1767,8 @@ static int rec01(INT ni, OP vec) + /* to compute number of partitions */ + { + INT erg = OK; +- if (ni<0) return; +- if (not EMPTYP(S_V_I(vec,ni))) return; ++ if (ni<0) return 0; ++ if (not EMPTYP(S_V_I(vec,ni))) return 0; + else if (ni<=1) M_I_I(1,S_V_I(vec,ni)); + else { + diff --git a/symmetrica-seq-point.patch b/symmetrica-seq-point.patch new file mode 100644 index 0000000..8dfa3c6 --- /dev/null +++ b/symmetrica-seq-point.patch @@ -0,0 +1,762 @@ +--- bar.c.orig 2018-10-11 15:12:56.278168734 -0600 ++++ bar.c 2018-10-11 15:31:45.763110019 -0600 +@@ -24,7 +24,7 @@ INT cast_apply_barperm(a) OP a; + } + default: + printobjectkind(a); +- erg += WTO("cast_apply_barperm",a); ++ WTO("cast_apply_barperm",a); + break; + } + ENDR("cast_apply_barperm"); +--- bruch.c.orig 2018-10-11 14:42:27.394653564 -0600 ++++ bruch.c 2018-10-11 15:35:08.439510685 -0600 +@@ -248,7 +248,7 @@ INT add_bruch(a,b,c) OP a,b,c; + goto aiende; + + default : +- erg += WTO("add_bruch(2)",b); ++ WTO("add_bruch(2)",b); + }; + erg += kuerzen(c); + aiende: +--- de.c.orig 2018-10-11 15:13:29.444579721 -0600 ++++ de.c 2018-10-11 15:35:20.973288098 -0600 +@@ -780,7 +780,7 @@ INT mem_size(a) OP a; + case VECTOR: return mem_size_vector(a); + case HASHTABLE: return mem_size_hashtable(a); + default: +- erg += WTO("mem_size",a);goto endr_ende; ++ WTO("mem_size",a);goto endr_ende; + } + ENDR("mem_size"); + } +--- ff.c.orig 2018-10-11 15:14:50.997131402 -0600 ++++ ff.c 2018-10-11 15:36:10.565407391 -0600 +@@ -629,7 +629,7 @@ static INT erzmulttafel(Erweiterungsgrad + Gau[i] = ((INT *)Gaussmatrix) + (int)k; + ax = Gaussmatrix; + for (j=0;j= 0L) ? \ +- freeall_speicher[freeall_speicherposition--] : \ +- callocobject_fast() ) ++static inline OP CALLOCOBJECT(void) ++{ ++ if (freeall_speicherposition >= 0L) ++ return freeall_speicher[freeall_speicherposition--]; ++ return callocobject_fast(); ++} + /* + #endif + */ +--- mo.c.orig 2018-10-11 15:19:43.168942622 -0600 ++++ mo.c 2018-10-11 15:41:32.898682900 -0600 +@@ -81,7 +81,7 @@ static INT _ggT_v(); + + static TL_BYTE AK_buf; + #define TL_MOD(a,b) \ +- ((AK_buf = (((INT)a)%(b)))<0?AK_buf+b:AK_buf) ++ (AK_buf = ((((INT)a)%(b))<0)?AK_buf+b:AK_buf) + + /* mod(a,b)=a mod b >= 0 */ + #define TL_ADP(x,y,p) TL_MOD((x)+(y),(INT)p) +--- nb.c.orig 2018-10-11 15:11:31.443675339 -0600 ++++ nb.c 2018-10-11 15:41:54.419300690 -0600 +@@ -1888,7 +1888,7 @@ INT cast_apply_monopoly(a) OP a; + NYI("cast_apply_monopoly:POLYNOM->MONOPOLY"); + break; + default: +- erg += WTO("cast_apply_monopoly:can not convert",a); ++ WTO("cast_apply_monopoly:can not convert",a); + break; + } + } +--- nu.c.orig 2012-05-08 08:29:01.778059252 -0600 ++++ nu.c 2018-10-11 15:48:05.197715576 -0600 +@@ -34,7 +34,7 @@ INT squareroot(a,b) OP a,b; + goto sqende; + #endif /* LONGINTTRUE */ + default: +- erg += WTO("squareroot(1)",a); ++ WTO("squareroot(1)",a); + goto sqende; + } + sqende: +@@ -72,7 +72,7 @@ INT ganzsquareroot(a,b) OP a,b; + #endif /* LONGINTTRUE */ + + default: +- erg+= WTO("ganzsquareroot(1)",a); ++ WTO("ganzsquareroot(1)",a); + goto endr_ende; + } + ENDR("ganzsquareroot"); +@@ -118,7 +118,7 @@ INT max(a,b) OP a,b; + #endif /* VECTORTRUE */ + + default: +- erg += WTO("max(1)",a); ++ WTO("max(1)",a); + goto ende; + }; + ende: +@@ -163,7 +163,7 @@ INT min(a,b) OP a,b; + #endif /* VECTORTRUE */ + + default: +- erg += WTO("min(1)",a); ++ WTO("min(1)",a); + goto ende; + }; + ende: +@@ -213,7 +213,7 @@ INT absolute(a,c) OP a,c; + goto ende; + #endif /* VECTORTRUE */ + default: +- erg += WTO("absolute(1)",a); ++ WTO("absolute(1)",a); + goto ende; + } + ende: +@@ -335,7 +335,7 @@ INT signum(a,c) OP a,c; + erg += signum_permutation(a,c);break; + #endif /* PERMTRUE */ + default: +- erg += WTO("signum",a); break; ++ WTO("signum",a); break; + }; + ENDR("signum"); + } +@@ -547,7 +547,7 @@ INT sym_sort(a) OP a; + erg += sort_vector(a);break; + #endif /* VECTORTRUE */ + default: +- erg += WTO("sym_sort",a); break; ++ WTO("sym_sort",a); break; + }; + ENDR("sym_sort"); + } +@@ -612,7 +612,7 @@ INT length(a,d) OP a,d; + break; + #endif /* VECTORTRUE */ + default: +- erg += WTO("length",a); break; ++ WTO("length",a); break; + }; + ENDR("length"); + } +@@ -636,7 +636,7 @@ INT content(a,b) OP a,b; + break; + #endif /* WORDTRUE */ + default: +- erg += WTO("content",a); break; ++ WTO("content",a); break; + }; + ENDR("content"); + } +@@ -677,7 +677,7 @@ INT sym_sum(a,res) OP a,res; + break; + #endif /* MATRIXTRUE */ + default: +- erg += WTO("sum",a); break; ++ WTO("sum",a); break; + }; + + ENDR("sym_sum"); +@@ -742,7 +742,7 @@ INT conjugate(a,res) OP a,res; + break; + #endif /* TABLEAUXTRUE */ + default: +- erg += WTO("conjugate",a); ++ WTO("conjugate",a); + break; + }; + +@@ -835,7 +835,7 @@ INT addinvers(a,res) OP a,res; + break; + #endif /* VECTORTRUE */ + default: +- erg += WTO("addinvers(1)",a); break; ++ WTO("addinvers(1)",a); break; + }; + ENDR("addinvers"); + } +@@ -1073,7 +1073,7 @@ INT inc(a) OP a; + #endif /* VECTORTRUE */ + + default: +- erg += WTO("inc(1)",a); ++ WTO("inc(1)",a); + break; + }; + ENDR("inc"); +@@ -1115,7 +1115,7 @@ INT dec(a) OP a; + break; + #endif /* VECTORTRUE */ + default: +- erg += WTO("dec(1)",a); break; ++ WTO("dec(1)",a); break; + }; + ENDR("dec"); + } +@@ -1179,7 +1179,7 @@ INT dimension(n,d) OP n, d; + break; + #endif /* SKEWPARTTRUE */ + default: +- erg += WTO("dimension",n); break; ++ WTO("dimension",n); break; + } + ENDR("dimension"); + } +@@ -1318,7 +1318,7 @@ INT quores(a,b,c,d) OP a,b,c,d; + } + #endif /* MONOPOLYTRUE */ + default: +- erg += WTT("quores",a,b); ++ WTT("quores",a,b); + break; + } + quoresende: +@@ -1390,7 +1390,7 @@ INT mod(a,b,c) OP a,b,c; + else if (S_O_K(a) == MONOPOLY) + erg += quores_monopoly(a,b,d,c); + else +- erg += WTO("mod",a); ++ WTO("mod",a); + + FREEALL(d); + ENDR("mod"); +@@ -1481,7 +1481,7 @@ INT mod_apply_integer(a,b) OP a,b; + erg += mod_apply_integer_longint(a,b); + break; + default: +- erg += WTO("mod_apply_integer(2)",b); ++ WTO("mod_apply_integer(2)",b); + break; + } + ENDR("mod_apply_integer"); +@@ -1824,7 +1824,7 @@ INT ggt_integer(a,b,c) OP a,b,c; + case LONGINT: erg += ggt_integer_longint(a,b,c); + goto endr_ende; + default: +- erg += WTO("ggt_integer(2)",b); ++ WTO("ggt_integer(2)",b); + goto endr_ende; + } + ENDR("ggt_integer"); +@@ -1966,7 +1966,7 @@ INT ggt(a,b,c) OP a,b,c; + } + } + else { +- erg += WTO("ggt(1)",a); ++ WTO("ggt(1)",a); + goto endr_ende; + } + ENDR("ggt"); +@@ -2185,7 +2185,7 @@ INT invers(a,b) OP a,b; + #endif /* SQRADTRUE */ + + default: +- erg += WTO("invers(1)",a); ++ WTO("invers(1)",a); + break; + }; + ENDR("invers"); +@@ -2482,7 +2482,7 @@ INT scalarproduct(a,b,c) OP a,b,c; + #endif /* VECTORTRUE */ + + default: +- erg += WTT("scalarproduct",a,b); ++ WTT("scalarproduct",a,b); + break; + }; + ENDR("scalarproduct"); +@@ -2564,7 +2564,7 @@ INT weight(a,b) OP a,b; + break; + + default: +- erg += WTO("weight",a); ++ WTO("weight",a); + break; + }; + ENDR("weight"); +@@ -2589,7 +2589,7 @@ INT trace(a,b) OP a,b; + #endif /* MATRIXTRUE */ + + default: +- erg += WTO("trace",a); break; ++ WTO("trace",a); break; + }; + ENDR("trace"); + } +@@ -2610,7 +2610,7 @@ INT det(a,b) OP a,b; + break; + #endif /* MATRIXTRUE */ + default: +- erg += WTO("det",a); break; ++ WTO("det",a); break; + }; + ENDR("det"); + } +@@ -2771,7 +2771,7 @@ INT addinvers_apply(a) OP a; + #endif /* VECTORTRUE */ + + default: +- erg += WTO("addinvers_apply",a); ++ WTO("addinvers_apply",a); + break; + }; + ENDR("addinvers_apply"); +--- part.c.orig 2018-10-11 15:30:50.830085575 -0600 ++++ part.c 2018-10-11 15:48:17.861490665 -0600 +@@ -532,7 +532,7 @@ INT add_partition(a,b,c) OP a,b,c; + #endif /* SCHURTRUE */ + + default : +- erg += WTO("add_partition(2)",b); ++ WTO("add_partition(2)",b); + } + + ENDR("add_partition"); +--- perm.c.orig 2018-10-11 15:24:46.494555814 -0600 ++++ perm.c 2018-10-11 15:48:49.372931013 -0600 +@@ -371,7 +371,7 @@ INT divdiff(a,b,c) OP a,b,c; + break; + #endif + default: +- erg += WTT("divdiff",a,b); ++ WTT("divdiff",a,b); + break; + }; + break; +@@ -390,7 +390,7 @@ INT divdiff(a,b,c) OP a,b,c; + break; + #endif + default: +- erg += WTT("divdiff",a,b); ++ WTT("divdiff",a,b); + break; + }; + break; +@@ -407,7 +407,7 @@ INT divdiff(a,b,c) OP a,b,c; + break; + } + default: +- erg += WTT("divdiff",a,b); ++ WTT("divdiff",a,b); + break; + } + ENDR("divdiff"); +@@ -3585,7 +3585,7 @@ INT cast_apply_perm(a) OP a; + break; + default: + printobjectkind(a); +- erg += WTO("cast_apply_perm",a); ++ WTO("cast_apply_perm",a); + break; + } + ENDR("cast_apply_perm"); +--- plet.c.orig 2012-05-08 13:46:03.728466896 -0600 ++++ plet.c 2018-10-11 15:49:01.629713331 -0600 +@@ -160,7 +160,7 @@ INT plethysm(a,b,c) OP a,b,c; + erg += plethysm_schur_schur(a,b,c); + } + else { +- erg += WTT("plethysm",a,b); ++ WTT("plethysm",a,b); + } + ENDR("plethysm"); + } +--- poly.c.orig 2018-10-11 15:25:31.165762497 -0600 ++++ poly.c 2018-10-11 15:49:39.949032771 -0600 +@@ -285,7 +285,7 @@ INT mult_monom(a,b,c) OP a,b,c; + erg += mult_apply_longint(b,S_MO_K(c)); + break; + default: +- erg += WTO("mult_monom",b); ++ WTO("mult_monom",b); + } + ENDR("mult_monom"); + } +@@ -659,7 +659,7 @@ INT mult_polynom(a,b,d) OP a,b,d; + goto ende; + + default: +- erg += WTO("mult_polynom(2)",b); ++ WTO("mult_polynom(2)",b); + } + ende: + ENDR("mult_polynom"); +@@ -1363,7 +1363,7 @@ INT add_polynom_polynom(a,b,c) OP a,b,c; + || + (not LISTP(b)) + ) +- erg+= WTT("add_polynom_polynom(1,2)",a,b); ++ WTT("add_polynom_polynom(1,2)",a,b); + SYMCHECK(S_O_K(a) != S_O_K(b), "add_polynom_polynom:different object types"); + d = callocobject(); + erg += copy_list(a,d); +@@ -2991,7 +2991,7 @@ INT cast_apply_polynom(a) OP a; + erg += t_MONOPOLY_POLYNOM(a,a); + break; + default: +- erg += WTO("cast_apply_polynom",a); ++ WTO("cast_apply_polynom",a); + break; + } + ENDR("cast_apply_polynom"); +--- rest.c.orig 2018-10-11 15:27:17.021882596 -0600 ++++ rest.c 2018-10-11 15:50:59.379622065 -0600 +@@ -511,7 +511,7 @@ INT rz(a,b) OP a, b; + break; + #endif /* PERMTRUE */ + default: +- erg+= WTO("rz(1)",a); ++ WTO("rz(1)",a); + break; + + }; +@@ -555,7 +555,7 @@ INT lastof(a,res) OP a,res; + #endif /* VECTORTRUE */ + + default: +- erg+= WTO("lastof(1)",a); ++ WTO("lastof(1)",a); + break; + }; + ENDR("lastof"); +@@ -749,7 +749,7 @@ INT freeself(a) OP a; + break; + #endif /* VECTORTRUE */ + default: +- erg += WTO("freeself(1)",a); ++ WTO("freeself(1)",a); + break; + }; + CTO(EMPTY,"freeself(e1)",a); +@@ -898,7 +898,7 @@ INT copy(a,b) OP a, b; + erg += copy_bitvector(a,b); break; + #endif /* VECTORTRUE */ + default: +- erg+= WTO("copy(1)",a); ++ WTO("copy(1)",a); + break; + }; + +@@ -931,7 +931,7 @@ INT append_apply(a,b) OP a,b; + break; + #endif /* VECTORTRUE */ + default: +- erg+= WTO("append_apply",a); ++ WTO("append_apply",a); + break; + }; + ENDR("append_apply"); +@@ -975,7 +975,7 @@ INT append(a,b,e) OP a,b,e; + erg += append_vector(a,b,e); + break; + #endif /* VECTORTRUE */ +- default: erg+= WTO("append",a); break; ++ default: WTO("append",a); break; + }; + ENDR("append"); + } +@@ -1522,7 +1522,7 @@ INT posp(a) OP a; + return posp_polynom(a); + #endif /* POLYTRUE */ + default: +- erg += WTO("posp",a); ++ WTO("posp",a); + goto endr_ende; + }; + ENDR("posp"); +@@ -2288,7 +2288,7 @@ object */ + if (NULLP_INTEGER(a)) + COPY(b,c); + else +- erg += WTO("add_integer(2)",b); ++ WTO("add_integer(2)",b); + goto aiende; + } /* end switch */ + aiende: +@@ -2938,7 +2938,7 @@ INT mult_apply_integer(a,b) OP a,b; + else if (S_I_I(a) == (INT)-1) + erg += addinvers_apply(b); + else +- erg += WTO("mult_apply_integer: wrong second type",b); ++ WTO("mult_apply_integer: wrong second type",b); + } + ENDR("mult_apply_integer"); + } +@@ -3234,7 +3234,7 @@ INT next_apply(obj) OP obj; + } + #endif /* PERMTRUE */ + default: +- erg+= WTO("next_apply(1)",obj); ++ WTO("next_apply(1)",obj); + break; + } + ENDR("next_apply"); +@@ -3292,7 +3292,7 @@ INT next(von,nach) OP von, nach; + return error("next: wrong kind of permutation"); + } + #endif /* PERMTRUE */ +- default: erg+= WTO("next(1)",von); ++ default: WTO("next(1)",von); + break; + } + ENDR("next"); +@@ -3400,7 +3400,7 @@ INT insert(a,c,eh,cf) OP a,c; INT (*eh)( + goto endr_ende; + #endif /* POLYTRUE */ + default: +- erg += WTT("insert(1,2)",a,c); ++ WTT("insert(1,2)",a,c); + goto endr_ende; + }; + ENDR("insert"); +--- rh.c.orig 2018-10-11 15:11:31.453675161 -0600 ++++ rh.c 2018-10-11 15:51:14.642350996 -0600 +@@ -2543,12 +2543,12 @@ INT select_degree_reihe(a,b,c) OP a,b,c; + + if (S_O_K(a) != REIHE) + { +- erg += WTT("select_degree_reihe",a,b); ++ WTT("select_degree_reihe",a,b); + goto sdr_ende; + } + if (S_O_K(b) != INTEGER) + { +- erg += WTT("select_degree_reihe",a,b); ++ WTT("select_degree_reihe",a,b); + goto sdr_ende; + } + if (S_I_I(b) < 0L) +--- sb.c.orig 2018-10-11 15:28:04.083046837 -0600 ++++ sb.c 2018-10-11 15:51:29.459087847 -0600 +@@ -28,7 +28,7 @@ INT cast_apply_schubert(a) OP a; + erg += m_scalar_schubert(a,a); + break; + default: +- erg += WTO("cast_apply_schubert",a); ++ WTO("cast_apply_schubert",a); + break; + } + ENDR("cast_apply_schubert"); +--- sr.c.orig 2012-05-08 13:46:03.740466881 -0600 ++++ sr.c 2018-10-11 15:53:09.403312813 -0600 +@@ -2926,7 +2926,7 @@ INT mult_elmsym_scalar(a,b,c) OP a,b,c; + case MONOMIAL: erg += monomialf(a,b,c); goto endr_ende;\ + case ELMSYM: erg += elmsymf(a,b,c); goto endr_ende;\ + case POWSYM: erg += powsymf(a,b,c); goto endr_ende;\ +- default: erg += WTO(t,b); goto endr_ende;\ ++ default: WTO(t,b); goto endr_ende;\ + } + + INT mult_schur(a,b,c) OP a,b,c; +@@ -3255,7 +3255,7 @@ INT t_MONOMIAL_MONOMIAL(a,b) OP a,b; { r + case MONOMIAL: erg += monomialf(a,b); goto ende;\ + case ELMSYM: erg += elmsymf(a,b); goto ende;\ + case POWSYM: erg += powsymf(a,b); goto ende;\ +- default: erg += WTO(t,a); goto ende;\ ++ default: WTO(t,a); goto ende;\ + }\ + ende: + +--- vc.c.orig 2018-10-11 15:28:36.354473729 -0600 ++++ vc.c 2018-10-11 15:53:27.897984344 -0600 +@@ -424,12 +424,12 @@ INT add_vector(a,b,c) OP a, b, c; + CTO(EMPTY,"add_vector(3)",c); + if (not VECTORP(b)) + { +- erg += WTO("add_vector(2)",b); ++ WTO("add_vector(2)",b); + goto endr_ende; + } + if (not VECTORP(a)) + { +- erg += WTO("add_vector(1)",a); ++ WTO("add_vector(1)",a); + goto endr_ende; + } + CTO(EMPTY,"add_vector(3)",c); diff --git a/symmetrica.spec b/symmetrica.spec index 5b2acc9..4e460bb 100644 --- a/symmetrica.spec +++ b/symmetrica.spec @@ -1,6 +1,6 @@ Name: symmetrica Version: 2.0 -Release: 20%{?dist} +Release: 21%{?dist} Summary: A Collection of Routines for Solving Symmetric Groups # Note: they claim it's 'public domain' but then provide this: # http://www.algorithm.uni-bayreuth.de/en/research/SYMMETRICA/copyright_engl.html @@ -16,6 +16,16 @@ Patch1: symmetrica-int.patch # Will not be sent upstream, as it is GCC-specific. Add function attributes # to quiet GCC warnings and improve opportunities for optimization. Patch2: symmetrica-attribute.patch +# Patch from sagemath to fix use-after-free in the bruch code. +Patch3: symmetrica-bruch.patch +# Patch from sagemath to fix issues on 64-bit systems +Patch4: symmetrica-int32.patch +# Patch from sagemath to fix return values of rec01() +Patch5: symmetrica-rec01.patch +# Silence -Wsequence-point output from gcc +Patch6: symmetrica-seq-point.patch +# Add an omitted pointer dereference +Patch7: symmetrica-deref.patch BuildRequires: gcc-c++ @@ -48,10 +58,7 @@ developing applications that use %{name}. %prep -%setup -q -c -%patch0 -%patch1 -%patch2 +%autosetup -p0 -c # Don't print the banner on every library load and API function call sed -i "s/^\(INT no_banner = \)FALSE/\1TRUE/" de.c @@ -114,6 +121,13 @@ install -m 644 *.h $RPM_BUILD_ROOT%{_includedir}/%{name}/ %changelog +* Thu Oct 11 2018 Jerry James - 2.0-21 +- Add -bruch patch to fix use-after-free problems in the bruch code +- Add -int32 patch to fix problems on 64-bit systems +- Add -rec01 patch to fix return values of rec01() +- Add -seq-point patch to fix undefined behavior +- Add -deref patch to fix a pointer to character comparison + * Sat Jul 14 2018 Fedora Release Engineering - 2.0-20 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild