<-
Apache > HTTP Server > Documentation > Version 2.0 > Developer Documentation

Apacheские 2.0 Проблемы Безопасности Нити

используя любой из переплетенных mpms в Apacheе 2.0 важно, что каждая функция звонила от Apacheа быть сейфом нити. Связываясь в 3-ьих партийных расширениях может быть трудно определить, будет ли получающийся сервер сейфом нити. Случайное испытание вообще не будет говорить Вам это любой, поскольку проблемы безопасности нити могут привести к тонкой гонке conditons, который может только обнаружиться в определенных условиях под тяжелым грузом.

top

Global and static variables

при письме вашего модуля или пробуя определять, являются ли модуль или 3-ья партийная библиотека сейф нити, есть некоторые общие вещи, чтобы иметь в виду.

сначала, Вы должны признать, что в переплетенной модели каждая индивидуальная нить имеет ее собственный прилавок программы, стек и регистраторов. Местные переменные, живые на стеке, таким образом те прекрасны. Вы должны не упустить любые статические или глобальные переменные. Это не означает, что Вам абсолютно не разрешают использовать статические или глобальные переменные. Есть времена, когда Вы фактически хотите, чтобы кое-что затронуло все нити, но вообще Вы должны избежать использовать их, если Вы хотите, чтобы ваш кодекс был сейфом нити.

в случае, где Вы имеете глобальную переменную, которая должна быть глобальной и полученной доступ всеми нитями, быть очень осторожной, когда Вы обновляете это. Если, например, это - увеличивающий прилавок, Вы должны атомарно увеличить это, чтобы избежать условий гонки с другими нитями. Вы делаете это использование mutex (взаимное исключение). Захватите mutex, прочитайте текущую ценность, увеличьте это и напишите это назад и затем отоприте mutex. Любая другая нить, которая хочет изменить ценность, должна сначала проверить mutex и блок, пока это не очищено.

если Вы используете APR , взгляните на apr_atomic_ * функции и apr_thread_mutex_ * функции.

top

errno

это - общая глобальная переменная, которая держит ошибочное число последней ошибки, которая произошла. Если одна нить называет функцию низкого уровня, которая устанавливает errno, и затем другая нить проверяет это, мы отбираем у ошибочных чисел от одной нити в другой. Чтобы решить это, удостоверьтесь, ваш модуль или библиотека определяют _REENTRANT или собран с -D_REENTRANT . это сделает errno в-нить переменной и должно, мы надеемся, быть прозрачным к кодексу. Это делает это, делая кое-что как это:

#define errno (*(__errno_location()))

что означает, что вызов errno будет звонить __errno_location() который обеспечивается libc. Урегулирование _REENTRANT также переопределение сил некоторых других функций к их * _r эквиваленты и иногда изменяют общее getc / putc макроопределение в более безопасные запросы функции. Проверьте вашу libc документацию для специфических особенностей. Вместо, или в дополнение к _REENTRANT символы, которые могут затронуть это, _POSIX_C_SOURCE , _THREAD_SAFE , _SVID_SOURCE , и _BSD_SOURCE .

top

Common standard troublesome functions

мало того, что вещами должен быть сейф нити, но и они также должны быть переучастником. strtok() является очевидным. Вы называете это первым разом с вашим разделителем, который это тогда помнит, и на каждом последующем запросе это возвращает следующий символ. Очевидно, если многократные нити будут называть это, то Вы будете иметь проблему. Большинство систем имеет версию переучастника названной функции strtok_r() где Вы проходите в дополнительном аргументе, который содержит ассигнованный char * который функция будет использовать вместо ее собственного статического хранения чтобы поддержать государство tokenizing. Если Вы используете APR Вы можете использовать apr_strtok() .

crypt() является другой функцией, которая имеет тенденцию не быть переучастником, так, если Вы натыкаетесь на звонки, которые функционируют в библиотеке, напряженно ожидают. На некоторых системах это - переучастник, хотя, таким образом это - не всегда проблема. Если ваша система имеет crypt_r() возможности - Вы, должен использовать это, или если возможно просто избегают целого беспорядка при использовании md5 вместо этого.

top

Common 3rd Party Libraries

