LINUX.ORG.RU

Python: обнаружены ошибки, приводящие к переполнению буфера

 ,


0

0

Уязвимы Python 2.5.2 и более ранние версии. Опасность критическая. В фукциях PyString_FromStringAndSize() и PyUnicode_FromStringAndSize() допускается использование отрицательного значения второго параметра, что приводит к переполнению буфера.

>>> Подробности



Проверено: Shaman007 ()

Питон, конечно, не идеален, но по соотношению приложенные_усилия/результат он на данный момент лучший.

anonymous
()

> Perl рулит, Питон со%#т!

+512

anonymous
()
Ответ на: комментарий от anonymous

> А руби пока слишком медленен.

После выхода 1.9.0 гонял решето Эратосфена на разных языках, celeron 3000, SuSe 10.3, 10000 итераций

perl - 11c

python - 17

ruby 1.8.6 - 21, 1.9.0 - 4.75c

lua - 13

luajit - 3,7c

Сам пишу на Java и Perl, данное сравнение было сделано просто ради интереса.

anonymous
()
Ответ на: комментарий от anonymous

Намерял ты цену дров на марсе в районе северного ледяного панциря :) Вот смотри сюда, http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=all&lang=... Обычый питон рвет руби коре 1.9.0, если сравнивать в психическим питоном - по это "... Тузик грелку" :)

Каптча: babning - аааа! Откуда они знают !? :-)

anonymous
()
Ответ на: комментарий от anonymous

Посмотрел. Заодно и на http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=nsieve&la... и http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=nsieve&la... с текстами программ. В python используются from itertools import count, islice, izip. А если бы применить import sieve, предварительно написанный на C...

Переписал sieve из руби на питон, получилось следующее

> python -V Python 2.5.1

> time python nsieve.py 78498

real 0m2.071s user 0m1.820s sys 0m0.024s

> ruby -v ruby 1.8.6 (2007-06-07 patchlevel 36) [i586-linux]

> time ruby nsieve.rb 78498

real 0m4.296s user 0m2.984s sys 0m0.008s

> ruby -v ruby 1.9.0 (2007-12-25 revision 14709) [i686-linux]

> time ruby nsieve2.rb 78498

real 0m1.054s user 0m0.920s sys 0m0.004s

> cat nsieve.py def sieve(m): flags = [1] * m count = 0 pmax = m - 1 p = 2 while p <= pmax: if flags[p] != 0: count += 1 mult = p while mult <= pmax: flags[mult] = 0 mult += p p += 1 return count

print sieve(1000000)

> cat nsieve.rb def sieve(m) flags = "\x1" * m count = 0 pmax = m - 1 p = 2 while p <= pmax unless flags[p].zero? count += 1 mult = p while mult <= pmax flags[mult] = 0 mult += p end end p += 1 end count end

count = sieve(1000000) printf "%8d\n", count

> cat nsieve2.rb def sieve(m) flags = [1] * m count = 0 pmax = m - 1 p = 2 while p <= pmax unless flags[p]==0 count += 1 mult = p while mult <= pmax flags[mult] = 0 mult += p end end p += 1 end count end

count = sieve(1000000) printf "%8d\n", count

anonymous
()
Ответ на: комментарий от anonymous

Форматирование съехало.

Посмотрел. Заодно и на http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=nsieve&lang=yar
v&id=2
и
http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=nsieve&lang=pyt
hon&id=4
с текстами программ.
В python используются from itertools import count, islice, izip.
А если бы применить import sieve, предварительно написанный на C...

Переписал sieve из руби на питон, получилось следующее

> python -V
Python 2.5.1

> time python nsieve.py
78498

real    0m2.071s
user    0m1.820s
sys     0m0.024s


> ruby -v
ruby 1.8.6 (2007-06-07 patchlevel 36) [i586-linux]

> time ruby nsieve.rb
   78498

real    0m4.296s
user    0m2.984s
sys     0m0.008s

> ruby -v
ruby 1.9.0 (2007-12-25 revision 14709) [i686-linux]

> time ruby nsieve2.rb
   78498

real    0m1.054s
user    0m0.920s
sys     0m0.004s

> cat nsieve.py
def sieve(m):
    flags = [1] * m
    count = 0
    pmax = m - 1
    p = 2
    while p <= pmax:
        if flags[p] != 0:
            count += 1
            mult = p
            while mult <= pmax:
                flags[mult] = 0
                mult += p
        p += 1
    return count

print sieve(1000000)

> cat nsieve.rb
def sieve(m)
  flags = "\x1" * m
  count = 0
  pmax = m - 1
  p = 2
  while p <= pmax
    unless flags[p].zero?
      count += 1
      mult = p
      while mult <= pmax
        flags[mult] = 0
        mult += p
      end
    end
    p += 1
  end
  count
end

count = sieve(1000000)
printf "%8d\n", count

> cat nsieve2.rb
def sieve(m)
  flags = [1] * m
  count = 0
  pmax = m - 1
  p = 2
  while p <= pmax
    unless flags[p]==0
      count += 1
      mult = p
      while mult <= pmax
        flags[mult] = 0
        mult += p
      end
    end
    p += 1
  end
  count
end

count = sieve(1000000)
printf "%8d\n", count

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.