0a86c7c
--- fmpz_poly/gcd_heuristic.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fmpz_poly/gcd_heuristic.c	2019-02-20 20:46:00.714971279 -0700
0a86c7c
@@ -220,7 +220,7 @@ _fmpz_poly_gcd_heuristic(fmpz * res, con
0a86c7c
    qlimbs = limbs1 - limbsg + 1;
0a86c7c
    qlen = FLINT_MIN(len1, (qlimbs*FLINT_BITS)/pack_bits + 1);
0a86c7c
    qlimbs = (qlen*pack_bits - 1)/FLINT_BITS + 1;
0a86c7c
-   q = flint_calloc(qlimbs, sizeof(mp_limb_t));
0a86c7c
+   q = flint_calloc(qlimbs + 1, sizeof(mp_limb_t));
0a86c7c
    temp = flint_malloc(limbsg*sizeof(mp_limb_t));
0a86c7c
    
0a86c7c
 	divides = 0;
0a86c7c
--- fmpz_poly_mat/clear.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fmpz_poly_mat/clear.c	2019-02-22 09:38:32.089703913 -0700
0a86c7c
@@ -24,6 +24,7 @@
0a86c7c
 ******************************************************************************/
0a86c7c
 
0a86c7c
 #include <stdlib.h>
0a86c7c
+#include <string.h>
0a86c7c
 #include "flint.h"
0a86c7c
 #include "fmpz_poly.h"
0a86c7c
 #include "fmpz_poly_mat.h"
0a86c7c
@@ -41,4 +42,5 @@ fmpz_poly_mat_clear(fmpz_poly_mat_t A)
0a86c7c
         flint_free(A->entries);
0a86c7c
         flint_free(A->rows);
0a86c7c
     }
0a86c7c
+    memset(A, 0, sizeof(*A));
0a86c7c
 }
0a86c7c
--- fmpz_poly_mat/init.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fmpz_poly_mat/init.c	2019-02-22 15:45:34.429403916 -0700
0a86c7c
@@ -24,6 +24,7 @@
0a86c7c
 ******************************************************************************/
0a86c7c
 
0a86c7c
 #include <stdlib.h>
0a86c7c
+#include <string.h>
0a86c7c
 #include "flint.h"
0a86c7c
 #include "fmpz_poly.h"
0a86c7c
 #include "fmpz_poly_mat.h"
0a86c7c
@@ -43,10 +44,10 @@ fmpz_poly_mat_init(fmpz_poly_mat_t A, sl
0a86c7c
 
0a86c7c
         for (i = 0; i < rows; i++)
0a86c7c
             A->rows[i] = A->entries + i * cols;
0a86c7c
+
0a86c7c
+        A->r = rows;
0a86c7c
+        A->c = cols;
0a86c7c
     }
0a86c7c
     else
0a86c7c
-        A->entries = NULL;
0a86c7c
-
0a86c7c
-    A->r = rows;
0a86c7c
-    A->c = cols;
0a86c7c
+        memset(A, 0, sizeof(*A));
0a86c7c
 }
0a86c7c
--- fmpz_poly_mat/window_clear.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fmpz_poly_mat/window_clear.c	2019-02-22 15:42:08.446972613 -0700
0a86c7c
@@ -24,11 +24,15 @@
0a86c7c
 
0a86c7c
 ******************************************************************************/
0a86c7c
 
0a86c7c
+#include <string.h>
0a86c7c
 #include "fmpz_poly_mat.h"
0a86c7c
 
0a86c7c
 void
0a86c7c
 fmpz_poly_mat_window_clear(fmpz_poly_mat_t window)
0a86c7c
 {
0a86c7c
-    if (window->entries)
0a86c7c
+    if (window->rows)
0a86c7c
+    {
0a86c7c
         flint_free(window->rows);
0a86c7c
+        memset(window, 0, sizeof(*window));
0a86c7c
+    }
0a86c7c
 }
0a86c7c
--- fmpz_poly_mat/window_init.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fmpz_poly_mat/window_init.c	2019-02-22 15:44:05.187516816 -0700
0a86c7c
@@ -24,6 +24,7 @@
0a86c7c
 
0a86c7c
 ******************************************************************************/
0a86c7c
 
0a86c7c
+#include <string.h>
0a86c7c
 #include "fmpz_poly_mat.h"
0a86c7c
 
0a86c7c
 void
