<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>21061</bug_id>
          
          <creation_ts>2009-08-14 02:41:41 +0400</creation_ts>
          <short_desc>Crashes right from the start</short_desc>
          <delta_ts>2009-08-24 01:45:34 +0400</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>nickle</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>critical</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Rusakov">ktirf</reporter>
          <assigned_to name="Ilya Mashkin">oddity</assigned_to>
          <cc>oddity</cc>
    
    <cc>php-coder</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>96397</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Rusakov">ktirf</who>
    <bug_when>2009-08-14 02:41:41 +0400</bug_when>
    <thetext>Хотел посмотреть, что это за софтина для прототипирования, но меня ждал жестокий облом:
$ nickle 
*** buffer overflow detected ***: nickle terminated
======= Backtrace: =========
/lib/libc.so.6(__fortify_fail+0x40)[0xb7e32f30]
/lib/libc.so.6[0xb7e31180]
/lib/libc.so.6(__strcpy_chk+0x44)[0xb7e304f4]
nickle(NewStrString+0x43)[0x807cc03]
nickle(StringInit+0x1b)[0x807cd0b]
nickle(ValueInit+0x7e)[0x808264e]
nickle(init+0x15)[0x806fb75]
nickle(main+0x11a)[0x806fe0a]
/lib/libc.so.6(__libc_start_main+0xe6)[0xb7d6bb26]
nickle[0x8050da1]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96489</commentid>
    <comment_count>1</comment_count>
      <attachid>3739</attachid>
    <who name="Slava Semushin">php-coder</who>
    <bug_when>2009-08-15 11:43:12 +0400</bug_when>
    <thetext>Created attachment 3739
Use memcpy() instead of strcpy()

Хм, посмотрел на код. Почему-то не помогла замена на strncpy(). Не очень понял всех тонкостей кода и как это работает. Но увидел как конкатенируются строки в ф-ции strPlus() и сделал по аналогии -- использовал memcpy(). После этого программа падать не стала.

Кстати, если собрать программу более старым компилятором -- gcc4.4-4.4.0-alt3, то она не падает, а вот уже с 4.4.0-alt6 начинает падать.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96497</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Rusakov">ktirf</who>
    <bug_when>2009-08-15 15:19:16 +0400</bug_when>
    <thetext>После https://bugzilla.altlinux.org/show_bug.cgi?id=20842 мне этот вариант не очень по душе. То что замена на strncpy не помогла, очень подозрительно.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96499</commentid>
    <comment_count>3</comment_count>
    <who name="Alexey Rusakov">ktirf</who>
    <bug_when>2009-08-15 15:36:01 +0400</bug_when>
    <thetext>М-да. Ну всё понятно. И почему strcpy обламывается, и strncpy не помогает. Досточтимый апстримовый изобретатель велосипедов не осилил написать корректную реализацию строк в стиле языка Паскаль. Даже не знаю за что хвататься, за пистолет или за текстовый редактор. Могу лишь сказать, что приведённый патч не работает. Почему - см. файл value.h, определение макроса StringChars.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96525</commentid>
    <comment_count>4</comment_count>
    <who name="Slava Semushin">php-coder</who>
    <bug_when>2009-08-15 18:48:26 +0400</bug_when>
    <thetext>(В ответ на комментарий №3)
&gt; Почему - см. файл value.h, определение макроса StringChars.

Ты про s+1? Я так и не понял зачем это.

Кстати, автору я отписал и свой (пусть и неправильный патч) приложил. Посмотрим, что он ответит и как будет это исправлять.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96531</commentid>
    <comment_count>5</comment_count>
    <who name="Alexey Rusakov">ktirf</who>
    <bug_when>2009-08-15 23:05:39 +0400</bug_when>
    <thetext>(В ответ на комментарий №4)
