allow "" as select bitmask [PATCH]
Gisle Aas [Fri, 21 Oct 2005 08:04:40 +0000 (01:04 -0700)]
Message-ID: <lrach229o7.fsf_-_@caliper.activestate.com>

p4raw-id: //depot/perl@25818

pp_sys.c
t/op/sselect.t

index cf6a862..b907093 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -1031,14 +1031,14 @@ PP(pp_sselect)
     SP -= 4;
     for (i = 1; i <= 3; i++) {
        SV *sv = SP[i];
-       if (SvOK(sv) && SvREADONLY(sv)) {
+       if (!SvOK(sv))
+           continue;
+       if (SvREADONLY(sv)) {
            if (SvIsCOW(sv))
                sv_force_normal_flags(sv, 0);
-           if (SvREADONLY(sv))
+           if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
                DIE(aTHX_ PL_no_modify);
        }
-       if (!SvOK(sv))
-           continue;
        if (!SvPOK(sv)) {
            if (ckWARN(WARN_MISC))
                 Perl_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
@@ -1093,7 +1093,7 @@ PP(pp_sselect)
 
     for (i = 1; i <= 3; i++) {
        sv = SP[i];
-       if (!SvOK(sv)) {
+       if (!SvOK(sv) || SvCUR(sv) == 0) {
            fd_sets[i] = 0;
            continue;
        }
index 4e50b29..0f877b1 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
 
 require 'test.pl';
 
-plan (6);
+plan (9);
 
 my $blank = "";
 eval {select undef, $blank, $blank, 0};
@@ -18,8 +18,15 @@ eval {select $blank, $blank, undef, 0};
 is ($@, "");
 
 eval {select "", $blank, $blank, 0};
-like ($@, qr/^Modification of a read-only value attempted/);
+is ($@, "");
 eval {select $blank, "", $blank, 0};
-like ($@, qr/^Modification of a read-only value attempted/);
+is ($@, "");
 eval {select $blank, $blank, "", 0};
+is ($@, "");
+
+eval {select "a", $blank, $blank, 0};
+like ($@, qr/^Modification of a read-only value attempted/);
+eval {select $blank, "a", $blank, 0};
+like ($@, qr/^Modification of a read-only value attempted/);
+eval {select $blank, $blank, "a", 0};
 like ($@, qr/^Modification of a read-only value attempted/);