summaryrefslogtreecommitdiffstats
path: root/io.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-09 14:56:55 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-09 14:56:55 +0000
commit628420db638ccbc857601254ca547bc81d667e72 (patch)
tree9cac886e1a0142fc971e6171c56e40c4ad6346a0 /io.c
parentc505b21069a732a9eb5a553f8b88ce4cf8b44b93 (diff)
downloadruby-628420db638ccbc857601254ca547bc81d667e72.tar.gz
ruby-628420db638ccbc857601254ca547bc81d667e72.tar.xz
ruby-628420db638ccbc857601254ca547bc81d667e72.zip
* io.c (io_fwrite): raise an error if ASCII incompatible string
written for text mode IO without encoding conversion. (rb_io_extract_modeenc): binmode requirement changed. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@19273 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/io.c b/io.c
index cfe84cc7e..ef2cdab2c 100644
--- a/io.c
+++ b/io.c
@@ -756,6 +756,10 @@ io_fwrite(VALUE str, rb_io_t *fptr)
if (fptr->writeconv) {
if (!NIL_P(fptr->writeconv_stateless))
common_encoding = fptr->writeconv_stateless;
+ else if (!rb_enc_asciicompat(rb_enc_get(str))) {
+ rb_raise(rb_eArgError, "ASCII incompatible string written for text mode IO without encoding conversion: %s",
+ rb_enc_name(rb_enc_get(str)));
+ }
}
else {
if (fptr->encs.enc2)
@@ -3908,7 +3912,10 @@ rb_io_extract_modeenc(VALUE *vmode_p, VALUE opthash,
if ((fmode & FMODE_BINMODE) && (fmode & FMODE_TEXTMODE))
rb_raise(rb_eArgError, "both textmode and binmode specified");
- if (enc && !rb_enc_asciicompat(enc) && !(fmode & FMODE_BINMODE))
+ if ((fmode & FMODE_READABLE) &&
+ !enc2 &&
+ !(fmode & FMODE_BINMODE) &&
+ !rb_enc_asciicompat(enc ? enc : rb_default_external_encoding()))
rb_raise(rb_eArgError, "ASCII incompatible encoding needs binmode");
*vmode_p = vmode;