mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 14:21:10 +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
|
/* Number of bytes at the beginning or end of a file that are scanned
|
||||||
declaration. Returns either NULL or a string whose storage has been
|
for a "coding:" declaration. */
|
||||||
allocated with `scm_gc_malloc ()'. */
|
#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 *
|
char *
|
||||||
scm_i_scan_for_encoding (SCM port)
|
scm_i_scan_for_encoding (SCM port)
|
||||||
{
|
{
|
||||||
|
@ -2109,8 +2118,8 @@ scm_i_scan_for_encoding (SCM port)
|
||||||
if ((pos = strstr(pos, "coding")) == NULL)
|
if ((pos = strstr(pos, "coding")) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
pos += strlen("coding");
|
pos += strlen ("coding");
|
||||||
if (pos - header >= SCM_ENCODING_SEARCH_SIZE ||
|
if (pos - header >= SCM_ENCODING_SEARCH_SIZE ||
|
||||||
(*pos == ':' || *pos == '='))
|
(*pos == ':' || *pos == '='))
|
||||||
{
|
{
|
||||||
pos ++;
|
pos ++;
|
||||||
|
@ -2119,10 +2128,17 @@ scm_i_scan_for_encoding (SCM port)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip spaces */
|
/* skip spaces */
|
||||||
while (pos - header <= SCM_ENCODING_SEARCH_SIZE &&
|
while (pos - header <= SCM_ENCODING_SEARCH_SIZE &&
|
||||||
(*pos == ' ' || *pos == '\t'))
|
(*pos == ' ' || *pos == '\t'))
|
||||||
pos ++;
|
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 */
|
/* grab the next token */
|
||||||
encoding_start = pos;
|
encoding_start = pos;
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
;;;; coding.test --- test suite for coding declarations. -*- mode: scheme -*-
|
;;;; 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
|
;;;; This library is free software; you can redistribute it and/or
|
||||||
;;;; modify it under the terms of the GNU Lesser General Public
|
;;;; modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -101,4 +101,10 @@
|
||||||
|
|
||||||
(pass-if-equal "second line, whitespace, nl"
|
(pass-if-equal "second line, whitespace, nl"
|
||||||
"ISO-8859-1"
|
"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