From: Perl 5 Porters Date: Thu, 24 Apr 1997 12:00:00 +0000 (+1200) Subject: [inseparable changes from match from perl-5.003_97h to perl-5.003_97i] X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=fc36a67e8855d031b2a6921819d899eb149eee2d;p=p5sagit%2Fp5-mst-13.2.git [inseparable changes from match from perl-5.003_97h to perl-5.003_97i] CORE PORTABILITY Subject: Provide memset() if it's missing From: Chip Salzenberg Files: global.sym perl.h proto.h util.c Subject: Don't tell GCC that warn(), croak(), and die() are printf-lik From: Chip Salzenberg Files: proto.h DOCUMENTATION Subject: FAQ udpate (24-apr-97) Date: Thu, 24 Apr 1997 16:47:23 -0600 (MDT) From: Nathan Torkington Files: pod/perlfaq*.pod private-msgid: 199704242247.QAA07010@prometheus.frii.com OTHER CORE CHANGES Subject: Misc. sv_vcatpvfn() fixes From: Hugo van der Sanden Files: gv.c mg.c op.c perl.c pp.c pp_ctl.c sv.c toke.c util.c Subject: Enforce order of sprintf() elements From: Chip Salzenberg Files: sv.c Subject: Guard against long numbers, < From: Chip Salzenberg Files: global.sym mg.c perl.c pod/perldiag.pod proto.h toke.c util.c Subject: Guard against C to deeply nested label From: Chip Salzenberg Files: pod/perldiag.pod pp_ctl.c Subject: Guard against overflow in dup2() emulation From: Chip Salzenberg Files: util.c Subject: Win32: Guard against long function names From: Chip Salzenberg Files: win32/win32sck.c Subject: Make mess() always work, by using a non-arena SV From: Chip Salzenberg Files: perl.c util.c Subject: When copying a format line, take only its string value From: Chip Salzenberg Files: sv.c Subject: Fix LEAKTEST numbers From: Chip Salzenberg Files: ext/DynaLoader/dl_vms.xs handy.h os2/os2.c util.c vms/vms.c win32/win32.c win32/win32sck.c --- diff --git a/Changes b/Changes index 075fa39..ab86e21 100644 --- a/Changes +++ b/Changes @@ -46,6 +46,128 @@ And the Keepers of the Patch Pumpkin: ----------------- +Version 5.003_97i +----------------- + +This patch eliminates all known sources of buffer overflow! (And the +crowd goes wild. (Yeah.)) Showstoppers only between here and _98. + + CORE LANGUAGE CHANGES + + (no changes) + + CORE PORTABILITY + + Title: "Provide memset() if it's missing" + From: Chip Salzenberg + Files: global.sym perl.h proto.h util.c + + Title: "Don't tell GCC that warn(), croak(), and die() are printf-lik + From: Chip Salzenberg + Files: proto.h + + OTHER CORE CHANGES + + Title: "Misc. sv_vcatpvfn() fixes" + From: Hugo, Dale, Nick, Hallvard, Chip + Files: gv.c mg.c op.c perl.c pp.c pp_ctl.c sv.c toke.c util.c + + Title: "Enforce order of sprintf() elements" + From: Chip Salzenberg + Files: sv.c + + Title: "Guard against long numbers, <" + From: Chip Salzenberg + Files: global.sym mg.c perl.c pod/perldiag.pod proto.h toke.c util.c + + Title: "Guard against C to deeply nested label" + From: Chip Salzenberg + Files: pod/perldiag.pod pp_ctl.c + + Title: "Guard against overflow in dup2() emulation" + From: Chip Salzenberg + Files: util.c + + Title: "Win32: Guard against long function names" + From: Chip Salzenberg + Files: win32/win32sck.c + + Title: "Make mess() always work, by using a non-arena SV" + From: Chip Salzenberg, from idea by Gurusamy Sarathy + Files: perl.c util.c + + Title: "Fix scalar leak in pp_prtf()" + From: Doug MacEachern + Msg-ID: <199704241706.NAA19140@postman.osf.org> + Date: Thu, 24 Apr 1997 13:06:21 -0400 + Files: pp_sys.c + + Title: "When copying a format line, take only its string value" + From: Chip Salzenberg + Files: sv.c + + Title: "Undo private patch" + From: Chip Salzenberg + Files: installperl lib/ExtUtils/Install.pm + + Title: "Fix LEAKTEST numbers" + From: Chip Salzenberg + Files: ext/DynaLoader/dl_vms.xs handy.h os2/os2.c util.c vms/vms.c + win32/win32.c win32/win32sck.c + + BUILD PROCESS + + Title: "Cope with a that isn't related to DB" + From: Jarkko Hietaniemi + Msg-ID: <199704241728.UAA09951@alpha.hut.fi> + Date: Thu, 24 Apr 1997 20:28:39 +0300 (EET DST) + Files: Configure + + LIBRARY AND EXTENSIONS + + Title: "Always NUL-terminate opsets" + From: Chip Salzenberg + Files: ext/Opcode/Opcode.xs + + Title: "Don't core dump if my_inet_aton() get a NULL" + From: Chip Salzenberg + Files: ext/Socket/Socket.xs + + Title: "Handle symlinks, high permission bits in File::Path" + From: Chip Salzenberg + Files: lib/File/Path.pm + + Title: "Math::{Complex,Trig} update" + From: Gurusamy Sarathy + Msg-ID: <199704242221.BAA30363@alpha.hut.fi> + Date: Fri, 25 Apr 1997 01:21:44 +0300 (EET DST) + Files: lib/Math/Complex.pm lib/Math/Trig.pm pod/roffitall + t/lib/complex.t t/lib/trig.t + + TESTS + + (no other changes) + + UTILITIES + + Title: "Fix buffer overflow in a2p" + From: Chip Salzenberg + Files: x2p/a2py.c + + DOCUMENTATION + + Title: "FAQ udpate (24-apr-97)" + From: Nathan Torkington + Msg-ID: <199704242247.QAA07010@prometheus.frii.com> + Date: Thu, 24 Apr 1997 16:47:23 -0600 (MDT) + Files: pod/perlfaq*.pod + + Title: "Document new {,s}printf() behavior" + From: Chip Salzenberg + Files: pod/perldelta.pod pod/perlfunc.pod + + +----------------- Version 5.003_97h ----------------- diff --git a/embed.h b/embed.h index 474f7e1..7246cf2 100644 --- a/embed.h +++ b/embed.h @@ -117,7 +117,6 @@ #define convert Perl_convert #define cop_seqmax Perl_cop_seqmax #define cos_amg Perl_cos_amg -#define cpytill Perl_cpytill #define croak Perl_croak #define cryptseen Perl_cryptseen #define cshlen Perl_cshlen @@ -138,6 +137,7 @@ #define debstack Perl_debstack #define debstackptrs Perl_debstackptrs #define dec_amg Perl_dec_amg +#define delimcpy Perl_delimcpy #define deprecate Perl_deprecate #define di Perl_di #define die Perl_die @@ -383,6 +383,7 @@ #define my_htonl Perl_my_htonl #define my_lstat Perl_my_lstat #define my_memcmp Perl_my_memcmp +#define my_memset Perl_my_memset #define my_ntohl Perl_my_ntohl #define my_pclose Perl_my_pclose #define my_popen Perl_my_popen diff --git a/ext/DynaLoader/dl_vms.xs b/ext/DynaLoader/dl_vms.xs index 370994b..0329ebd 100644 --- a/ext/DynaLoader/dl_vms.xs +++ b/ext/DynaLoader/dl_vms.xs @@ -249,7 +249,7 @@ dl_load_file(filespec, flags) specdsc.dsc$w_length = strlen(specdsc.dsc$a_pointer); DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "\tVMS-ified filespec is %s\n", specdsc.dsc$a_pointer)); - New(7901,dlptr,1,struct libref); + New(1399,dlptr,1,struct libref); dlptr->name.dsc$b_dtype = dlptr->defspec.dsc$b_dtype = DSC$K_DTYPE_T; dlptr->name.dsc$b_class = dlptr->defspec.dsc$b_class = DSC$K_CLASS_S; sts = sys$filescan(&specdsc,namlst,0); diff --git a/global.sym b/global.sym index 781d179..49d6df0 100644 --- a/global.sym +++ b/global.sym @@ -360,7 +360,6 @@ ck_subr ck_svconst ck_trunc convert -cpytill croak cv_ckproto cv_clone @@ -374,6 +373,7 @@ debop debprofdump debstack debstackptrs +delimcpy deprecate die die_where @@ -555,6 +555,7 @@ my_failure_exit my_htonl my_lstat my_memcmp +my_memset my_ntohl my_pclose my_popen diff --git a/gv.c b/gv.c index a18304e..6c912a0 100644 --- a/gv.c +++ b/gv.c @@ -275,8 +275,8 @@ I32 autoload; --nsplit; if ((nsplit - origname) == 5 && strnEQ(origname, "SUPER", 5)) { /* ->SUPER::method should really be looked up in original stash */ - SV *tmpstr = sv_2mortal(newSVpv(HvNAME(curcop->cop_stash), 0)); - sv_catpvn(tmpstr, "::SUPER", 7); + SV *tmpstr = sv_2mortal(newSVpvf("%s::SUPER", + HvNAME(curcop->cop_stash))); stash = gv_stashpvn(SvPVX(tmpstr), SvCUR(tmpstr), TRUE); DEBUG_o( deb("Treating %s as %s::%s\n", origname, HvNAME(stash), name) ); @@ -1179,13 +1179,11 @@ int flags; case copy_amg: { SV* ref=SvRV(left); - if (!SvROK(ref) && SvTYPE(ref) <= SVt_PVMG) { /* Just to be - * extra - * causious, - * maybe in some - * additional - * cases sv_setsv - * is safe too */ + if (!SvROK(ref) && SvTYPE(ref) <= SVt_PVMG) { + /* + * Just to be extra cautious. Maybe in some + * additional cases sv_setsv is safe, too. + */ SV* newref = newSVsv(ref); SvOBJECT_on(newref); SvSTASH(newref) = (HV*)SvREFCNT_inc(SvSTASH(ref)); @@ -1242,7 +1240,7 @@ int flags; && !(flags & AMGf_unary)) { /* We look for substitution for * comparison operations and - * concatendation */ + * concatenation */ if (method==concat_amg || method==concat_ass_amg || method==repeat_amg || method==repeat_ass_amg) { return NULL; /* Delegate operation to string conversion */ @@ -1298,7 +1296,7 @@ int flags; if (amtp && amtp->fallback >= AMGfallYES) { DEBUG_o( deb("%s", SvPVX(msg)) ); } else { - croak("%S", msg); + croak("%_", msg); } return NULL; } diff --git a/handy.h b/handy.h index 257c52a..379fab8 100644 --- a/handy.h +++ b/handy.h @@ -130,6 +130,10 @@ typedef unsigned short U16; # define U32_MIN PERL_ULONG_MIN #endif +#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */ +#define TYPE_DIGITS(T) BIT_DIGITS(sizeof(T) * 8) +#define TYPE_CHARS(T) (TYPE_DIGITS(T) + 2) /* sign, NUL */ + #define Ctl(ch) ((ch) & 037) #define strNE(s1,s2) (strcmp(s1,s2)) @@ -277,7 +281,7 @@ typedef U16 line_t; #define Safefree(d) safexfree((Malloc_t)d) #define NEWSV(x,len) newSV(x,len) -#define MAXXCOUNT 1200 +#define MAXXCOUNT 1400 long xcount[MAXXCOUNT]; long lastxcount[MAXXCOUNT]; diff --git a/mg.c b/mg.c index 7d8cd04..cab0e59 100644 --- a/mg.c +++ b/mg.c @@ -531,18 +531,18 @@ MAGIC *mg; break; case '(': sv_setiv(sv, (IV)gid); - sv_setpvf(sv, "%vd", (IV)gid); + sv_setpvf(sv, "%Vd", (IV)gid); goto add_groups; case ')': sv_setiv(sv, (IV)egid); - sv_setpvf(sv, "%vd", (IV)egid); + sv_setpvf(sv, "%Vd", (IV)egid); add_groups: #ifdef HAS_GETGROUPS { Groups_t gary[NGROUPS]; i = getgroups(NGROUPS,gary); while (--i >= 0) - sv_catpvf(sv, " %vd", (IV)gary[i]); + sv_catpvf(sv, " %Vd", (IV)gary[i]); } #endif SvIOK_on(sv); /* what a wonderful hack! */ @@ -627,9 +627,11 @@ MAGIC* mg; while (s < strend) { struct stat st; - s = cpytill(tokenbuf, s, strend, ':', &i); + s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, + s, strend, ':', &i); s++; - if (*tokenbuf != '/' + if (i >= sizeof tokenbuf /* too long -- assume the worst */ + || *tokenbuf != '/' || (Stat(tokenbuf, &st) == 0 && (st.st_mode & 2)) ) { MgTAINTEDDIR_on(mg); return 0; diff --git a/op.c b/op.c index 747ae0f..cf78f86 100644 --- a/op.c +++ b/op.c @@ -3153,7 +3153,7 @@ char* p; gv_efullname3(name = sv_newmortal(), gv, Nullch); sv_setpv(msg, "Prototype mismatch:"); if (name) - sv_catpvf(msg, " sub %S", name); + sv_catpvf(msg, " sub %_", name); if (SvPOK(cv)) sv_catpvf(msg, " (%s)", SvPVX(cv)); sv_catpv(msg, " vs "); @@ -3161,7 +3161,7 @@ char* p; sv_catpvf(msg, "(%s)", p); else sv_catpv(msg, "none"); - warn("%S", msg); + warn("%_", msg); } } @@ -3348,7 +3348,7 @@ OP *block; CV *cv; HV *hv; - sv_setpvf(sv, "%S:%ld-%ld", + sv_setpvf(sv, "%_:%ld-%ld", GvSV(curcop->cop_filegv), (long)subline, (long)curcop->cop_line); gv_efullname3(tmpstr, gv, Nullch); diff --git a/os2/os2.c b/os2/os2.c index 1eca62f..b658ea8 100644 --- a/os2/os2.c +++ b/os2/os2.c @@ -55,7 +55,7 @@ get_sysinfo(ULONG pid, ULONG flags) char *pbuffer; ULONG rc, buf_len = QSS_INI_BUFFER; - New(1022, pbuffer, buf_len, char); + New(1322, pbuffer, buf_len, char); /* QSS_PROCESS | QSS_MODULE | QSS_SEMAPHORES | QSS_SHARED */ rc = QuerySysState(flags, pid, pbuffer, buf_len); while (rc == ERROR_BUFFER_OVERFLOW) { @@ -208,7 +208,7 @@ register SV **sp; int flag = P_WAIT, trueflag, err, secondtry = 0; if (sp > mark) { - New(401,Argv, sp - mark + 3, char*); + New(1301,Argv, sp - mark + 3, char*); a = Argv; if (mark < sp && SvNIOKp(*(mark+1)) && !SvPOKp(*(mark+1))) { @@ -321,7 +321,7 @@ int execf; if (strnEQ(cmd,"/bin/sh",7) && isSPACE(cmd[7])) { STRLEN l = strlen(sh_path); - New(4545, news, strlen(cmd) - 7 + l, char); + New(1302, news, strlen(cmd) - 7 + l, char); strcpy(news, sh_path); strcpy(news + l, cmd + 7); cmd = news; @@ -367,7 +367,7 @@ int execf; } } - New(402,Argv, (s - cmd) / 2 + 2, char*); + New(1303,Argv, (s - cmd) / 2 + 2, char*); Cmd = savepvn(cmd, s-cmd); a = Argv; for (s = Cmd; *s;) { @@ -1149,7 +1149,7 @@ Perl_OS2_init(char **env) environ = env; } if ( (shell = getenv("PERL_SH_DRIVE")) ) { - New(404, sh_path, strlen(SH_PATH) + 1, char); + New(1304, sh_path, strlen(SH_PATH) + 1, char); strcpy(sh_path, SH_PATH); sh_path[0] = shell[0]; } else if ( (shell = getenv("PERL_SH_DIR")) ) { @@ -1157,7 +1157,7 @@ Perl_OS2_init(char **env) if (shell[l-1] == '/' || shell[l-1] == '\\') { l--; } - New(404, sh_path, l + 8, char); + New(1304, sh_path, l + 8, char); strncpy(sh_path, shell, l); strcpy(sh_path + l, "/sh.exe"); for (i = 0; i < l; i++) { diff --git a/patchlevel.h b/patchlevel.h index e517f7a..38de854 100644 --- a/patchlevel.h +++ b/patchlevel.h @@ -38,7 +38,7 @@ */ static char *local_patches[] = { NULL - ,"Dev97A-H - Eight development patches to 5.003_97" + ,"Dev97A-I - Nine development patches to 5.003_97" ,NULL }; diff --git a/perl.c b/perl.c index b4d69cb..8af7172 100644 --- a/perl.c +++ b/perl.c @@ -377,11 +377,6 @@ register PerlInterpreter *sv_interp; (long)cxstack_ix + 1); } - - /* Without SVs, messages must be primitive. */ - SvREFCNT_dec(mess_sv); - mess_sv = &sv_undef; - /* Now absolutely destruct everything, somehow or other, loops or no. */ last_sv_count = 0; SvFLAGS(strtab) |= SVTYPEMASK; /* don't clean out strtab now */ @@ -433,9 +428,20 @@ register PerlInterpreter *sv_interp; if (origfilename) Safefree(origfilename); nuke_stacks(); - hints = 0; /* Reset hints. Should hints be per-interpreter ? */ + hints = 0; /* Reset hints. Should hints be per-interpreter ? */ DEBUG_P(debprofdump()); + + /* As the absolutely last thing, free the non-arena SV for mess() */ + + if (mess_sv) { + /* we know that type >= SVt_PV */ + SvOOK_off(mess_sv); + Safefree(SvPVX(mess_sv)); + Safefree(SvANY(mess_sv)); + Safefree(mess_sv); + mess_sv = Nullsv; + } } void @@ -1614,15 +1620,19 @@ SV *sv; I32 len; int retval; #if defined(DOSISH) && !defined(OS2) && !defined(atarist) -#define SEARCH_EXTS ".bat", ".cmd", NULL +# define SEARCH_EXTS ".bat", ".cmd", NULL +# define MAX_EXT_LEN 4 #endif #ifdef VMS # define SEARCH_EXTS ".pl", ".com", NULL +# define MAX_EXT_LEN 4 #endif /* additional extensions to try in each dir if scriptname not found */ #ifdef SEARCH_EXTS char *ext[] = { SEARCH_EXTS }; int extidx = (strchr(scriptname,'.')) ? -1 : 0; /* has ext already */ +#else +# define MAX_EXT_LEN 0 #endif #ifdef VMS @@ -1632,38 +1642,51 @@ SV *sv; hasdir = (strpbrk(scriptname,":[= sizeof tokenbuf) + continue; /* don't search dir with too-long name */ + strcat(tokenbuf, scriptname); #else /* !VMS */ if (dosearch && !strchr(scriptname, '/') && (s = getenv("PATH"))) { - bufend = s + strlen(s); - while (*s) { -#ifndef DOSISH - s = cpytill(tokenbuf,s,bufend,':',&len); + while (s < bufend) { +#ifndef atarist + s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, s, bufend, +#ifdef DOSISH + ';', #else -#ifdef atarist - for (len = 0; *s && *s != ',' && *s != ';'; tokenbuf[len++] = *s++); - tokenbuf[len] = '\0'; -#else - for (len = 0; *s && *s != ';'; tokenbuf[len++] = *s++); - tokenbuf[len] = '\0'; -#endif + ':', #endif - if (*s) + &len); +#else /* atarist */ + for (len = 0; *s && *s != ',' && *s != ';'; len++, s++) { + if (len < sizeof tokenbuf) + tokenbuf[len] = *s; + } + if (len < sizeof tokenbuf) + tokenbuf[len] = '\0'; +#endif /* atarist */ + if (s < bufend) s++; -#ifndef DOSISH - if (len && tokenbuf[len-1] != '/') -#else -#ifdef atarist - if (len && ((tokenbuf[len-1] != '\\') && (tokenbuf[len-1] != '/'))) -#else - if (len && tokenbuf[len-1] != '\\') -#endif -#endif - (void)strcat(tokenbuf+len,"/"); - (void)strcat(tokenbuf+len,scriptname); + if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tokenbuf) + continue; /* don't search dir with too-long name */ + if (len +#if defined(atarist) && !defined(DOSISH) + && tokenbuf[len - 1] != '/' +#endif +#if defined(atarist) || defined(DOSISH) + && tokenbuf[len - 1] != '\\' +#endif + ) + tokenbuf[len++] = '/'; + (void)strcpy(tokenbuf + len, scriptname); #endif /* !VMS */ #ifdef SEARCH_EXTS @@ -1743,7 +1766,7 @@ sed %s -e \"/^[^#]/b\" \ -e \"/^#[ ]*undef[ ]/b\" \ -e \"/^#[ ]*endif/b\" \ -e \"s/^#.*//\" \ - %s | %S -C %S %s", + %s | %_ -C %_ %s", (doextract ? "-e \"1,/^#/d\n\"" : ""), #else sv_setpvf(cmd, "\ @@ -1758,7 +1781,7 @@ sed %s -e \"/^[^#]/b\" \ -e '/^#[ ]*undef[ ]/b' \ -e '/^#[ ]*endif/b' \ -e 's/^[ ]*#.*//' \ - %s | %S -C %S %s", + %s | %_ -C %_ %s", #ifdef LOC_SED LOC_SED, #else diff --git a/perl.h b/perl.h index b807b5d..ac87be0 100644 --- a/perl.h +++ b/perl.h @@ -304,15 +304,8 @@ extern char *memset _((char*, int, int)); # endif # endif -# define memzero(d,l) memset(d,0,l) #else -# ifndef memzero -# ifdef HAS_BZERO -# define memzero(d,l) bzero(d,l) -# else -# define memzero(d,l) my_bzero(d,l) -# endif -# endif +# define memset(d,c,l) my_memset(d,c,l) #endif /* HAS_MEMSET */ #if !defined(HAS_MEMMOVE) && !defined(memmove) @@ -346,6 +339,18 @@ # endif #endif /* HAS_MEMCMP && HAS_SANE_MEMCMP */ +#ifndef memzero +# ifdef HAS_BZERO +# define memzero(d,l) bzero(d,l) +# else +# ifdef HAS_MEMSET +# define memzero(d,l) memset(d,0,l) +# else +# define memzero(d,l) my_bzero(d,l) +# endif +# endif +#endif + #ifndef HAS_BCMP # ifndef bcmp # define bcmp(s1,s2,l) memcmp(s1,s2,l) diff --git a/pod/perldiag.pod b/pod/perldiag.pod index a4a897c..5ee141e 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -890,6 +890,12 @@ times than it has returned. This probably indicates an infinite recursion, unless you're writing strange benchmark programs, in which case it indicates something else. +=item Delimiter for here document is too long + +(F) In a here document construct like CEFOO>, the label +C is too long for Perl to handle. You have to be seriously +twisted to write code that triggers this error. + =item Did you mean &%s instead? (W) You probably referred to an imported subroutine &FOO as $FOO or some such. @@ -949,6 +955,13 @@ single form when it must operate on them directly. Either you've passed an invalid file specification to Perl, or you've found a case the conversion routines don't handle. Drat. +=item Excessively long <> operator + +(F) The contents of a <> operator may not exceed the maximum size of a +Perl identifier. If you're just trying to glob a long list of +filenames, try using the glob() operator, or put the filenames into a +variable and glob that. + =item Execution of %s aborted due to compilation errors (F) The final summary message when a Perl compilation fails. @@ -1101,9 +1114,9 @@ is now heavily deprecated. =item Identifier too long (F) Perl limits identifiers (names for variables, functions, etc.) to -252 characters for simple names, somewhat more for compound names (like -C<$A::B>). You've exceeded Perl's limits. Future versions of Perl are -likely to eliminate these arbitrary limitations. +about 250 characters for simple names, and somewhat more for compound +names (like C<$A::B>). You've exceeded Perl's limits. Future +versions of Perl are likely to eliminate these arbitrary limitations. =item Ill-formed logical name |%s| in prime_env_iter @@ -1581,6 +1594,13 @@ supplied it an uninitialized value. See L. (P) The internal pattern matching routines are out of their gourd. +=item Number too long + +(F) Perl limits the representation of decimal numbers in programs to about +about 250 characters. You've exceeded that length. Future versions of +Perl are likely to eliminate this arbitrary limitation. In the meantime, +try using scientific notation (e.g. "1e6" instead of "1_000_000"). + =item Odd number of elements in hash list (S) You specified an odd number of elements to a hash list, which is odd, @@ -2221,6 +2241,11 @@ or "msg". See L, for example. (W) The filehandle you're writing to got itself closed sometime before now. Check your logic flow. +=item Target of goto is too deeply nested + +(F) You tried to use C to reach a label that was too deeply +nested for Perl to reach. Perl is doing you a favor by refusing. + =item tell() on unopened file (W) You tried to use the tell() function on a filehandle that was either diff --git a/pod/perlfaq.pod b/pod/perlfaq.pod index 95a4a5c..2213a0f 100644 --- a/pod/perlfaq.pod +++ b/pod/perlfaq.pod @@ -1,6 +1,6 @@ =head1 NAME -perlfaq - frequently asked questions about Perl ($Date: 1997/04/23 18:11:06 $) +perlfaq - frequently asked questions about Perl ($Date: 1997/04/24 22:46:06 $) =head1 DESCRIPTION @@ -124,6 +124,11 @@ in respect of this information or its use. =over 4 +=item 24/April/97 + +Style and whitespace changes from Chip, new question on reading one +character at a time from a terminal using POSIX from Tom. + =item 23/April/97 Added http://www.oasis.leo.org/perl/ to L. Style fix to diff --git a/pod/perlfaq1.pod b/pod/perlfaq1.pod index 6463a98..6af40ae 100644 --- a/pod/perlfaq1.pod +++ b/pod/perlfaq1.pod @@ -1,6 +1,6 @@ =head1 NAME -perlfaq1 - General Questions About Perl ($Revision: 1.11 $, $Date: 1997/03/19 17:23:09 $) +perlfaq1 - General Questions About Perl ($Revision: 1.12 $, $Date: 1997/04/24 22:43:34 $) =head1 DESCRIPTION @@ -190,11 +190,12 @@ In "standard terminology" a I has been compiled to physical machine code once, and can then be be run multiple times, whereas a I