Xcos sim: fix some Coverity issues 21/12921/2
Clément DAVID [Mon, 14 Oct 2013 15:43:47 +0000 (17:43 +0200)]
Change-Id: I74bc4139223d6d609d657f650a62203bfaf00f50

scilab/modules/scicos/sci_gateway/c/sci_model2blk.c
scilab/modules/scicos/sci_gateway/c/sci_scicosim.c
scilab/modules/scicos/src/c/extractblklist.c

index e478cd1..488a6ec 100644 (file)
@@ -225,19 +225,19 @@ int sci_model2blk(char *fname, unsigned long fname_len)
                 Scierror(888, _("%s : type 2 function not allowed for scilab blocks\n"), fname);
                 return 0;
             case 3:
-                Block.funpt = sciblk2;
+                Block.funpt = (voidg) sciblk2;
                 Block.type = 2;
                 break;
             case 5:
-                Block.funpt = sciblk4;
+                Block.funpt = (voidg) sciblk4;
                 Block.type = 4;
                 break;
             case 99: /* debugging block */
-                Block.funpt = sciblk4;
+                Block.funpt = (voidg) sciblk4;
                 Block.type = 4;
                 break;
             case 10005:
-                Block.funpt = sciblk4;
+                Block.funpt = (voidg) sciblk4;
                 Block.type = 10004;
                 break;
             default :
@@ -248,7 +248,7 @@ int sci_model2blk(char *fname, unsigned long fname_len)
     }
     else if (lfunpt <= ntabsim)
     {
-        Block.funpt = *(tabsim[lfunpt - 1].fonc);
+        Block.funpt = (voidg) * (tabsim[lfunpt - 1].fonc);
         Block.scsptr = 0;
     }
     else
@@ -2111,52 +2111,60 @@ int sci_model2blk(char *fname, unsigned long fname_len)
     ilh          = (int *) (listentry(il1, n));
     mh           = ilh[1];
     nh           = ilh[2];
-    Block.label  = "";
     if (mh * nh != 0)
     {
         len_str  = ilh[5] - 1;
-        if (len_str != 0)
+        if (len_str < 0)
         {
-            if ((Block.label = (char *) MALLOC((len_str + 1) * sizeof(char))) == NULL)
-            {
-                for (j = 0; j < Block.nin; j++)
-                {
-                    FREE(Block.inptr[j]);
-                }
-                FREE(Block.inptr);
-                FREE(Block.insz);
-                for (j = 0; j < Block.nout; j++)
-                {
-                    FREE(Block.outptr[j]);
-                }
-                FREE(Block.outptr);
-                FREE(Block.outsz);
-                FREE(Block.evout);
-                FREE(Block.x);
-                FREE(Block.xd);
-                FREE(Block.xprop);
-                FREE(Block.res);
-                FREE(Block.z);
-                FREE(Block.ozsz);
-                FREE(Block.oztyp);
-                for (j = 0; j < Block.noz; j++)
-                {
-                    FREE(Block.ozptr[j]);
-                }
-                FREE(Block.rpar);
-                FREE(Block.ipar);
-                FREE(Block.oparsz);
-                FREE(Block.opartyp);
-                for (j = 0; j < Block.nopar; j++)
-                {
-                    FREE(Block.oparptr[j]);
-                }
-                Scierror(888, _("%s : Allocation error.\n"), fname);
-                return 0;
-            }
-            Block.label[len_str] = '\0';
-            C2F(cvstr)(&len_str, &ilh[6], Block.label, (j = 1, &j), len_str);
+            len_str = 0;
+        }
+    }
+    else
+    {
+        len_str = 0;
+    }
+    if ((Block.label = (char *) MALLOC((len_str + 1) * sizeof(char))) == NULL)
+    {
+        for (j = 0; j < Block.nin; j++)
+        {
+            FREE(Block.inptr[j]);
+        }
+        FREE(Block.inptr);
+        FREE(Block.insz);
+        for (j = 0; j < Block.nout; j++)
+        {
+            FREE(Block.outptr[j]);
         }
+        FREE(Block.outptr);
+        FREE(Block.outsz);
+        FREE(Block.evout);
+        FREE(Block.x);
+        FREE(Block.xd);
+        FREE(Block.xprop);
+        FREE(Block.res);
+        FREE(Block.z);
+        FREE(Block.ozsz);
+        FREE(Block.oztyp);
+        for (j = 0; j < Block.noz; j++)
+        {
+            FREE(Block.ozptr[j]);
+        }
+        FREE(Block.rpar);
+        FREE(Block.ipar);
+        FREE(Block.oparsz);
+        FREE(Block.opartyp);
+        for (j = 0; j < Block.nopar; j++)
+        {
+            FREE(Block.oparptr[j]);
+        }
+        Scierror(888, _("%s : Allocation error.\n"), fname);
+        return 0;
+    }
+
+    Block.label[len_str] = '\0';
+    if (len_str > 0)
+    {
+        C2F(cvstr)(&len_str, &ilh[6], Block.label, (j = 1, &j), len_str);
     }
 
     /* zero crossing */
