Bug 37572 - Падает при переходе на шаг разбивки диска
Summary: Падает при переходе на шаг разбивки диска
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: guile-evms (show other bugs)
Version: unstable
Hardware: all Linux
: P3 major
Assignee: Slava Aseev
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-12-04 13:04 MSK by Антон Мидюков
Modified: 2019-12-06 12:07 MSK (History)
9 users (show)

See Also:


Attachments
облом установки (19.81 KB, image/png)
2019-12-04 13:33 MSK, Антон Мидюков
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Антон Мидюков 2019-12-04 13:04:33 MSK
Я пробую перейти на симлинки /var/run -> /run и /var/lock -> /run/lock
На p9 получилось, а на Сизифе livecd-install падает при переходе на шаг разбивки дисков:
livecd-install 
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
QObject::moveToThread: Cannot move objects with a parent
WARNING: (alterator lookout evaluation): imported module (alterator presentation events) overrides core binding `when'
frame:on-next is deprecated, use wizard-bind instead
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: CRC error
frame:next-activity is deprecated, use wizard-update-activity instead
frame:next-activity is deprecated, use wizard-update-activity instead
frame:on-next is deprecated, use wizard-bind instead
frame:on-back is deprecated, use wizard-bind instead
frame:on-next is deprecated, use wizard-bind instead
Backtrace:
In interfaces/guile/presentation/container.scm:
   212:44 19 (_ _ _)
In ice-9/eval.scm:
    619:8 18 (_ #(#(#<directory (alterator lookout evaluation)…> …) …))
In interfaces/guile/lookout/goto.scm:
     66:6 17 (document:replace-in-widget _ _ . _)
     32:2 16 (clean-widget #<procedure 2c19b00 at interfaces/guile/…> …)
In interfaces/guile/presentation/container.scm:
   212:44 15 (_ _ _)
In ice-9/eval.scm:
   293:34 14 (_ #(#(#<directory (alterator lookout evaluation)…> …) …))
    619:8 13 (_ #(#(#<directory (alterator lookout evaluation) 2…> …)))
In interfaces/guile/lookout/goto.scm:
    39:25 12 (clean-widget #<procedure 2badb40 at interfaces/guile/…> …)
In ice-9/eval.scm:
   174:20 11 (_ #(#(#<directory (alterator lookout evaluation) 2…> …)))
   177:49 10 (lp (#<procedure 29a1c80 at ice-9/eval.scm:182:7 (en…> …))
   177:49  9 (lp (#<procedure 29a1c40 at ice-9/eval.scm:182:7 (en…> …))
   177:32  8 (lp (#<procedure 29a1c00 at ice-9/eval.scm:187:12 (env)>))
   298:42  7 (_ #(#(#<directory (alterator lookout evaluation) 2…> …)))
In interfaces/guile/woo.scm:
   127:12  6 (woo-list/name _ . _)
In interfaces/guile/logfile.scm:
     37:7  5 (_ (("/evms/storage/volumes" language ("ru_RU") # "…")) #)
In interfaces/guile/d.scm:
   162:10  4 (_ (("/evms/storage/volumes" language ("ru_RU") # "…")) #)
In srfi/srfi-1.scm:
   679:15  3 (append-map _ _ . _)
   592:17  2 (map1 (("/evms/storage/volumes" language ("ru_RU") # #)))
In unknown file:
           1 (request-unix-server "/var/run/alteratord/.socket" "(\…" …)
In ice-9/boot-9.scm:
   751:25  0 (dispatch-exception 0 internal-error (wrong-type-arg # …))

ice-9/boot-9.scm:751:25: In procedure dispatch-exception:
Throw to key `internal-error' with args `(wrong-type-arg #f "Wrong type to apply: ~S" (#f) (#f))'.
Comment 1 Антон Мидюков 2019-12-04 13:13:24 MSK
/var/run/alteratord/.socket действительно нет.
Comment 2 manowar@altlinux.org 2019-12-04 13:22:17 MSK
Да, только что хотел написать, что "wrong-type-arg" --- это не настоящая ошибка, а следствие несовершенства проброса исключений в альтераторе.

