isl_basic_set_opt: avoid invalid access on error path
[platform/upstream/isl.git] / isl_tab_pip.c
index d5ed654..7fb34c7 100644 (file)
@@ -124,6 +124,8 @@ struct isl_context_lex {
  * "M" describes the solution in terms of the dimensions of "dom".
  * The number of columns of "M" is one more than the total number
  * of dimensions of "dom".
+ *
+ * If "M" is NULL, then there is no solution on "dom".
  */
 struct isl_partial_sol {
        int level;
@@ -322,11 +324,15 @@ static void sol_pop(struct isl_sol *sol)
                        isl_basic_set_free(partial->next->dom);
                        partial->next->dom = bset;
                        M = partial->next->M;
-                       M = isl_mat_drop_cols(M, M->n_col - n, n);
-                       partial->next->M = M;
+                       if (M) {
+                               M = isl_mat_drop_cols(M, M->n_col - n, n);
+                               partial->next->M = M;
+                               if (!M)
+                                       goto error;
+                       }
                        partial->next->level = sol->level;
 
-                       if (!bset || !M)
+                       if (!bset)
                                goto error;
 
                        sol->partial = partial->next;
@@ -2723,6 +2729,8 @@ static struct isl_basic_set *drop_constant_terms(struct isl_basic_set *bset)
 
 static int use_shifted(struct isl_context_gbr *cgbr)
 {
+       if (!cgbr->tab)
+               return 0;
        return cgbr->tab->bmap->n_eq == 0 && cgbr->tab->bmap->n_div == 0;
 }
 
@@ -3214,6 +3222,9 @@ static void *context_gbr_save(struct isl_context *context)
        struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
        struct isl_gbr_tab_undo *snap;
 
+       if (!cgbr->tab)
+               return NULL;
+
        snap = isl_alloc_type(cgbr->tab->mat->ctx, struct isl_gbr_tab_undo);
        if (!snap)
                return NULL;