@@ -2452,10 +2460,7 @@ int sci_model2blk(char *fname, unsigned long fname_len)
     {
         FREE(Block.oparptr[j]);
     }
-    if (len_str != 0)
-    {
-        FREE(Block.label);
-    }
+    FREE(Block.label);
     FREE(Block.g);
     FREE(Block.jroot);
     FREE(Block.mode);
index 9eeabc3..3488842 100644 (file)
@@ -363,6 +363,9 @@ int sci_scicosim(char *fname, unsigned long fname_len)
     int i = 0, j = 0, k = 0;      /*local counter variable*/
     int sz_str = 0;     /*local variable to store size of string*/
     int err_check = 0;  /*local variable for cross var. checking dimension*/
+    char* error = NULL;
+    BOOL allocatedError = FALSE;
+#define MAX_ERROR_LEN 512
 
     /*definition of min/max input/output argument*/
     static int minlhs = 1, maxlhs = 2;
@@ -2286,6 +2289,7 @@ int sci_scicosim(char *fname, unsigned long fname_len)
                             FREE(lfunpt);
                             freeparam;
                             FREE(outtb_elem);
+                            return 0;
                             break;
                     }
                     break;
@@ -2535,98 +2539,129 @@ int sci_scicosim(char *fname, unsigned long fname_len)
         switch (ierr)
         {
             case 1  :
-                strcpy(C2F(cha1).buf, _("scheduling problem"));
+                error = _("scheduling problem");
                 C2F(curblk).kfun = 0;
                 break;
 
             case 2  :
-                strcpy(C2F(cha1).buf, _("input to zero-crossing stuck on zero"));
+                error = _("input to zero-crossing stuck on zero");
                 C2F(curblk).kfun = 0;
                 break;
 
             case 3  :
-                strcpy(C2F(cha1).buf, _("event conflict"));
+                error = _("event conflict");
                 C2F(curblk).kfun = 0;
                 break;
 
             case 4  :
-                strcpy(C2F(cha1).buf, _("algebraic loop detected"));
+                error = _("algebraic loop detected");
                 C2F(curblk).kfun = 0;
                 break;
 
             case 5  :
-                strcpy(C2F(cha1).buf, _("cannot allocate memory"));
+                error = _("cannot allocate memory");
                 C2F(curblk).kfun = 0;
                 break;
 
             case 6  :
-                sprintf(C2F(cha1).buf, _("the block %d has been called with input out of its domain"), C2F(curblk).kfun);
+                error = MALLOC(MAX_ERROR_LEN);
+                if (error != NULL)
+                {
+                    allocatedError = TRUE;
+                    snprintf(error, MAX_ERROR_LEN, _("the block %d has been called with input out of its domain"), C2F(curblk).kfun);
+                }
+                else
+                {
+                    error = _("cannot allocate memory");
+                }
                 break;
 
             case 7  :
-                strcpy(C2F(cha1).buf, _("singularity in a block"));
+                error = _("singularity in a block");
                 break;
 
             case 8  :
-                strcpy(C2F(cha1).buf, _("block produces an internal error"));
+                error = _("block produces an internal error");
                 break;
 
             case 10  :
-                strcpy(C2F(cha1).buf, coserr.buf);
+                error = coserr.buf;
                 break;
 
             case 20  :
-                strcpy(C2F(cha1).buf, _("initial conditions not converging"));
+                error = _("initial conditions not converging");
                 break;
 
             case 21  :
-                sprintf(C2F(cha1).buf, _("cannot allocate memory in block=%d"), C2F(curblk).kfun);
+                error = MALLOC(MAX_ERROR_LEN);
+                if (error != NULL)
+                {
+                    allocatedError = TRUE;
+                    snprintf(error, MAX_ERROR_LEN, _("cannot allocate memory in block=%d"), C2F(curblk).kfun);
+                }
+                else
+                {
+                    error = _("cannot allocate memory");
+                }
                 break;
 
             case 22  :
-                strcpy(C2F(cha1).buf, _("sliding mode condition, cannot integrate"));
+                error = _("sliding mode condition, cannot integrate");
                 break;
 
             case 23  :
-                strcpy(C2F(cha1).buf, _("Cannot find the initial mode, maybe there is a sliding mode condition"));
+                error = _("Cannot find the initial mode, maybe there is a sliding mode condition");
                 break;
             case 24  :
-                strcpy(C2F(cha1).buf, _("You have changed a parameter in your model, but the model has been compiled to use an XML file containing initial values and parameters. So you should either recompile your Scicos diagram or [re]launch the initialization interface to regenerate the XML file  with new parameters."));
+                error = _("You have changed a parameter in your model, but the model has been compiled to use an XML file containing initial values and parameters. So you should either recompile your Scicos diagram or [re]launch the initialization interface to regenerate the XML file  with new parameters.");
                 break;
 
             case 25  :
-                strcpy(C2F(cha1).buf, _("Undefined data type."));
+                error = _("Undefined data type.");
                 break;
             case 26  :
-                strcpy(C2F(cha1).buf, _("The number of parameter provided by Scicos blocks is different from what expected by the code generated by the Modelica compiler. You might have relaxed a parameter using FIXED property (i.e., fixed=false) in a Modelica model. This will be corrected in the next version"));
+                error = _("The number of parameter provided by Scicos blocks is different from what expected by the code generated by the Modelica compiler. You might have relaxed a parameter using FIXED property (i.e., fixed=false) in a Modelica model. This will be corrected in the next version");
                 break;
                 /*In this case, you need to turn off the parameter embedded code generation mode by setting Modelica_ParEmb=%f in the Scilab command window, and  recompile the Scicos diagram*/
 
             default  :
                 if (ierr >= 1000)
                 {
-                    strcpy(C2F(cha1).buf, _("unknown or erroneous block"));
+                    error = _("unknown or erroneous block");
                 }
                 else if (ierr >= 201 && ierr <= 416) /* Sundials error messages, stocked in coserr.buf */
                 {
-                    strcpy(C2F(cha1).buf, coserr.buf);
+                    error = coserr.buf;
                 }
                 else if (ierr >= 100)
                 {
                     istate = -(ierr - 100);
-                    sprintf(C2F(cha1).buf, _("integration problem istate=%d"), istate);
+                    error = MALLOC(MAX_ERROR_LEN);
+                    if (error != NULL)
+                    {
+                        allocatedError = TRUE;
+                        snprintf(error, MAX_ERROR_LEN, _("integration problem istate=%d"), istate);
+                    }
+                    else
+                    {
+                        error = _("cannot allocate memory");
+                    }
                     C2F(curblk).kfun = 0;
                 }
                 else
                 {
-                    strcpy(C2F(cha1).buf, _("scicos unexpected error, please report..."));
+                    error = _("scicos unexpected error, please report...");
                     C2F(curblk).kfun = 0;
                 }
                 break;
         }
         if (! (C2F(errgst).err1 > 0 || C2F(iop).err > 0))
         {
-            Scierror(888, "%s\n", C2F(cha1).buf);
+            Scierror(888, "%s\n", error);
+            if (allocatedError)
+            {
+                FREE(error);
+            }
             /*C2F(curblk).kfun=0;*/
             C2F(com).fun = 0; /*set common fun=0 (this disable bug in debug mode)*/
             freeparam;
index 1514692..c5f1898 100644 (file)
@@ -1,6 +1,7 @@
 /*  Scicos
 *
 *  Copyright (C) INRIA - Alan LAYEC
+*  Copyright (C) 2013 - Scilab Enterprises - Clement DAVID
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
@@ -126,6 +127,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->z      = NULL;
     assert(Block->nz == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->z = (double *) MALLOC(Block->nz * sizeof(double))) == NULL)
@@ -165,6 +167,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->ozsz   = NULL;
     assert(2 * Block->noz == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->ozsz = (int *) MALLOC(2 * Block->noz * sizeof(int))) == NULL)
@@ -194,6 +197,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->oztyp  = NULL;
     assert(Block->noz == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->oztyp = (int *) MALLOC(Block->noz * sizeof(int))) == NULL)
@@ -241,6 +245,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
             mh2  = ilh2[1];
             nh2  = ilh2[2];
             Block->ozptr[i] = NULL;
+            assert(mh2 * nh2 >= 0);
             switch (Block->oztyp[i])
             {
                 case 10  :
@@ -430,6 +435,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->x      = NULL;
     assert(Block->nx == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->x = (double *) MALLOC(Block->nx * sizeof(double))) == NULL)
@@ -472,6 +478,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->xd     = NULL;
     assert(Block->nx == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->xd = (double *) MALLOC(Block->nx * sizeof(double))) == NULL)
@@ -516,6 +523,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->res    = NULL;
     assert(Block->nx == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->res = (double *) MALLOC(Block->nx * sizeof(double))) == NULL)
@@ -586,6 +594,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->insz   = NULL;
     assert(3 * Block->nin == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->insz = (int *) MALLOC(3 * Block->nin * sizeof(int))) == NULL)
@@ -634,6 +643,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->inptr  = NULL;
     assert(Block->nin == mh);
+    assert(mh >= 0);
     if (Block->nin > 0)
     {
         if ((Block->inptr = (void **) MALLOC(Block->nin * sizeof(void *))) == NULL)
@@ -659,6 +669,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
             mh2  = ilh2[1];
             nh2  = ilh2[2];
             Block->inptr[i] = NULL;
+            assert(mh2 * nh2 >= 0);
             switch (Block->insz[2 * Block->nin + i])
             {
                 case 10  :
@@ -939,6 +950,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->outsz   = NULL;
     assert(3 * Block->nout == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->outsz = (int *) MALLOC(3 * Block->nout * sizeof(int))) == NULL)
@@ -1000,6 +1012,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->outptr = NULL;
     assert(Block->nout == mh);
+    assert(mh >= 0);
     if (Block->nout > 0)
     {
         if ((Block->outptr = (void **) MALLOC(Block->nout * sizeof(void *))) == NULL)
@@ -1031,6 +1044,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
             mh2  = ilh2[1];
             nh2  = ilh2[2];
             Block->outptr[i] = NULL;
+            assert(mh2 * nh2 >= 0);
             switch (Block->outsz[2 * Block->nout + i])
             {
                 case 10  :
@@ -1370,6 +1384,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->evout  = NULL;
     assert(Block->nevout == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->evout = (double *) MALLOC(Block->nevout * sizeof(double))) == NULL)
@@ -1479,6 +1494,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->rpar   = NULL;
     assert(Block->nrpar == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->rpar = (double *) MALLOC(Block->nrpar * sizeof(double))) == NULL)
@@ -1591,6 +1607,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->ipar   = NULL;
     assert(Block->nipar == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->ipar = (int *) MALLOC(Block->nipar * sizeof(int))) == NULL)
@@ -1705,6 +1722,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->oparsz = NULL;
     assert(2 * Block->nopar == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->oparsz = (int *) MALLOC(2 * Block->nopar * sizeof(int))) == NULL)
@@ -1784,6 +1802,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->opartyp = NULL;
     assert(Block->nopar == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->opartyp = (int *) MALLOC(Block->nopar * sizeof(int))) == NULL)
@@ -1865,6 +1884,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh             = ilh[2];
     Block->oparptr = NULL;
     assert(Block->nopar == mh);
+    assert(mh >= 0);
     if (Block->nopar > 0)
     {
         if ((Block->oparptr = (void **) MALLOC(Block->nopar * sizeof(void *))) == NULL)
@@ -1907,6 +1927,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
             mh2  = ilh2[1];
             nh2  = ilh2[2];
             Block->oparptr[i] = NULL;
+            assert(mh2 * nh2 >= 0);
             switch (Block->opartyp[i])
             {
                 case 10  :
@@ -2346,6 +2367,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->g      = NULL;
     assert(Block->ng == mh * nh);
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->g = (double *) MALLOC(Block->ng * sizeof(double))) == NULL)
@@ -2484,6 +2506,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     mh            = ilh[1];
     nh            = ilh[2];
     Block->jroot  = NULL;
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->jroot = (int *) MALLOC((mh * nh) * sizeof(int))) == NULL)
@@ -2577,56 +2600,64 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     ilh           = (int *) (listentry(il, n));
     mh            = ilh[1];
     nh            = ilh[2];
-    Block->label  = "";
-    if (mh * nh > 0)
+    Block->label  = NULL;
+    if (mh * nh != 0)
     {
-        len_str  = ilh[4 + mh * nh] + 1;
-        if (len_str > 0)
+        len_str  = ilh[5] - 1;
+        if (len_str < 0)
         {
-            if ((Block->label = (char *) MALLOC((len_str + 1) * sizeof(char))) == NULL)
-            {
-                FREE(Block->z);
-                FREE(Block->ozsz);
-                FREE(Block->oztyp);
-                for (j = 0; j < Block->noz; j++)
-                {
-                    FREE(Block->ozptr[j]);
-                }
-                FREE(Block->ozptr);
-                FREE(Block->x);
-                FREE(Block->xd);
-                FREE(Block->res);
-                FREE(Block->insz);
-                for (j = 0; j < Block->nin; j++)
-                {
-                    FREE(Block->inptr[j]);
-                }
-                FREE(Block->inptr);
-                FREE(Block->outsz);
-                for (j = 0; j < Block->nout; j++)
-                {
-                    FREE(Block->outptr[j]);
-                }
-                FREE(Block->outptr);
-                FREE(Block->evout);
-                FREE(Block->rpar);
-                FREE(Block->ipar);
-                FREE(Block->oparsz);
-                FREE(Block->opartyp);
-                for (j = 0; j < Block->nopar; j++)
-                {
-                    FREE(Block->oparptr[j]);
-                }
-                FREE(Block->oparptr);
-                FREE(Block->g);
-                FREE(Block->jroot);
-                *ierr = -39;
-                return 0;
-            }
-            Block->label[len_str] = '\0';
-            C2F(cvstr)(&len_str, &ilh[4 + mh * nh + 1], Block->label, (j = 1, &j), len_str);
+            len_str = 0;
         }
     }
+    else
+    {
+        len_str = 0;
+    }
+    if ((Block->label = (char *) MALLOC((len_str + 1) * sizeof(char))) == NULL)
+    {
+        FREE(Block->z);
+        FREE(Block->ozsz);
+        FREE(Block->oztyp);
+        for (j = 0; j < Block->noz; j++)
+        {
+            FREE(Block->ozptr[j]);
+        }
+        FREE(Block->ozptr);
+        FREE(Block->x);
+        FREE(Block->xd);
+        FREE(Block->res);
+        FREE(Block->insz);
+        for (j = 0; j < Block->nin; j++)
+        {
+            FREE(Block->inptr[j]);
+        }
+        FREE(Block->inptr);
+        FREE(Block->outsz);
+        for (j = 0; j < Block->nout; j++)
+        {
+            FREE(Block->outptr[j]);
+        }
+        FREE(Block->outptr);
+        FREE(Block->evout);
+        FREE(Block->rpar);
+        FREE(Block->ipar);
+        FREE(Block->oparsz);
+        FREE(Block->opartyp);
+        for (j = 0; j < Block->nopar; j++)
+        {
+            FREE(Block->oparptr[j]);
+        }
+        FREE(Block->oparptr);
+        FREE(Block->g);
+        FREE(Block->jroot);
+        *ierr = -39;
+        return 0;
+    }
+    Block->label[len_str] = '\0';
+    if (len_str > 0)
+    {
+        C2F(cvstr)(&len_str, &ilh[4 + mh * nh + 1], Block->label, (j = 1, &j), len_str);
+    }
 
     /* 37 - work*/
     n            = MlistGetFieldNumber(il, "work");
@@ -2667,17 +2698,16 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
         FREE(Block->oparptr);
         FREE(Block->g);
         FREE(Block->jroot);
-        if (len_str != 0)
-        {
-            FREE(Block->label);
-        }
+        FREE(Block->label);
         *ierr = 98;
         return 0;
     }
     ilh           = (int *) (listentry(il, n));
     mh            = ilh[1];
     nh            = ilh[2];