А почему файла сокета нет, ты понимаешь?
Comment 3 Антон Мидюков 2019-12-04 13:33:27 MSK
Created attachment 8443 [details]
облом установки

(В ответ на комментарий №2)
> А почему файла сокета нет, ты понимаешь?

Не понимаю. Как он там оказаться должен?

Собрал устнаовочный образ, там при переходе на шаг разбивки, на перезагрузку уходит, не может найти altinst
Comment 4 Антон Мидюков 2019-12-04 13:43:03 MSK
Дело не в переходе на симлинки. Что-то сломали вчера. В сегодняшних регулярках ловится, а в них всё по-старому. Вчерашние норм.
Comment 5 manowar@altlinux.org 2019-12-04 14:19:17 MSK
> Что-то сломали вчера.

Тогда вопрос: а точно дело в симлинках? Если сейчас _перед_ запуском инсталлятора смонтировать настоящий /var/run и потом запустить инсталлятор, то проблема уйдёт?
Comment 6 Антон Мидюков 2019-12-04 14:29:22 MSK
(В ответ на комментарий №5)
> > Что-то сломали вчера.
> 
> Тогда вопрос: а точно дело в симлинках? Если сейчас _перед_ запуском
> инсталлятора смонтировать настоящий /var/run и потом запустить инсталлятор, то
> проблема уйдёт?

Дело не в симлинках. В сегодняшних регулярках, где /var/run не симлинк, проблема есть.

Откатил версию alterator-browser-qt5, не помогло.
Comment 7 Антон Мидюков 2019-12-04 14:44:15 MSK
Сделал в лайве downgrade на 2.12.2019. Затем обновлял пакеты по одному до сегодняшнего дня. Проблема возникает после обновления пакета guile-evms.
Comment 8 manowar@altlinux.org 2019-12-04 14:52:47 MSK
(В ответ на комментарий №3)
> (В ответ на комментарий №2)
> > А почему файла сокета нет, ты понимаешь?
> 
> Не понимаю. Как он там оказаться должен?

Смотри, вот у меня система p9, обновлённая до Сизифа:

# grep 'run' /proc/mounts
runfs /run tmpfs rw,relatime,mode=755 0 0
tmpfs /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k,mode=755 0 0
runfs /var/run tmpfs rw,relatime,mode=755 0 0
tmpfs /run/user/500 tmpfs rw,nosuid,nodev,noexec,relatime,size=151920k,mode=700,uid=500,gid=500 0 0
tmpfs /var/run/user/500 tmpfs rw,nosuid,nodev,noexec,relatime,size=151920k,mode=700,uid=500,gid=500 0 0

# netstat -lpn | grep 'alteratord'
unix  2      [ ACC ]     STREAM     LISTENING     12223  1/init              /run/alteratord/.socket

# LANG=C stat /var/run/alteratord/.socket | grep 'Inode'
Device: 15h/21d	Inode: 12224       Links: 1

# LANG=C stat /run/alteratord/.socket | grep 'Inode'
Device: 15h/21d	Inode: 12224       Links: 1

# grep 'Listen' /lib/systemd/system/alteratord.socket 
ListenStream=/var/run/alteratord/.socket

То-есть:
1. такой файл сокета существует;
2. это один и тот же файл в двух местах одновременно;
3. ни одна из директорий /var/run и /run не является симлинком;
4. в alteratord.socket записан путь с /var/run.

Вероятно, /var и /var/run связаны через mount -o bind, но как это проверить я не знаю.
Comment 9 Антон Мидюков 2019-12-04 15:01:24 MSK
(В ответ на комментарий №8)
> То-есть:
> 1. такой файл сокета существует;
> 2. это один и тот же файл в двух местах одновременно;
> 3. ни одна из директорий /var/run и /run не является симлинком;
> 4. в alteratord.socket записан путь с /var/run.
> 
> Вероятно, /var и /var/run связаны через mount -o bind, но как это проверить я
> не знаю.

