Apache Версия 2.0 Сервера HTTP
используя любой из переплетенных mpms в Apacheе 2.0 важно, что каждая функция звонила от Apacheа быть сейфом нити. Связываясь в 3-ьих партийных расширениях может быть трудно определить, будет ли получающийся сервер сейфом нити. Случайное испытание вообще не будет говорить Вам это любой, поскольку проблемы безопасности нити могут привести к тонкой гонке conditons, который может только обнаружиться в определенных условиях под тяжелым грузом.
при письме вашего модуля или пробуя определять, являются ли модуль или 3-ья партийная библиотека сейф нити, есть некоторые общие вещи, чтобы иметь в виду.
сначала, Вы должны признать, что в переплетенной модели каждая индивидуальная нить имеет ее собственный прилавок программы, стек и регистраторов. Местные переменные, живые на стеке, таким образом те прекрасны. Вы должны не упустить любые статические или глобальные переменные. Это не означает, что Вам абсолютно не разрешают использовать статические или глобальные переменные. Есть времена, когда Вы фактически хотите, чтобы кое-что затронуло все нити, но вообще Вы должны избежать использовать их, если Вы хотите, чтобы ваш кодекс был сейфом нити.
в случае, где Вы имеете глобальную переменную, которая должна быть глобальной и полученной доступ всеми нитями, быть очень осторожной, когда Вы обновляете это. Если, например, это - увеличивающий прилавок, Вы должны атомарно увеличить это, чтобы избежать условий гонки с другими нитями. Вы делаете это использование mutex (взаимное исключение). Захватите mutex, прочитайте текущую ценность, увеличьте это и напишите это назад и затем отоприте mutex. Любая другая нить, которая хочет изменить ценность, должна сначала проверить mutex и блок, пока это не очищено.
если Вы используете
APR
, взгляните на
apr_atomic_
*
функции и
apr_thread_mutex_
*
функции.
это - общая глобальная переменная, которая держит ошибочное число последней ошибки, которая произошла. Если одна нить называет функцию низкого уровня, которая устанавливает 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
.
мало того, что вещами должен быть сейф нити, но и они также должны быть переучастником.
strtok()
является очевидным. Вы называете это первым разом с вашим разделителем, который это тогда помнит, и на каждом последующем запросе это возвращает следующий символ. Очевидно, если многократные нити будут называть это, то Вы будете иметь проблему. Большинство систем имеет версию переучастника названной функции
strtok_r()
где Вы проходите в дополнительном аргументе, который содержит ассигнованный
char *
который функция будет использовать вместо ее собственного статического хранения чтобы поддержать государство tokenizing. Если Вы используете
APR
Вы можете использовать
apr_strtok()
.
crypt()
является другой функцией, которая имеет тенденцию не быть переучастником, так, если Вы натыкаетесь на звонки, которые функционируют в библиотеке, напряженно ожидают. На некоторых системах это - переучастник, хотя, таким образом это - не всегда проблема. Если ваша система имеет
crypt_r()
возможности - Вы, должен использовать это, или если возможно просто избегают целого беспорядка при использовании md5 вместо этого.
следующее - список общих библиотек, которые используются 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)
искать индивидуальные символы в модуле.
пожалуйста напишите к 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, которые являются безопасными нитью. |