-    Block->work = (void**) ((int) * ((double *)(&ilh[4])));
+    // pointer value is stored on double values, restoring as a copy will take
+    // care of alignement issues and pointer size issues.
+    memcpy(&Block->work, &ilh[4], sizeof(void**));
 
     /* 38 - nmode*/
     n            = MlistGetFieldNumber(il, "nmode");
@@ -2718,10 +2748,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
         FREE(Block->oparptr);
         FREE(Block->g);
         FREE(Block->jroot);
-        if (len_str != 0)
-        {
-            FREE(Block->label);
-        }
+        FREE(Block->label);
         *ierr = 98;
         return 0;
     }
@@ -2769,10 +2796,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
         FREE(Block->oparptr);
         FREE(Block->g);
         FREE(Block->jroot);
-        if (len_str != 0)
-        {
-            FREE(Block->label);
-        }
+        FREE(Block->label);
         *ierr = 98;
         return 0;
     }
@@ -2781,6 +2805,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     nh            = ilh[2];
     Block->mode   = NULL;
     assert(Block->nmode == mh * nh);
+    assert(mh * nh >= 0);
     if (Block->nmode > 0)
     {
         if ((Block->mode = (int *) MALLOC(Block->nmode * sizeof(int))) == NULL)
@@ -2820,10 +2845,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
             FREE(Block->oparptr);
             FREE(Block->g);
             FREE(Block->jroot);
-            if (len_str != 0)
-            {
-                FREE(Block->label);
-            }
+            FREE(Block->label);
             *ierr = -39;
             return 0;
         }
@@ -2873,10 +2895,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
         FREE(Block->oparptr);
         FREE(Block->g);
         FREE(Block->jroot);
-        if (len_str != 0)
-        {
-            FREE(Block->label);
-        }
+        FREE(Block->label);
         FREE(Block->mode);
         *ierr = 98;
         return 0;
@@ -2885,6 +2904,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
     mh            = ilh[1];
     nh            = ilh[2];
     Block->xprop  = NULL;
+    assert(mh * nh >= 0);
     if (mh * nh > 0)
     {
         if ((Block->xprop = (int *) MALLOC((mh * nh) * sizeof(int))) == NULL)
@@ -2924,10 +2944,7 @@ int extractblklist(int *il, scicos_block *Block, int *ierr)
             FREE(Block->oparptr);
             FREE(Block->g);
             FREE(Block->jroot);
-            if (len_str != 0)
-            {
-                FREE(Block->label);
-            }
+            FREE(Block->label);
             FREE(Block->mode);
             *ierr = -39;
             return 0;