Description: TODO: Put a short summary on the line above and replace this paragraph with a longer explanation of this change. Complete the meta-information with other relevant fields (see below for details). To make it easier, the information below has been extracted from the changelog. Adjust it or drop it. . gcl (2.6.12-37) unstable; urgency=medium . * Version_2_6_13pre49 Author: Camm Maguire --- The information above should follow the Patch Tagging Guidelines, please checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here are templates for supplementary fields that you might want to add: Origin: , Bug: Bug-Debian: https://bugs.debian.org/ Bug-Ubuntu: https://launchpad.net/bugs/ Forwarded: Reviewed-By: Last-Update: 2016-10-04 --- gcl-2.6.12.orig/o/array.c +++ gcl-2.6.12/o/array.c @@ -850,31 +850,33 @@ raw_aet_ptr(object x, short int typ) */ void -gset(void *p1, void *val, int n, int typ) -{ if (val==0) +gset(void *p1, void *val, int n, int typ) { + + if (val==0) val = aet_types[typ].dflt; - switch (typ){ + + switch (typ){ #define GSET(p,n,typ,val) {typ x = *((typ *) val); GSET1(p,n,typ,x)} -#define GSET1(p,n,typ,val) while (n-- > 0) \ +#define GSET1(p,n,typ,val) while (n-- > 0) \ { *((typ *) p) = val; \ - p = p + sizeof(typ); \ - } break; + p = p + sizeof(typ); \ + } break; - case aet_object: GSET(p1,n,object,val); - case aet_ch: GSET(p1,n,char,val); - /* Note n is number of fixnum WORDS for bit */ - case aet_bit: GSET(p1,n,fixnum,val); - case aet_fix: GSET(p1,n,fixnum,val); - case aet_sf: GSET(p1,n,shortfloat,val); - case aet_lf: GSET(p1,n,longfloat,val); - case aet_char: GSET(p1,n,char,val); - case aet_uchar: GSET(p1,n,unsigned char,val); - case aet_short: GSET(p1,n,short,val); - case aet_ushort: GSET(p1,n,unsigned short,val); - default: FEerror("bad elttype",0); - } + case aet_object: GSET(p1,n,object,val); + case aet_ch: GSET(p1,n,char,val); + /* Note n is number of fixnum WORDS for bit */ + case aet_bit: GSET(p1,n,fixnum,val); + case aet_fix: GSET(p1,n,fixnum,val); + case aet_sf: GSET(p1,n,shortfloat,val); + case aet_lf: GSET(p1,n,longfloat,val); + case aet_char: GSET(p1,n,char,val); + case aet_uchar: GSET(p1,n,unsigned char,val); + case aet_short: GSET(p1,n,short,val); + case aet_ushort: GSET(p1,n,unsigned short,val); + default: FEerror("bad elttype",0); } +} #define W_SIZE (BV_BITS*sizeof(fixnum)) @@ -894,38 +896,43 @@ implementation dependent results.") int n1=fix(n1o),nc; if (VFUN_NARGS==4) { n1 = x->v.v_dim - i1;} - if (typ1==aet_bit) - {if (i1 % CHAR_SIZE) - badcopy: - FEerror("Bit copies only if aligned",0); - else - {int rest=n1%CHAR_SIZE; - if (rest!=0 ) - {if (typ2!=aet_bit) - goto badcopy; - {while(rest> 0) - { fSaset1(y,i2+n1-rest,(fLrow_major_aref(x,i1+n1-rest))); - rest--;} - }} - i1=i1/CHAR_SIZE ; - n1=n1/CHAR_SIZE; - typ1=aet_char; - }}; - if (typ2==aet_bit) - {if (i2 % CHAR_SIZE) - goto badcopy; - i2=i2/CHAR_SIZE ;} - if ((typ1 ==aet_object || - typ2 ==aet_object) && typ1 != typ2) + if (typ1==aet_bit) { + if (i1 % CHAR_SIZE) + badcopy: + FEerror("Bit copies only if aligned",0); + else { + int rest=n1%CHAR_SIZE; + if (rest!=0) { + if (typ2!=aet_bit) + goto badcopy; + while(rest> 0) { + fSaset1(y,i2+n1-rest,(fLrow_major_aref(x,i1+n1-rest))); + rest--; + } + } + i1=i1/CHAR_SIZE ; + n1=n1/CHAR_SIZE; + typ1=aet_char; + } + } + + if (typ2==aet_bit) { + if (i2 % CHAR_SIZE) + goto badcopy; + i2=i2/CHAR_SIZE ; + } + + if ((typ1 ==aet_object || typ2 ==aet_object) && typ1 != typ2) FEerror("Can't copy between different array types",0); nc=n1 * aet_sizes[(int)typ1]; - if (i1+n1 > x->a.a_dim - || ((y->a.a_dim - i2) *aet_sizes[(int)typ2]) < nc) + if (i1+n1 > x->a.a_dim || ((y->a.a_dim - i2) *aet_sizes[(int)typ2]) < nc) FEerror("Copy out of bounds",0); bcopy(x->ust.ust_self + (i1*aet_sizes[(int)typ1]), y->ust.ust_self + (i2*aet_sizes[(int)typ2]), nc); + return x; + } /* X is the header of an array. This supplies the body which --- gcl-2.6.12.orig/o/predicate.c +++ gcl-2.6.12/o/predicate.c @@ -744,14 +744,13 @@ BEGIN: if (tx == t_complex) return(contains_sharp_comma(x->cmp.cmp_real) || contains_sharp_comma(x->cmp.cmp_imag)); - if (tx == t_vector) - { - int i; - if (x->v.v_elttype == aet_object) - for (i = 0; i < x->v.v_fillp; i++) - if (contains_sharp_comma(x->v.v_self[i])) - return(TRUE); - return(FALSE); + if (tx == t_vector) { + int i; + if (x->v.v_elttype == aet_object) + for (i = 0; i < x->v.v_fillp; i++) + if (contains_sharp_comma(x->v.v_self[i])) + return(TRUE); + return(FALSE); } if (tx == t_cons) { if (x->c.c_car == siSsharp_comma) --- gcl-2.6.12.orig/o/unixsys.c +++ gcl-2.6.12/o/unixsys.c @@ -32,25 +32,39 @@ int vsystem(const char *command) { unsigned j,n=strlen(command)+1; - char *z=alloca(n),**p1,**pp,*c; + char *z,*c; + const char *x1[]={"/bin/sh","-c",NULL,NULL},*spc=" \n\t",**p1,**pp; int s; pid_t pid; - memcpy(z,command,n); - for (j=1,c=z;strtok(c," \n\t");c=NULL,j++); + if (strpbrk(command,"\"'$<>")) - memcpy(z,command,n); - p1=alloca(j*sizeof(*p1)); - for (pp=p1,c=z;(*pp=strtok(c," \n\t"));c=NULL,pp++); + (p1=x1)[2]=command; + + else { + + z=alloca(n); + memcpy(z,command,n); + for (j=1,c=z;strtok(c,spc);c=NULL,j++); + + memcpy(z,command,n); + p1=alloca(j*sizeof(*p1)); + for (pp=p1,c=z;(*pp=strtok(c,spc));c=NULL,pp++); + + } if (!(pid=vfork())) { - execvp(*p1,p1); - _exit(2); + errno=0; + execvp(*p1,(void *)p1); + _exit(128|(errno&0x7f)); } massert(pid>0); massert(pid==waitpid(pid,&s,0)); + if ((s>>8)&128) + emsg("execvp failure when executing '%s': %s\n",command,strerror((s>>8)&0x7f)); + return s; }