1
Fork 0
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:
Ludovic Courtès 2014-01-17 18:18:41 +01:00
parent 802a25b1ed
commit 3ff8a9d6ff
2 changed files with 31 additions and 9 deletions

View file

@ -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;

View file

@ -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"))))