0a86c7c
@@ -33,12 +34,16 @@ fmpz_poly_mat_window_init(fmpz_poly_mat_
0a86c7c
     slong i;
0a86c7c
     window->entries = NULL;
0a86c7c
 
0a86c7c
-    if (r2 - r1)
0a86c7c
+    if (c2 > c1 && r2 > r1)
0a86c7c
+    {
0a86c7c
         window->rows = flint_malloc((r2 - r1) * sizeof(fmpz_poly_t));
0a86c7c
 
0a86c7c
-    for (i = 0; i < r2 - r1; i++)
0a86c7c
-        window->rows[i] = mat->rows[r1 + i] + c1;
0a86c7c
+        for (i = 0; i < r2 - r1; i++)
0a86c7c
+            window->rows[i] = mat->rows[r1 + i] + c1;
0a86c7c
 
0a86c7c
-    window->r = r2 - r1;
0a86c7c
-    window->c = c2 - c1;
0a86c7c
+         window->r = r2 - r1;
0a86c7c
+         window->c = c2 - c1;
0a86c7c
+    }
0a86c7c
+    else
0a86c7c
+        memset(window, 0, sizeof(*window));
0a86c7c
 }
0a86c7c
--- fq_poly_factor_templates/factor_berlekamp.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fq_poly_factor_templates/factor_berlekamp.c	2019-02-25 15:41:46.136872369 -0700
0a86c7c
@@ -278,6 +278,7 @@ __TEMPLATE(T, poly_factor_berlekamp) (TE
0a86c7c
     TEMPLATE(T, clear) (mul, ctx);
0a86c7c
     fmpz_clear(pow);
0a86c7c
     fmpz_clear(p);
0a86c7c
+    fmpz_clear(q);
0a86c7c
     fmpz_clear(s);
0a86c7c
 }
0a86c7c
 
0a86c7c
--- fq_poly_factor_templates/is_irreducible_ben_or.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fq_poly_factor_templates/is_irreducible_ben_or.c	2019-02-26 19:45:35.681301008 -0700
0a86c7c
@@ -97,6 +97,8 @@ TEMPLATE(T, poly_is_irreducible_ben_or)
0a86c7c
         }
0a86c7c
     }
0a86c7c
 
0a86c7c
+    TEMPLATE(T, poly_clear) (g, ctx);
0a86c7c
+    TEMPLATE(T, poly_clear) (x, ctx);
0a86c7c
     TEMPLATE(T, poly_clear) (xq, ctx);
0a86c7c
     TEMPLATE(T, poly_clear) (xqimx, ctx);
0a86c7c
     TEMPLATE(T, poly_clear) (v, ctx);