&gt; (В ответ на комментарий №3)
&gt; &gt; Почему - см. файл value.h, определение макроса StringChars.
&gt; 
&gt; Ты про s+1? Я так и не понял зачем это.
Я ещё сам до конца не разобрался, что, собственно, происходит, но мне уже не хочется продолжать.
s+1 - это такая чёрная магия. Товарищ хранит сначала структуру-дескриптор строки (тип под названием String), а ПРЯМО следом за ней - байтики, из которых состоит строка (см. реализацию NewString() ). Поскольку в StringChars передаётся String*, то s+1 указывает на позицию ЗА дескриптором. Но вообще говоря, s+1 вовсе необязательно будет указывать на непосредственно следующий за дескрипотором _байт_. А памяти между тем выделяется впритык. Код, который валится, всего-то навсего пытается разместить в такой структуре пустую строку. strcpy и strncpy (в силу своих реализация) пытаются записать нулевой байт, но передаваемый им указатель лежит за пределами выделенной области памяти, и поэтому проверка границ благополучно сваливается. А memcpy никакого нулевого байта не пишет, и в данном конкретном коде просто копирует ровно 0 байт, с неизменно превосходным результатом. Зато когда memcpy попытается скопировать больше 0 байт, произойдёт то же самое.

&gt; Кстати, автору я отписал и свой (пусть и неправильный патч) приложил.
&gt; Посмотрим, что он ответит и как будет это исправлять.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96547</commentid>
    <comment_count>6</comment_count>
    <who name="Slava Semushin">php-coder</who>
    <bug_when>2009-08-16 11:38:13 +0400</bug_when>
    <thetext>(В ответ на комментарий №5)
&gt; (В ответ на комментарий №4)
&gt; &gt; (В ответ на комментарий №3)
&gt; &gt; &gt; Почему - см. файл value.h, определение макроса StringChars.
&gt; &gt; 
&gt; &gt; Ты про s+1? Я так и не понял зачем это.
&gt; Я ещё сам до конца не разобрался, что, собственно, происходит, но мне уже не
&gt; хочется продолжать.

Ты мог бы объяснить автору на нормальном английском в чем тут проблема? Потому что:

&gt;&gt; May be you can apply my patch or made better fix for this?

&gt;I don&apos;t understand why this works though -- strcpy should write
&gt;precisely the same sequence of bytes as memcpy, along with the trailing
&gt;&apos;\0&apos; character into a buffer which is allocated to be the length of the
&gt;string plus one bytes long.

&gt;Sounds like there&apos;s some kind of compiler bug we&apos;ve uncovered here, and
&gt;I&apos;m afraid it will affect more than just nickle.

Это цитата Keith Packard, автора nickle.

&gt; Зато когда memcpy попытается скопировать больше 0 байт, произойдёт то же самое.

У меня не происходило. Наверное, повезло?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96551</commentid>
    <comment_count>7</comment_count>
    <who name="Alexey Rusakov">ktirf</who>
    <bug_when>2009-08-16 12:50:14 +0400</bug_when>
    <thetext>(В ответ на комментарий №6)
&gt; Ты мог бы объяснить автору на нормальном английском в чем тут проблема?
Для начала неплохо бы на самом деле разобраться, в чём проблема. Пока я вижу проблему в голове автора, но вряд ли он это признает :)

&gt; &gt; Зато когда memcpy попытается скопировать больше 0 байт, произойдёт то же самое.
&gt; 
&gt; У меня не происходило. Наверное, повезло?
Не знаю. Может, и я где-то ошибся с анализом. Отлаживать надо. Но я не мейнтейнер этого пакета и мне лень с ним возиться.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96577</commentid>
    <comment_count>8</comment_count>
    <who name="Ilya Mashkin">oddity</who>
    <bug_when>2009-08-16 22:13:43 +0400</bug_when>
    <thetext>Лёш, с удовольствием тебе его отдам :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96584</commentid>
    <comment_count>9</comment_count>
    <who name="Alexey Rusakov">ktirf</who>
    <bug_when>2009-08-17 00:57:55 +0400</bug_when>
    <thetext>??? Он мне на фиг не сдался. Лучше вон php-coder&apos;у, он даже патчи к нему пишет :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96585</commentid>
    <comment_count>10</comment_count>
    <who name="Sir Raorn">raorn</who>
    <bug_when>2009-08-17 01:17:17 +0400</bug_when>
    <thetext>Тогда проще сразу в orphaned отправить...  (/me runs!!!)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96595</commentid>
    <comment_count>11</comment_count>
    <who name="Slava Semushin">php-coder</who>
    <bug_when>2009-08-17 07:07:29 +0400</bug_when>
    <thetext>(В ответ на комментарий №9)
&gt; ??? Он мне на фиг не сдался. Лучше вон php-coder&apos;у, он даже патчи к нему пишет
&gt; :)

