Blame SPECS/ksh-20120801-sh_iovalidfd.patch

Packit 992a25
diff --git a/src/cmd/ksh93/include/io.h b/src/cmd/ksh93/include/io.h
Packit 992a25
--- a/src/cmd/ksh93/include/io.h
Packit 992a25
+++ b/src/cmd/ksh93/include/io.h
Packit 992a25
@@ -79,7 +79,7 @@ extern Sfio_t 	*sh_iostream(Shell_t*,int);
Packit 992a25
 extern int	sh_redirect(Shell_t*,struct ionod*,int);
Packit 992a25
 extern void 	sh_iosave(Shell_t *, int,int,char*);
Packit 992a25
 extern int 	safefdnumber(Shell_t* shp, int sfd);
Packit 992a25
-extern int 	sh_iovalidfd(Shell_t*, int);
Packit 992a25
+extern bool 	sh_iovalidfd(Shell_t*, int);
Packit 992a25
 extern int 	sh_inuse(Shell_t*, int);
Packit 992a25
 extern void 	sh_iounsave(Shell_t*);
Packit 992a25
 extern void	iounpipe(Shell_t*);
Packit 992a25
diff --git a/src/cmd/ksh93/sh/io.c b/src/cmd/ksh93/sh/io.c
Packit 992a25
--- a/src/cmd/ksh93/sh/io.c
Packit 992a25
+++ b/src/cmd/ksh93/sh/io.c
Packit 992a25
@@ -403,38 +403,50 @@ static short		filemapsize;
Packit 992a25
 
Packit 992a25
 /* ======== input output and file copying ======== */
Packit 992a25
 
Packit 992a25
-int  sh_iovalidfd(Shell_t *shp, int fd)
Packit 992a25
+bool  sh_iovalidfd(Shell_t *shp, int fd)
Packit 992a25
 {
Packit 992a25
 	Sfio_t		**sftable = shp->sftable;
Packit 992a25
 	int		max,n, **fdptrs = shp->fdptrs;
Packit 992a25
 	unsigned char	*fdstatus = shp->fdstatus;
Packit 992a25
 	if(fd<0)
Packit 992a25
-		return(0);
Packit 992a25
+		return(false);
Packit 992a25
 	if(fd < shp->gd->lim.open_max)
Packit 992a25
-		return(1);
Packit 992a25
+		return(true);
Packit 992a25
 	max = strtol(astconf("OPEN_MAX",NiL,NiL),NiL,0);
Packit 992a25
 	if(fd >= max)
Packit 992a25
 	{
Packit 992a25
 		errno = EBADF;
Packit 992a25
-		return(0);
Packit 992a25
+		return(false);
Packit 992a25
 	}
Packit 992a25
 	n = (fd+16)&~0xf;
Packit 992a25
-	if(n > max)
Packit 992a25
-		n = max;
Packit 992a25
+	if(n++ > max)
Packit 992a25
+		n = max+1;
Packit 992a25
 	max = shp->gd->lim.open_max;
Packit 992a25
-	shp->sftable = (Sfio_t**)calloc((n+1)*(sizeof(int*)+sizeof(Sfio_t*)+1),1);
Packit 992a25
-	if(max)
Packit 992a25
-		memcpy(shp->sftable,sftable,max*sizeof(Sfio_t*));
Packit 992a25
+	shp->sftable = (Sfio_t**)calloc((n+1)*(sizeof(int*)+sizeof(Sfio_t*)+sizeof(*fdstatus)),1);
Packit 992a25
+
Packit 992a25
+	if(sftable)
Packit 992a25
+	{
Packit 992a25
+		--sftable;
Packit 992a25
+		if(max)
Packit 992a25
+			memcpy(shp->sftable,sftable,++max*sizeof(Sfio_t*));
Packit 992a25
+
Packit 992a25
+	}
Packit 992a25
+
Packit 992a25
 	shp->fdptrs = (int**)(&shp->sftable[n]);
Packit 992a25
 	if(max)
Packit 992a25
-		memcpy(shp->fdptrs,fdptrs,max*sizeof(int*));
Packit 992a25
+		memcpy(shp->fdptrs,--fdptrs,max*sizeof(int*));
Packit 992a25
 	shp->fdstatus = (unsigned char*)(&shp->fdptrs[n]);
Packit 992a25
 	if(max)
Packit 992a25
-		memcpy(shp->fdstatus,fdstatus,max);
Packit 992a25
+		memcpy(shp->fdstatus,--fdstatus,max);
Packit 992a25
+
Packit 992a25
 	if(sftable)
Packit 992a25
 		free((void*)sftable);
Packit 992a25
-	shp->gd->lim.open_max = n;
Packit 992a25
-	return(1);
Packit 992a25
+
Packit 992a25
+	shp->sftable++;
Packit 992a25
+	shp->fdptrs++;
Packit 992a25
+	shp->fdstatus++;
Packit 992a25
+	shp->gd->lim.open_max = n-1;
Packit 992a25
+	return(true);
Packit 992a25
 }
Packit 992a25
 
Packit 992a25
 int  sh_inuse(Shell_t *shp, int fd)