0a86c7c
--- fq_poly_templates/div_newton_n_preinv.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fq_poly_templates/div_newton_n_preinv.c	2019-02-24 16:43:41.479823977 -0700
0a86c7c
@@ -94,7 +94,7 @@ TEMPLATE(T, poly_div_newton_n_preinv) (T
0a86c7c
 
0a86c7c
     if (Q == A || Q == B || Q == Binv)
0a86c7c
     {
0a86c7c
-        flint_free(Q->coeffs);
0a86c7c
+        TEMPLATE(T, poly_clear) (Q, ctx);
0a86c7c
         Q->coeffs = q;
0a86c7c
         Q->alloc = lenQ;
0a86c7c
     }
0a86c7c
--- fq_poly_templates/divrem_newton_n_preinv.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fq_poly_templates/divrem_newton_n_preinv.c	2019-02-24 15:23:03.443165017 -0700
0a86c7c
@@ -111,13 +111,13 @@ TEMPLATE(T, poly_divrem_newton_n_preinv)
0a86c7c
 
0a86c7c
     if (Q == A || Q == B || Q == Binv)
0a86c7c
     {
0a86c7c
-        _TEMPLATE(T, vec_clear) (Q->coeffs, lenA - lenB + 1, ctx);
0a86c7c
+        _TEMPLATE(T, vec_clear) (Q->coeffs, Q->alloc, ctx);
0a86c7c
         Q->coeffs = q;
0a86c7c
         Q->alloc = lenA - lenB + 1;
0a86c7c
     }
0a86c7c
     if (R == A || R == B || R == Binv)
0a86c7c
     {
0a86c7c
-        _TEMPLATE(T, vec_clear) (R->coeffs, lenB - 1, ctx);
0a86c7c
+        _TEMPLATE(T, vec_clear) (R->coeffs, R->alloc, ctx);
0a86c7c
         R->coeffs = r;
0a86c7c
         R->alloc = lenB - 1;
0a86c7c
     }
0a86c7c
--- fq_poly_templates/evaluate_fq_vec_fast.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fq_poly_templates/evaluate_fq_vec_fast.c	2019-02-26 08:48:44.651661567 -0700
0a86c7c
@@ -60,6 +60,7 @@ _TEMPLATE4(T, poly_evaluate, T, vec_fast
0a86c7c
                 TEMPLATE(T, set)(vs + i, poly, ctx);
0a86c7c
         
0a86c7c
         TEMPLATE(T, clear)(temp, ctx);
0a86c7c
+        TEMPLATE(T, clear)(inv, ctx);
0a86c7c
         return;
0a86c7c
     }
0a86c7c
 
0a86c7c
--- fq_poly_templates/gcd_hgcd.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fq_poly_templates/gcd_hgcd.c	2019-02-23 17:01:46.896155151 -0700
0a86c7c
@@ -161,6 +161,7 @@ void TEMPLATE(T, poly_gcd_hgcd) (TEMPLAT
0a86c7c
 
0a86c7c
             lenG = _TEMPLATE(T, poly_gcd_hgcd) (g, A->coeffs, lenA,
0a86c7c
                                                 B->coeffs, lenB, invB, ctx);
0a86c7c
+            TEMPLATE(T, clear) (invB, ctx);
0a86c7c
 
0a86c7c
             if (G == A || G == B)
0a86c7c
             {
0a86c7c
--- fq_zech/get_str.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fq_zech/get_str.c	2019-02-26 08:53:54.640290281 -0700
0a86c7c
@@ -28,7 +28,7 @@
0a86c7c
 char *
0a86c7c
 fq_zech_get_str(const fq_zech_t op, const fq_zech_ctx_t ctx)
0a86c7c
 {
0a86c7c
-    char *s = flint_malloc(n_clog(op->value, 10) * sizeof(char));
0a86c7c
+    char *s = flint_malloc(n_clog(op->value, 10) * sizeof(char) + 6U);
0a86c7c
     flint_sprintf(s, "%wd", op->value);
0a86c7c
     return s;
0a86c7c
 }
0a86c7c
--- fq_zech/get_str_pretty.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ fq_zech/get_str_pretty.c	2019-02-26 08:56:59.623084857 -0700
0a86c7c
@@ -30,7 +30,7 @@ char *
0a86c7c
 fq_zech_get_str_pretty(const fq_zech_t op, const fq_zech_ctx_t ctx)
0a86c7c
 {
0a86c7c
     char *s = flint_malloc((n_clog(op->value, 10) + strlen(ctx->fq_nmod_ctx->var) + 1) *
0a86c7c
-                           sizeof(char));
0a86c7c
+                           sizeof(char) + 8U);
0a86c7c
     flint_sprintf(s, "%s^%wd", ctx->fq_nmod_ctx->var, op->value);
0a86c7c
     return s;
0a86c7c
 }
0a86c7c
--- nmod_matxx.h.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ nmod_matxx.h	2019-02-26 09:05:17.432516298 -0700
0a86c7c
@@ -429,8 +429,15 @@ private:
0a86c7c
             nmod_mat_init_set(data[i], o.data[i]);
0a86c7c
     }
0a86c7c
 
0a86c7c
+    void clear(void)
0a86c7c
+    {
0a86c7c
+        for(std::size_t i = 0; i < size_;++i)
0a86c7c
+            nmod_mat_clear(data[i]);
0a86c7c
+        delete[] data;
0a86c7c
+    }
0a86c7c
+
0a86c7c
 public:
0a86c7c
-    ~nmod_mat_vector() {delete[] data;}
0a86c7c
+    ~nmod_mat_vector() {clear();}
0a86c7c
     nmod_mat_vector(slong rows, slong cols, const std::vector<mp_limb_t>& primes)
0a86c7c
     {
0a86c7c
         size_ = primes.size();
0a86c7c
@@ -446,7 +453,7 @@ public:
0a86c7c
 
0a86c7c
     nmod_mat_vector& operator=(const nmod_mat_vector& o)
0a86c7c
     {
0a86c7c
-        delete[] data;
0a86c7c
+        clear();
0a86c7c
         init(o);
0a86c7c
         return *this;
0a86c7c
     }
0a86c7c
--- nmod_poly/get_str_pretty.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ nmod_poly/get_str_pretty.c	2019-02-26 08:44:16.807300744 -0700
0a86c7c
@@ -46,7 +46,7 @@ char * nmod_poly_get_str_pretty(const nm
0a86c7c
     }
0a86c7c
     else if (poly->length == 1)
0a86c7c
     {
0a86c7c
-        size = (ulong) ceil(0.30103*FLINT_BIT_COUNT(poly->coeffs[0]));
0a86c7c
+        size = (ulong) ceil(0.30103*FLINT_BIT_COUNT(poly->coeffs[0])) + 3U;
0a86c7c
         buf = (char *) flint_malloc(size);
0a86c7c
         flint_sprintf(buf, "%wu", poly->coeffs[0]);
0a86c7c
         return buf;
0a86c7c
--- nmod_poly_mat/clear.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ nmod_poly_mat/clear.c	2019-02-22 15:39:58.479593393 -0700
0a86c7c
@@ -23,6 +23,7 @@
0a86c7c
 
0a86c7c
 ******************************************************************************/
0a86c7c
 
0a86c7c
+#include <string.h>
0a86c7c
 #include "flint.h"
0a86c7c
 #include "nmod_poly.h"
0a86c7c
 #include "nmod_poly_mat.h"
0a86c7c
@@ -40,4 +41,5 @@ nmod_poly_mat_clear(nmod_poly_mat_t A)
0a86c7c
         flint_free(A->entries);
0a86c7c
         flint_free(A->rows);
0a86c7c
     }
0a86c7c
+    memset(A, 0, sizeof(*A));
0a86c7c
 }
0a86c7c
--- nmod_poly_mat/init.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ nmod_poly_mat/init.c	2019-02-23 21:04:49.876161996 -0700
0a86c7c
@@ -43,11 +43,15 @@ nmod_poly_mat_init(nmod_poly_mat_t A, sl
0a86c7c
 
0a86c7c
         for (i = 0; i < rows; i++)
0a86c7c
             A->rows[i] = A->entries + i * cols;
0a86c7c
+
0a86c7c
+        A->r = rows;
0a86c7c
+        A->c = cols;
0a86c7c
     }
0a86c7c
     else
0a86c7c
+    {
0a86c7c
         A->entries = NULL;
0a86c7c
-
0a86c7c
+        A->r = 0;
0a86c7c
+        A->c = 0;
0a86c7c
+    }
0a86c7c
     A->modulus = n;
0a86c7c
-    A->r = rows;
0a86c7c
-    A->c = cols;
0a86c7c
 }