Да, на системах с systemd они связаны mount -o bind. Это создаёт иногда проблемы с размонтированием /run при выключении. Именно поэтому нужно перейти на симлинк.
Я имел в виду, что я не знаю, когда именно он там должен появиться, и почему он там не появился.

Но это всё к проблеме отношения не имеет. Вопрос: почему обновление guile-evms поломало альтератор? Достаточно ли пересборки или что-то более серьёзное?
Comment 10 Anton Farygin 2019-12-04 15:06:34 MSK
Может быть Сергей Большаков что-то подскажет
Comment 11 manowar@altlinux.org 2019-12-04 15:12:21 MSK
А я тем временем посмотрю на проброс исключений в альтераторе: чтобы мы видели действительное сообщение об ошибке.
Comment 12 Sergey Bolshakov 2019-12-04 15:29:48 MSK
(In reply to comment #10)
> Может быть Сергей Большаков что-то подскажет
я посмотрю
Comment 13 Ivan Zakharyaschev 2019-12-04 19:02:35 MSK
(In reply to comment #7)
> Сделал в лайве downgrade на 2.12.2019. Затем обновлял пакеты по одному до
> сегодняшнего дня. Проблема возникает после обновления пакета guile-evms.

Посмотрел одно изменение. Не могу сообразить, всё ли здесь хорошо:

From 3d6df0d9b6e451ab8ad99e59f473d0812795c89b Mon Sep 17 00:00:00 2001
From: Sergey Bolshakov <sbolshakov@altlinux.org>
Date: Tue, 3 Dec 2019 12:58:50 +0300
Subject: [PATCH] make space for terminating zero

---
 appstructs.i |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/appstructs.i b/appstructs.i
index 3d17671..a304601 100644
--- a/appstructs.i
+++ b/appstructs.i
@@ -442,7 +442,7 @@ static char * mangle_name(char * sname)
 {
 	static char name[EVMS_MAX_NAME_SIZE+1];
 	char *s;
-	s = strncpy(name, sname, EVMS_MAX_NAME_SIZE+1);
+	s = strncpy(name, sname, EVMS_MAX_NAME_SIZE);
 	while((s = strchr(s, '/')) != NULL)
 		*s++ = '|';
 	return name;
-- 
1.7.3.3

До изменения, если длина sname была EVMS_MAX_NAME_SIZE+1, т.е. в sname[EVMS_MAX_NAME_SIZE+1] был 0, то в name копировалось всё, кроме 0 в конце, и строка name оказывалась не null-terminated. Все EVMS_MAX_NAME_SIZE+1 байтов name были заполнены при этом.

Так что раньше нормально обрабатывались строки длиной <= EVMS_MAX_NAME_SIZE.

После изменения, если длина sname EVMS_MAX_NAME_SIZE, т.е. в sname[EVMS_MAX_NAME_SIZE] был 0, то в name копируется всё, кроме 0 в конце. EVMS_MAX_NAME_SIZE байтов name были заполнены при этом, последний name[EVMS_MAX_NAME_SIZE] не трогался. Строка name окажется не null-terminated, если name[EVMS_MAX_NAME_SIZE] не был уже инициализирован в 0.

А инициализируются ли static-массивы в 0?.. По-мрему, да. Так что не вижу тут ошибок при обработке строк той же длины, что обрабатывались раньше.

Нормально ли возвращать указатель на статический массив, который будет изменён при следующем вызове этой функции, а не копировать?... Выглядит не очень хорошо, но без изучения остального кода невозможно понять. (Также это не thread-safe.)
Comment 14 Ivan Zakharyaschev 2019-12-04 19:47:04 MSK
(In reply to comment #13)

> Нормально ли возвращать указатель на статический массив, который будет изменён
> при следующем вызове этой функции, а не копировать?... Выглядит не очень
> хорошо, но без изучения остального кода невозможно понять. (Также это не
> thread-safe.)

Используется, например, так:

appstructs.i:479 http://git.altlinux.org/gears/g/guile-evms.git?p=guile-evms.git;a=blob;f=appstructs.i#l479 :

%extend storage_object_info_s {
         char *sname() {
                 return mangle_name(self->name);
         }



evms.scm:248 http://git.altlinux.org/gears/g/guile-evms.git?p=guile-evms.git;a=blob;f=evms.scm#l248 :

(define storage-id
  (let ((ids '()))
    (lambda (in)
      (case (storage-object-info-t-object-type in)
        ((disk)
         (let ((name (storage-object-info-t-sname in)))
           (if (pair? (assoc name ids)) (assoc-ref ids name)
               (let ((id (and-let*
                          ((port (false-if-exception
                                  (open-input-pipe
                                   (cond ((string-prefix? "sd" name)
                                          (string-append "cat /sys/block/" name "/device/model"))
                                         ((string-prefix? "hd" name)
                                          (string-append "cat /proc/ide/" name "/model"))
                                         (#t "cat /dev/null")))))
                           (id (false-if-exception (read-line port 'trim))))
                          (close-pipe port)
                          (if (eof-object? id) #f
                              id))))
                 (set! ids (acons name id ids))
                 id))))
        (else #f)))))

Эта строка сохраняется в списке ids, но, наверное, при превращении из C в guile она представляется по-другому и туда копируется, так что проблем быть не должно -- https://www.gnu.org/software/guile/manual/html_node/Conversion-to_002ffrom-C.html#Conversion-to_002ffrom-C :

C Function: SCM scm_from_locale_string (const char *str)
C Function: SCM scm_from_locale_stringn (const char *str, size_t len)

    Creates a new Scheme string that has the same contents as str when interpreted in the character encoding of the current locale.

    For scm_from_locale_string, str must be null-terminated.

    For scm_from_locale_stringn, len specifies the length of str in bytes, and str does not need to be null-terminated. If len is (size_t)-1, then str does need to be null-terminated and the real length will be found with strlen.

    If the C string is ill-formed, an error will be raised.

    Note that these functions should not be used to convert C string constants, because there is no guarantee that the current locale will match that of the execution character set, used for string and character constants. Most modern C compilers use UTF-8 by default, so to convert C string constants we recommend scm_from_utf8_string. 

C Function: SCM scm_take_locale_string (char *str)
C Function: SCM scm_take_locale_stringn (char *str, size_t len)

    Like scm_from_locale_string and scm_from_locale_stringn, respectively, but also frees str with free eventually. Thus, you can use this function when you would free str anyway immediately after creating the Scheme string. In certain cases, Guile can then use str directly as its internal representation. 

если не функции scm_take_*string* используются.
Comment 15 Sergey Bolshakov 2019-12-04 20:52:06 MSK
ох, сколько всего мы узнали -- но я думаю, что первое, что сделаю завтра утром --  пересоберу guile-evms с помощью gcc8
Comment 16 Ivan Zakharyaschev 2019-12-05 00:55:01 MSK
(In reply to comment #15)
> ох, сколько всего мы узнали --

ну интерсно же, побольше понять о том, как это всё работает.

> но я думаю, что первое, что сделаю завтра утром
> --  пересоберу guile-evms с помощью gcc8

разумно
Comment 17 Sergey Bolshakov 2019-12-05 12:57:40 MSK
пока известно вот что:
alt10 из p9 или архива + актуальный сизиф => работает
он же, пересобранный что gcc8, что gcc9 => проблема.
Comment 18 Антон Мидюков 2019-12-05 17:56:18 MSK
(В ответ на комментарий №17)
> пока известно вот что:
> alt10 из p9 или архива + актуальный сизиф => работает
> он же, пересобранный что gcc8, что gcc9 => проблема.

С заданием
[#242352] TESTED guile-evms.git=guile-evms-0.5-alt12

на проблемном лайве установка прошла успешно.
Comment 19 Sergey Bolshakov 2019-12-05 17:57:56 MSK
оперативно, спасибо
Comment 20 Антон Мидюков 2019-12-06 12:07:56 MSK
Собрал сегодня regular-lxde, regular-server-systemd, regular-server-sysv. Все нормально установились.