1
Fork 0
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:
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 /* 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;

View file

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