Bug 9376 - Filenames created by exsl:document should be unescaped
: Filenames created by exsl:document should be unescaped
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/libxslt)
: unstable
: all Linux
: P2 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2006-04-06 16:19 by
Modified: 2006-06-13 12:59 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2006-04-06 16:19:08
При сборке стилями DocBook XSL формата HTML dir и указании 'base.dir' 'путь с
национальными символами или пробелом' xsltproc сначала кодирует нац. символы и
пробел в %nn, а при создании файлов не раскодирует их обратно.

Есть предложение собирать libxslt с таким патчем:
diff -ur libxslt-1.1.15.orig/libxslt/transform.c
libxslt-1.1.15/libxslt/transform.c
--- libxslt-1.1.15.orig/libxslt/transform.c     2005-08-31 14:47:15 +0400
+++ libxslt-1.1.15/libxslt/transform.c  2006-04-06 15:07:00 +0400
@@ -2060,6 +2060,11 @@
     }

     /*
+     * Unescape filename for non ASCII world
+     */
+    filename = (xmlChar *) xmlURIUnescapeString((const char
*)filename,0,NULL);
+
+    /*
      * Security checking: can we write to this resource
      */
     if (ctxt->sec != NULL) {

См.
http://bugzilla.gnome.org/show_bug.cgi?id=337486

Правда, автору говорили о проблеме ещё год назад, и похоже, что он в очередной
раз упёрся рогом.
------- Comment #1 From 2006-06-03 01:39:42 -------
У меня тоже есть сомнения, что имена можно безопасно раскодировать.

Из какого байтового представления имена файлов кодируются в URI encoding?
В каком месте в libxslt происходит кодирование?
------- Comment #2 From 2006-06-06 15:49:28 -------
Автор не высказывал сомнений в безопасности раскодирования, он просто забил на
баг репорт в рассылке.

В libxml2-2.6.24 используется xmlURIUnescapeString для доступа к файлу, см.
ниже. Почему она не используется при доступе к файлу в libxslt ? Насколько я
понимаю, семантика там идентичная.

/libxslt/transform.c

./xmlIO.c-772-/**
./xmlIO.c-773- * xmlFileOpen:
./xmlIO.c-774- * @filename:  the URI for matching
./xmlIO.c-775- *
./xmlIO.c-776- * Wrapper around xmlFileOpen_real that try it with an unescaped
./xmlIO.c-777- * version of @filename, if this fails fallback to @filename
./xmlIO.c-778- *
./xmlIO.c-779- * Returns a handler or NULL in case or failure
./xmlIO.c-780- */
./xmlIO.c-781-void *
./xmlIO.c-782-xmlFileOpen (const char *filename) {
./xmlIO.c-783-    char *unescaped;
./xmlIO.c-784-    void *retval;
./xmlIO.c-785-
./xmlIO.c:786:    unescaped = xmlURIUnescapeString(filename, 0, NULL);
./xmlIO.c-787-    if (unescaped != NULL) {
./xmlIO.c-788-  retval = xmlFileOpen_real(unescaped);
./xmlIO.c-789-  xmlFree(unescaped);
./xmlIO.c-790-    } else {
./xmlIO.c-791-  retval = xmlFileOpen_real(filename);
./xmlIO.c-792-    }
./xmlIO.c-793-    return retval;
./xmlIO.c-794-}

Обсуждения проблемы на тему чтения из файла:
http://mail.gnome.org/archives/xslt/2001-July/msg00026.html
http://mail.gnome.org/archives/xml/2005-August/msg00019.html

Обсуждение на тему exsl:document сходу не нашёл.

В любом случае, при записи в файл нужно открывать файл, а не пытаться открыть
URI. Проблему с отсутствием явной кодировки я понимаю, и есть мнение, что
filename -> escape -> unescape даёт filename независимо от кодировки, потому
что
функции кодирования/декодирования работают побайтно (AFAIK). Мнение
подтверждается тем фактом, что с приложенным патчем у меня работает нормально
запись в файлы с пробелами в именах. Под win32 и linux.

Запись в файлы с именами в latin1 тоже работает.
------- Comment #3 From 2006-06-06 15:51:05 -------
В предыдущий комментарий строка:
libxslt/transform.c
попала по ошибке.
------- Comment #4 From 2006-06-07 00:25:08 -------
Да, поскольку в <exsl:document> именно URI, то его нужно раскодировать.
Сделаю.
------- Comment #5 From 2006-06-08 11:41:03 -------
Как насчет доработать патч на предмет избавления от утечки памяти?
Первый буфер, на который указывает filename, после преобразования просто
теряется.

Я могу это сделать сам, но позже.
------- Comment #6 From 2006-06-09 03:09:54 -------
Через несколько строк в коде после предлагаемого изменения вызывается
xsltCheckWrite, которая, судя по документации, тоже хочет URI.
И outputFile в xsltTransformContext должен быть URI.

Наверное, перекодировка должна происходить все-таки позже и уровнем ниже (т.к.
должен сработать и xsltCheckWrite, и последующая запись). В существуюм виде
патч
применять воздержусь, нужно смотреть еще.
------- Comment #7 From 2006-06-12 14:28:45 -------
Fixed in libxml2-2.6.26-alt2 and libxslt-1.1.17-alt1.
See the GNOME bug for details.
------- Comment #8 From 2006-06-13 12:59:46 -------
Ваш патч впечатляет, спасибо!