[#31928] securerandom.rb for 1.8 — Tanaka Akira <akr@...>

securerandom.rb を 1.8 に追加し、cgi/session.rb に使わせたい

18 messages 2007/10/03
[#31990] Re: securerandom.rb for 1.8 — "Akinori MUSHA" <knu@...> 2007/10/09

At Wed, 3 Oct 2007 12:49:20 +0900,

[#31992] Re: securerandom.rb for 1.8 — Tanaka Akira <akr@...> 2007/10/09

In article <86k5pwinco.knu@iDaemons.org>,

[#31993] Re: securerandom.rb for 1.8 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/09

-----BEGIN PGP SIGNED MESSAGE-----

[#31936] Rake添付 — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

21 messages 2007/10/04
[#31937] Re: Rake添付 — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/04

-----BEGIN PGP SIGNED MESSAGE-----

[#31938] Re: Rake添付 — Yukihiro Matsumoto <matz@...> 2007/10/04

まつもと ゆきひろです

[#31941] Re: [ruby-list:44071] Re: Ruby 1.8.6-p111 / 1.8.5-p114 released (Security Fix) — Shugo Maeda <shugo@...>

前田です。

20 messages 2007/10/04
[#31943] Re: [ruby-list:44071] Re: Ruby 1.8.6-p111 / 1.8.5-p114 released (Security Fix) — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/05

-----BEGIN PGP SIGNED MESSAGE-----

[#31945] Re: [ruby-list:44071] Re: Ruby 1.8.6-p111 / 1.8.5-p114 released (Security Fix) — Shugo Maeda <shugo@...> 2007/10/05

前田です。

[#31948] Re: [ruby-list:44071] Re: Ruby 1.8.6-p111 / 1.8.5-p114 released (Security Fix) — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/05

-----BEGIN PGP SIGNED MESSAGE-----

[#31952] Re: [ruby-list:44071] Re: Ruby 1.8.6-p111 / 1.8.5-p114 released (Security Fix) — Shugo Maeda <shugo@...> 2007/10/05

前田です。

[#31956] Re: [ruby-list:44071] Re: Ruby 1.8.6-p111 / 1.8.5-p114 released (Security Fix) — GOTOU Yuuzou <gotoyuzo@...> 2007/10/06

In message <47063403.3070402@ruby-lang.org>,

[#31960] Re: [ruby-list:44071] Re: Ruby 1.8.6-p111 / 1.8.5-p114 released (Security Fix) — GOTOU Yuuzou <gotoyuzo@...> 2007/10/07

In message <20071006.101915.596518898.gotoyuzo@sawara.priv.tokyo.netlab.jp>,

[#31980] multibyte string/regex literal with escape sequence — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

24 messages 2007/10/09
[#31981] Re: multibyte string/regex literal with escape sequence — Yukihiro Matsumoto <matz@...> 2007/10/09

まつもと ゆきひろです

[#31983] Re: multibyte string/regex literal with escape sequence — "U.Nakamura" <usa@...> 2007/10/09

こんにちは、なかむら(う)です。

[#31984] Re: multibyte string/regex literal with escape sequence — Yukihiro Matsumoto <matz@...> 2007/10/09

まつもと ゆきひろです

[#31986] Re: multibyte string/regex literal with escape sequence — "U.Nakamura" <usa@...> 2007/10/09

こんにちは、なかむら(う)です。

[#31987] Re: multibyte string/regex literal with escape sequence — Yukihiro Matsumoto <matz@...> 2007/10/09

まつもと ゆきひろです

[#32003] Re: multibyte string/regex literal with escape sequence — "U.Nakamura" <usa@...> 2007/10/10

こんにちは、なかむら(う)です。

[#32133] undefined method `now' for DateTime:Class (NoMethodError) — "NAKAMURA, Hiroshi" <nakahiro@...>

-----BEGIN PGP SIGNED MESSAGE-----

12 messages 2007/10/23
[#32135] Re: undefined method `now' for DateTime:Class (NoMethodError) — tadf@... 2007/10/23

どういう状況かよくわかってないのですが、いっそ必ず date 丸ごと読むようにするか、

[#32136] Re: undefined method `now' for DateTime:Class (NoMethodError) — "NAKAMURA, Hiroshi" <nakahiro@...> 2007/10/23

-----BEGIN PGP SIGNED MESSAGE-----

[ruby-dev:31980] multibyte string/regex literal with escape sequence

From: "U.Nakamura" <usa@...>
Date: 2007-10-09 05:57:16 UTC
List: ruby-dev #31980
こんにちは、なかむら(う)です。

trunkで、

  % ./miniruby -ve '# -*- coding: EUC-JP -*-
  p "あ\n".encoding'
  ruby 1.9.0 (2007-10-07 patchlevel 0) [i386-netbsdelf]
  "US-ASCII"

となることに気付きました。
文字列リテラルあるいは正規表現リテラルにエスケープシーケンス
を含めると問答無用でUS-ASCII(というか実際はバイナリ扱い?)にな
るようです。

おそらく、意図としては、\nnnとか\xnnとか\M-xとかで8bit目が立
ってる文字を仕込んじゃったらもう正体不明だということにしたい
のだろうと思うので、真面目にチェックするようにしてみました。

	* parse.y (parser_read_escape, parser_tokadd_escape): check code range.

Index: parse.y
===================================================================
--- parse.y	(revision 13660)
+++ parse.y	(working copy)
@@ -4491,8 +4491,8 @@ static int parser_here_document(struct p
 # define pushback(c)               parser_pushback(parser, c)
 # define newtok()                  parser_newtok(parser)
 # define tokadd(c)                 parser_tokadd(parser, c)
-# define read_escape()             parser_read_escape(parser)
-# define tokadd_escape(t)          parser_tokadd_escape(parser, t)
+# define read_escape(m)            parser_read_escape(parser, m)
+# define tokadd_escape(t,m)        parser_tokadd_escape(parser, t, m)
 # define regx_options()            parser_regx_options(parser)
 # define tokadd_string(f,t,p,n,m)  parser_tokadd_string(parser,f,t,p,n,m)
 # define parse_string(n)           parser_parse_string(parser,n)
@@ -4920,7 +4920,7 @@ parser_tokadd(struct parser_params *pars
 }
 
 static int
-parser_read_escape(struct parser_params *parser)
+parser_read_escape(struct parser_params *parser, int *mb)
 {
     int c;
 
@@ -4958,6 +4958,7 @@ parser_read_escape(struct parser_params 
 	    c = scan_oct(lex_p, 3, &numlen);
 	    lex_p += numlen;
 	}
+	if (mb && (c >= 0200)) *mb = ENC_CODERANGE_UNKNOWN;
 	return c;
 
       case 'x':	/* hex constant */
@@ -4971,6 +4972,7 @@ parser_read_escape(struct parser_params 
 	    }
 	    lex_p += numlen;
 	}
+	if (mb && (c >= 0x80)) *mb = ENC_CODERANGE_UNKNOWN;
 	return c;
 
       case 'b':	/* backspace */
@@ -4986,10 +4988,12 @@ parser_read_escape(struct parser_params 
 	    return '\0';
 	}
 	if ((c = nextc()) == '\\') {
-	    return read_escape() | 0x80;
+	    if (mb) *mb = ENC_CODERANGE_UNKNOWN;
+	    return read_escape(0) | 0x80;
 	}
 	else if (c == -1) goto eof;
 	else {
+	    if (mb) *mb = ENC_CODERANGE_UNKNOWN;
 	    return ((c & 0xff) | 0x80);
 	}
 
@@ -5001,7 +5005,7 @@ parser_read_escape(struct parser_params 
 	}
       case 'c':
 	if ((c = nextc())== '\\') {
-	    c = read_escape();
+	    c = read_escape(mb);
 	}
 	else if (c == '?')
 	    return 0177;
@@ -5019,7 +5023,7 @@ parser_read_escape(struct parser_params 
 }
 
 static int
-parser_tokadd_escape(struct parser_params *parser, int term)
+parser_tokadd_escape(struct parser_params *parser, int term, int *mb)
 {
     int c;
 
@@ -5030,35 +5034,37 @@ parser_tokadd_escape(struct parser_param
       case '0': case '1': case '2': case '3': /* octal constant */
       case '4': case '5': case '6': case '7':
 	{
-	    int i;
+	    int numlen;
+	    int oct;
 
 	    tokadd('\\');
-	    tokadd(c);
-	    for (i=0; i<2; i++) {
-		c = nextc();
-		if (c == -1) goto eof;
-		if (c < '0' || '7' < c) {
-		    pushback(c);
-		    break;
-		}
-		tokadd(c);
+	    pushback(c);
+	    oct = scan_oct(lex_p, 3, &numlen);
+	    if (numlen == 0) {
+		yyerror("Invalid escape character syntax");
+		return -1;
 	    }
+	    while (numlen--)
+		tokadd(nextc());
+	    if (mb && (oct >= 0200)) *mb = ENC_CODERANGE_UNKNOWN;
 	}
 	return 0;
 
       case 'x':	/* hex constant */
 	{
 	    int numlen;
+	    int hex;
 
 	    tokadd('\\');
 	    tokadd(c);
-	    scan_hex(lex_p, 2, &numlen);
+	    hex = scan_hex(lex_p, 2, &numlen);
 	    if (numlen == 0) {
 		yyerror("Invalid escape character syntax");
 		return -1;
 	    }
 	    while (numlen--)
 		tokadd(nextc());
+	    if (mb && (hex >= 0x80)) *mb = ENC_CODERANGE_UNKNOWN;
 	}
 	return 0;
 
@@ -5069,6 +5075,7 @@ parser_tokadd_escape(struct parser_param
 	    return 0;
 	}
 	tokadd('\\'); tokadd('M'); tokadd('-');
+	if (mb) *mb = ENC_CODERANGE_UNKNOWN;
 	goto escaped;
 
       case 'C':
@@ -5084,7 +5091,7 @@ parser_tokadd_escape(struct parser_param
 	tokadd('\\'); tokadd('c');
       escaped:
 	if ((c = nextc()) == '\\') {
-	    return tokadd_escape(term);
+	    return tokadd_escape(term, mb);
 	}
 	else if (c == -1) goto eof;
 	tokadd(c);
@@ -5212,22 +5219,14 @@ parser_tokadd_string(struct parser_param
 	      default:
 		if (func & STR_FUNC_REGEXP) {
 		    pushback(c);
-		    if (tokadd_escape(term) < 0)
+		    if (tokadd_escape(term, mb) < 0)
 			return -1;
-		    if (mb) {
-			*mb = ENC_CODERANGE_UNKNOWN;
-			mb = 0;
-		    }
 		    continue;
 		}
 		else if (func & STR_FUNC_EXPAND) {
 		    pushback(c);
 		    if (func & STR_FUNC_ESCAPE) tokadd('\\');
-		    c = read_escape();
-		    if (mb) {
-			*mb = ENC_CODERANGE_UNKNOWN;
-			mb = 0;
-		    }
+		    c = read_escape(mb);
 		}
 		else if ((func & STR_FUNC_QWORDS) && ISSPACE(c)) {
 		    /* ignore backslashed spaces in %w */
@@ -6043,7 +6042,7 @@ parser_yylex(struct parser_params *parse
 	    goto ternary;
 	}
 	else if (c == '\\') {
-	    c = read_escape();
+	    c = read_escape(0);
 	    tokadd(c);
 	}
 	else {

それでは。
-- 
U.Nakamura <usa@garbagecollect.jp>



In This Thread

Prev Next