More perlio ->Open paranoia. Set errno to EINVAL if there's
Jarkko Hietaniemi [Thu, 12 Jun 2003 13:27:44 +0000 (13:27 +0000)]
no ->Open, not if ->Open returns NULL.

p4raw-id: //depot/perl@19749

perlio.c

index 38db370..78b2d18 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -3405,9 +3405,12 @@ PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
 {
     if (PerlIOValid(f)) {
        PerlIO *next = PerlIONext(f);
-       PerlIO_funcs *tab =  PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
-       next = (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
-                         next, narg, args);
+       PerlIO_funcs *tab =
+            PerlIO_layer_fetch(aTHX_ layers, n - 1, PerlIOBase(next)->tab);
+       if (tab && tab->Open)
+            next =
+                 (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
+                              next, narg, args);
        if (!next || (*PerlIOBase(f)->tab->Pushed) (aTHX_ f, mode, PerlIOArg, self) != 0) {
            return NULL;
        }
@@ -3421,10 +3424,11 @@ PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
             * mode++;
             */
        }
-       f = tab && tab->Open ?
-         (*tab->Open) (aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
-                       f, narg, args)
-         : Nullfp;
+       if (tab && tab->Open)
+            f = (*tab->Open)(aTHX_ tab, layers, n - 1, mode, fd, imode, perm,
+                             f, narg, args);
+       else
+            SETERRNO(EINVAL, LIB_INVARG);
        if (f) {
            if (PerlIO_push(aTHX_ f, self, mode, PerlIOArg) == 0) {
                /*
@@ -3453,8 +3457,6 @@ PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers,
 #endif
            }
        }
-       else
-           SETERRNO(EINVAL, SS_IVCHAN);
     }
     return f;
 }