summaryrefslogtreecommitdiff
path: root/libguile/fports.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-01-11 20:58:34 +0100
committerLudovic Courtès <ludo@gnu.org>2015-01-11 20:59:03 +0100
commit37b1453032488de582175270d1b3a1653ea81457 (patch)
treef7cbbfe710f8cec1a2405f7165664e1a7f640050 /libguile/fports.c
parentcdcba5b2f6270de808e51b3b933374170611b91d (diff)
downloadguile-37b1453032488de582175270d1b3a1653ea81457.tar.gz
Avoid converting the 'mode' argument of 'open-file'.
* libguile/fports.c (scm_open_file_with_encoding): const-qualify 'md' and 'ptr'. Add call to 'scm_i_try_narrow_string'. Use 'scm_i_string_chars' instead of 'scm_to_locale_string' plus ' scm_dynwind_free'. * test-suite/tests/ports.test ("invalid wide mode string", "valid wide mode string"): New tests.
Diffstat (limited to 'libguile/fports.c')
-rw-r--r--libguile/fports.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/libguile/fports.c b/libguile/fports.c
index 29edc519c..fdd34da1e 100644
--- a/libguile/fports.c
+++ b/libguile/fports.c
@@ -1,6 +1,6 @@
/* Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
* 2004, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013,
- * 2014 Free Software Foundation, Inc.
+ * 2014, 2015 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
@@ -342,7 +342,8 @@ scm_open_file_with_encoding (SCM filename, SCM mode,
SCM port;
int fdes, flags = 0, binary = 0;
unsigned int retries;
- char *file, *md, *ptr;
+ char *file;
+ const char *md, *ptr;
if (SCM_UNLIKELY (!(scm_is_false (encoding) || scm_is_string (encoding))))
scm_wrong_type_arg_msg (FUNC_NAME, 0, encoding,
@@ -353,8 +354,10 @@ scm_open_file_with_encoding (SCM filename, SCM mode,
file = scm_to_locale_string (filename);
scm_dynwind_free (file);
- md = scm_to_locale_string (mode);
- scm_dynwind_free (md);
+ if (SCM_UNLIKELY (!scm_i_try_narrow_string (mode)))
+ scm_out_of_range (FUNC_NAME, mode);
+
+ md = scm_i_string_chars (mode);
switch (*md)
{