Мне эта программа интересна только из-за того, что она падает. Когда это будет исправлено она мне станет не интересна. (Впрочем, если мне выдадут права на NMU, то я самолично исправлю это падение.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96683</commentid>
    <comment_count>12</comment_count>
    <who name="Ilya Mashkin">oddity</who>
    <bug_when>2009-08-17 23:01:28 +0400</bug_when>
    <thetext>добавил nmu на php-coder</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96871</commentid>
    <comment_count>13</comment_count>
    <who name="Slava Semushin">php-coder</who>
    <bug_when>2009-08-19 21:56:52 +0400</bug_when>
    <thetext>(В ответ на комментарий №3)
&gt; Могу лишь сказать, что приведённый патч не работает.

Алексей, а ты можешь попробовать пересобрать nickle с последней версией gcc? (4.4.1-alt1) После пересборки с ним у меня не падает, как раньше, и даже патчи не понадобились. (Похоже, что это был действительно баг компилятора...)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>97141</commentid>
    <comment_count>14</comment_count>
    <who name="Repository Robot">repository-robot</who>
    <bug_when>2009-08-24 01:45:34 +0400</bug_when>
    <thetext>nickle-2.68-alt1.1 -&gt; sisyphus:

* Sun Aug 23 2009 Slava Semushin &lt;php-coder@altlinux&gt; 2.68-alt1.1

- NMU
- Rebuild with gcc 4.4.1-alt1 to fix crash after start (Closes: #21061)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>3739</attachid>
            <date>2009-08-15 11:43:12 +0400</date>
            <delta_ts>2009-08-15 11:43:12 +0400</delta_ts>
            <desc>Use memcpy() instead of strcpy()</desc>
            <filename>0001-string.c-NewStrString-replace-strcpy-to-memcpy.patch</filename>
            <type>text/plain</type>
            <size>765</size>
            <attacher name="Slava Semushin">php-coder</attacher>
            
              <data encoding="base64">RnJvbSA3NmRkMTdhODQwODM1YTMxMzBmMmY2MWYwMGYyOTI2MWYyZjIzODZjIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBTbGF2YSBTZW11c2hpbiA8cGhwLWNvZGVyQGFsdGxpbnV4LnJ1
PgpEYXRlOiBTYXQsIDE1IEF1ZyAyMDA5IDE0OjM3OjAxICswNzAwClN1YmplY3Q6IFtQQVRDSF0g
c3RyaW5nLmMoTmV3U3RyU3RyaW5nKTogcmVwbGFjZSBzdHJjcHkoKSB0byBtZW1jcHkoKS4KCkZp
eGVkIHNlZ2ZhdWx0IGF0IHN0YXJ0LgoKU2VlIGZvciBkZXRhaWxzOiBodHRwczovL2J1Z3ppbGxh
LmFsdGxpbnV4Lm9yZy8yMTA2MQotLS0KIG5pY2tsZS9zdHJpbmcuYyB8ICAgIDIgKy0KIDEgZmls
ZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh
L25pY2tsZS9zdHJpbmcuYyBiL25pY2tsZS9zdHJpbmcuYwppbmRleCBhZTNlMzgxLi5kOTAwMjY1
IDEwMDY0NAotLS0gYS9uaWNrbGUvc3RyaW5nLmMKKysrIGIvbmlja2xlL3N0cmluZy5jCkBAIC0y
NDYsNyArMjQ2LDcgQEAgTmV3U3RyU3RyaW5nIChjb25zdCBjaGFyICpzdHIpCiAgICAgVmFsdWUg
ICByZXQ7CiAKICAgICByZXQgPSBOZXdTdHJpbmcgKHN0cmxlbiAoc3RyKSk7Ci0gICAgc3RyY3B5
IChTdHJpbmdDaGFycyAoJnJldC0+c3RyaW5nKSwgc3RyKTsKKyAgICBtZW1jcHkoU3RyaW5nQ2hh
cnMoJnJldC0+c3RyaW5nKSwgc3RyLCByZXQtPnN0cmluZy5sZW5ndGgpOwogICAgIFJFVFVSTiAo
cmV0KTsKIH0KIAotLSAKMS42LjMuMwoK
</data>

          </attachment>
      

    </bug>

</bugzilla>