0a86c7c
--- nmod_poly_mat/window_clear.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ nmod_poly_mat/window_clear.c	2019-02-22 15:41:56.615120167 -0700
0a86c7c
@@ -23,14 +23,16 @@
0a86c7c
 
0a86c7c
 ******************************************************************************/
0a86c7c
 
0a86c7c
+#include <string.h>
0a86c7c
 #include "nmod_poly_mat.h"
0a86c7c
 
0a86c7c
 void
0a86c7c
 nmod_poly_mat_window_clear(nmod_poly_mat_t window)
0a86c7c
 {
0a86c7c
-    if (window->entries)
0a86c7c
+    if (window->rows)
0a86c7c
     {
0a86c7c
         flint_free(window->rows);
0a86c7c
+        memset(window, 0, sizeof(*window));
0a86c7c
     }
0a86c7c
 
0a86c7c
 }
0a86c7c
--- nmod_poly_mat/window_init.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ nmod_poly_mat/window_init.c	2019-02-22 15:43:46.413750923 -0700
0a86c7c
@@ -23,6 +23,7 @@
0a86c7c
 
0a86c7c
 ******************************************************************************/
0a86c7c
 
0a86c7c
+#include <string.h>
0a86c7c
 #include "nmod_poly_mat.h"
0a86c7c
 
0a86c7c
 void
0a86c7c
@@ -32,12 +33,16 @@ nmod_poly_mat_window_init(nmod_poly_mat_
0a86c7c
     slong i;
0a86c7c
     window->entries = NULL;
0a86c7c
 
0a86c7c
-    if (r2 - r1)
0a86c7c
+    if (c2 > c1 && r2 > r1)
0a86c7c
+    {
0a86c7c
         window->rows = flint_malloc((r2 - r1) * sizeof(nmod_poly_t));
0a86c7c
 
0a86c7c
-    for (i = 0; i < r2 - r1; i++)
0a86c7c
-        window->rows[i] = mat->rows[r1 + i] + c1;
0a86c7c
+        for (i = 0; i < r2 - r1; i++)
0a86c7c
+            window->rows[i] = mat->rows[r1 + i] + c1;
0a86c7c
 
0a86c7c
-    window->r = r2 - r1;
0a86c7c
-    window->c = c2 - c1;
0a86c7c
+        window->r = r2 - r1;
0a86c7c
+        window->c = c2 - c1;
0a86c7c
+    }
0a86c7c
+    else
0a86c7c
+        memset(window, 0, sizeof(*window));
0a86c7c
 }
0a86c7c
--- sscanf.c.orig	2015-08-13 10:16:22.000000000 -0600
0a86c7c
+++ sscanf.c	2019-02-10 13:51:35.212462799 -0700
0a86c7c
@@ -47,7 +47,7 @@ int flint_sscanf(const char * s, const c
0a86c7c
        return 0;
0a86c7c
 
0a86c7c
    str2 = flint_malloc(len + 1);
0a86c7c
-   s2 = flint_malloc(strlen(s) + 1);
0a86c7c
+   s2 = flint_malloc(strlen(s) + 32);
0a86c7c
    
0a86c7c
    /* deal with first substring */
0a86c7c
    n = strcspn(str, "%");