следующее - список общих библиотек, которые используются 3-ьими партийными модулями Apacheа. Вы можете проверить, чтобы видеть, использует ли ваш модуль потенциально опасную библиотеку при использовании инструментов, типа ldd(1) и nm(1) . для PHP , например, пробуйте это:

% ldd libphp4.so
libsablot.so.0 => /usr/local/lib/libsablot.so.0 (0x401f6000)
libexpat.so.0 => /usr/lib/libexpat.so.0 (0x402da000)
libsnmp.so.0 => /usr/lib/libsnmp.so.0 (0x402f9000)
libpdf.so.1 => /usr/local/lib/libpdf.so.1 (0x40353000)
libz.so.1 => /usr/lib/libz.so.1 (0x403e2000)
libpng.so.2 => /usr/lib/libpng.so.2 (0x403f0000)
libmysqlclient.so.11 => /usr/lib/libmysqlclient.so.11 (0x40411000)
libming.so => /usr/lib/libming.so (0x40449000)
libm.so.6 => /lib/libm.so.6 (0x40487000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x404a8000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x404e7000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x40505000)
libssl.so.2 => /lib/libssl.so.2 (0x40532000)
libcrypto.so.2 => /lib/libcrypto.so.2 (0x40560000)
libresolv.so.2 => /lib/libresolv.so.2 (0x40624000)
libdl.so.2 => /lib/libdl.so.2 (0x40634000)
libnsl.so.1 => /lib/libnsl.so.1 (0x40637000)
libc.so.6 => /lib/libc.so.6 (0x4064b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

в дополнение к этим библиотекам Вы будете должны взглянуть на любые библиотеки, связанные статически в модуль. Вы можете использовать nm(1) искать индивидуальные символы в модуле.

top

Library List

пожалуйста напишите к dev@httpd.apache.org если Вы имеете дополнения или исправления к этому списку.

библиотека версия Сейф Нити? примечания
ASpell/PSpell ?
Berkeley DB 3.x, 4.x да быть осторожным относительно разделения связи поперек нитей.
bzip2 да и ПЧЕЛА высокого уровня и низкого уровня безопасна нитью. Однако, программный интерфейс приложения высокого уровня требует безопасного нитью доступа к errno.
cdb ?
C-Client возможно c-клиент использует strtok() и gethostbyname() которые не безопасны нитью на большинстве выполнения библиотеки C. статические данные c-клиента предназначаются, чтобы быть разделенными поперек нитей. Если strtok() и gethostbyname() являются безопасными нитью на вашем РТЕ, c-клиенте может быть безопасным нитью.
cpdflib ?
libcrypt ?
Expat да нуждайтесь в отдельном случае анализатора в нить
FreeTDS ?
FreeType ?
GD 1.8.x ?
GD 2.0.x ?
gdbm Нет ошибки возвратились через статическое gdbm_error переменная
ImageMagick 5.2.2 да доктора ImageMagick утверждают, что это - сейф нити начиная с версии 5.2.2 (см. Change log ).
Imlib2 ?
libjpeg v6b ?
libmysqlclient да использовать mysqlclient_r вариант библиотеки, чтобы гарантировать безопасность нити. За дополнительной информацией, пожалуйста читайте http://www.mysql.com/doc/en/Threaded_clients.html .
Ming 0.2a ?
Net-SNMP 5.0.x ?
OpenLDAP 2.1.x да использование ldap_r вариант библиотеки, чтобы гарантировать безопасность нити.
OpenSSL 0.9.6g да требует надлежащего использования CRYPTO_num_locks , CRYPTO_set_locking_callback , CRYPTO_set_id_callback
liboci8 (Oracle 8+) 8.x, 9.x ?
pdflib 5.0.x да доктора PDFLib утверждают, что это - сейф нити; changes.txt указывает, что это было частично безопасно нитью начиная с V1.91: http://www.pdflib.com/products/pdflib/index.html .
libpng 1.0.x ?
libpng 1.2.x ?
libpq (PostgreSQL) 7.x да не разделять связи поперек нитей и не упускать crypt() запросы
Sablotron 0.95 ?
zlib 1.1.4 да полагается на сейф нити zalloc, и Неплатеж функций zfree должен использовать calloc/free libc, которые являются безопасными нитью.