mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-10 14:00:21 +02:00
Arrange so that 'file-encoding' does not truncate the encoding name.
Fixes <http://bugs.gnu.org/16463>. Reported by Sree Harsha Totakura <sreeharsha@totakura.in>. * libguile/read.c (ENCODING_NAME_MAX_SIZE): New macro. (SCM_ENCODING_SEARCH_SIZE): Change to 500 + ENCODING_NAME_MAX_SIZE. (scm_i_scan_for_encoding): Return NULL if there's less than ENCODING_NAME_MAX_SIZE bytes once "coding: *" has been read. * test-suite/tests/coding.test ("line comment")["http://bugs.gnu.org/16463"]: New test.
This commit is contained in:
parent
802a25b1ed
commit
3ff8a9d6ff
2 changed files with 31 additions and 9 deletions
|
@ -2046,11 +2046,20 @@ scm_get_hash_procedure (int c)
|
|||
}
|
||||
}
|
||||
|
||||
#define SCM_ENCODING_SEARCH_SIZE (500)
|
||||
/* Maximum size of an encoding name. This is a bit more than the
|
||||
longest name listed at
|
||||
<http://www.iana.org/assignments/character-sets> ("ISO-2022-JP-2", 13
|
||||
characters.) */
|
||||
#define ENCODING_NAME_MAX_SIZE 20
|
||||
|
||||
/* Search the first few hundred characters of a file for an Emacs-like coding
|
||||
declaration. Returns either NULL or a string whose storage has been
|
||||
allocated with `scm_gc_malloc ()'. */
|
||||
/* Number of bytes at the beginning or end of a file that are scanned
|
||||
for a "coding:" declaration. */
|
||||
#define SCM_ENCODING_SEARCH_SIZE (500 + ENCODING_NAME_MAX_SIZE)
|
||||
|
||||
|
||||
/* Search the SCM_ENCODING_SEARCH_SIZE bytes of a file for an Emacs-like
|
||||
coding declaration. Returns either NULL or a string whose storage
|
||||
has been allocated with `scm_gc_malloc'. */
|
||||
char *
|
||||
scm_i_scan_for_encoding (SCM port)
|
||||
{
|
||||
|
@ -2109,8 +2118,8 @@ scm_i_scan_for_encoding (SCM port)
|
|||
if ((pos = strstr(pos, "coding")) == NULL)
|
||||
return NULL;
|
||||
|
||||
pos += strlen("coding");
|
||||
if (pos - header >= SCM_ENCODING_SEARCH_SIZE ||
|
||||
pos += strlen ("coding");
|
||||
if (pos - header >= SCM_ENCODING_SEARCH_SIZE ||
|
||||
(*pos == ':' || *pos == '='))
|
||||
{
|
||||
pos ++;
|
||||
|
@ -2119,10 +2128,17 @@ scm_i_scan_for_encoding (SCM port)
|
|||
}
|
||||
|
||||
/* skip spaces */
|
||||
while (pos - header <= SCM_ENCODING_SEARCH_SIZE &&
|
||||
while (pos - header <= SCM_ENCODING_SEARCH_SIZE &&
|
||||
(*pos == ' ' || *pos == '\t'))
|
||||
pos ++;
|
||||
|
||||
if (pos - header >= SCM_ENCODING_SEARCH_SIZE - ENCODING_NAME_MAX_SIZE)
|
||||
/* We found the "coding:" string, but there is probably not enough
|
||||
room to store an encoding name in its entirety, so ignore it.
|
||||
This makes sure we do not end up returning a truncated encoding
|
||||
name. */
|
||||
return NULL;
|
||||
|
||||
/* grab the next token */
|
||||
encoding_start = pos;
|
||||
i = 0;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
;;;; coding.test --- test suite for coding declarations. -*- mode: scheme -*-
|
||||
;;;;
|
||||
;;;; Copyright (C) 2011, 2013 Free Software Foundation, Inc.
|
||||
;;;; Copyright (C) 2011, 2013, 2014 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
|
||||
|
@ -101,4 +101,10 @@
|
|||
|
||||
(pass-if-equal "second line, whitespace, nl"
|
||||
"ISO-8859-1"
|
||||
(scan-coding "\n; coding: iso-8859-1 \n")))
|
||||
(scan-coding "\n; coding: iso-8859-1 \n"))
|
||||
|
||||
(pass-if-equal "http://bugs.gnu.org/16463"
|
||||
;; On Guile <= 2.0.9, this would return "ISO-8".
|
||||
"ISO-8859-1"
|
||||
(scan-coding (string-append (make-string 485 #\space)
|
||||
"; coding: ISO-8859-1"))))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue