# ./pullrev.sh 1891269 1891198 1891196 http://svn.apache.org/viewvc?view=revision&revision=1891269 http://svn.apache.org/viewvc?view=revision&revision=1891198 http://svn.apache.org/viewvc?view=revision&revision=1891196 --- apr-1.7.0/include/arch/unix/apr_arch_thread_mutex.h +++ apr-1.7.0/include/arch/unix/apr_arch_thread_mutex.h @@ -33,8 +33,10 @@ struct apr_thread_mutex_t { apr_pool_t *pool; pthread_mutex_t mutex; +#ifndef HAVE_PTHREAD_MUTEX_TIMEDLOCK apr_thread_cond_t *cond; int locked, num_waiters; +#endif }; #endif --- apr-1.7.0/locks/unix/thread_mutex.c +++ apr-1.7.0/locks/unix/thread_mutex.c @@ -102,6 +102,7 @@ { apr_status_t rv; +#ifndef HAVE_PTHREAD_MUTEX_TIMEDLOCK if (mutex->cond) { apr_status_t rv2; @@ -133,6 +134,7 @@ return rv; } +#endif rv = pthread_mutex_lock(&mutex->mutex); #ifdef HAVE_ZOS_PTHREADS @@ -148,6 +150,7 @@ { apr_status_t rv; +#ifndef HAVE_PTHREAD_MUTEX_TIMEDLOCK if (mutex->cond) { apr_status_t rv2; @@ -177,6 +180,7 @@ return rv; } +#endif rv = pthread_mutex_trylock(&mutex->mutex); if (rv) { @@ -281,6 +285,7 @@ { apr_status_t status; +#ifndef HAVE_PTHREAD_MUTEX_TIMEDLOCK if (mutex->cond) { status = pthread_mutex_lock(&mutex->mutex); if (status) { @@ -303,6 +308,7 @@ mutex->locked = 0; } +#endif status = pthread_mutex_unlock(&mutex->mutex); #ifdef HAVE_ZOS_PTHREADS @@ -318,9 +324,12 @@ { apr_status_t rv, rv2 = APR_SUCCESS; +#ifndef HAVE_PTHREAD_MUTEX_TIMEDLOCK if (mutex->cond) { rv2 = apr_thread_cond_destroy(mutex->cond); } +#endif + rv = apr_pool_cleanup_run(mutex->pool, mutex, thread_mutex_cleanup); if (rv == APR_SUCCESS) { rv = rv2; --- apr-1.7.0/random/unix/sha2.c +++ apr-1.7.0/random/unix/sha2.c @@ -425,7 +425,7 @@ usedspace = freespace = 0; } -void apr__SHA256_Final(sha2_byte digest[], SHA256_CTX* context) { +void apr__SHA256_Final(sha2_byte digest[SHA256_DIGEST_LENGTH], SHA256_CTX* context) { sha2_word32 *d = (sha2_word32*)digest; unsigned int usedspace; @@ -496,7 +496,7 @@ usedspace = 0; } -char *apr__SHA256_End(SHA256_CTX* context, char buffer[]) { +char *apr__SHA256_End(SHA256_CTX* context, char buffer[SHA256_DIGEST_STRING_LENGTH]) { sha2_byte digest[SHA256_DIGEST_LENGTH], *d = digest; int i; --- apr-1.7.0/time/unix/time.c +++ apr-1.7.0/time/unix/time.c @@ -142,6 +142,9 @@ static const int dayoffset[12] = {306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275}; + if (xt->tm_mon < 0 || xt->tm_mon >= 12) + return APR_EBADDATE; + /* shift new year to 1st March in order to make leap year calc easy */ if (xt->tm_mon < 2) --- apr-1.7.0/time/win32/time.c +++ apr-1.7.0/time/win32/time.c @@ -54,6 +54,9 @@ static const int dayoffset[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; + if (tm->wMonth < 1 || tm->wMonth > 12) + return APR_EBADDATE; + /* Note; the caller is responsible for filling in detailed tm_usec, * tm_gmtoff and tm_isdst data when applicable. */ @@ -228,6 +231,9 @@ static const int dayoffset[12] = {306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275}; + if (xt->tm_mon < 0 || xt->tm_mon >= 12) + return APR_EBADDATE; + /* shift new year to 1st March in order to make leap year calc easy */ if (xt->tm_mon < 2) --- apr-1.7.0/file_io/unix/readwrite.c +++ apr-1.7.0/file_io/unix/readwrite.c @@ -146,7 +146,7 @@ APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf, apr_size_t *nbytes) { - apr_size_t rv; + apr_size_t rv = APR_SUCCESS; if (thefile->buffered) { char *pos = (char *)buf; @@ -160,13 +160,14 @@ * logically reading from */ apr_int64_t offset = thefile->filePtr - thefile->dataRead + thefile->bufpos; - if (offset != thefile->filePtr) - lseek(thefile->filedes, offset, SEEK_SET); + if (offset != thefile->filePtr) { + thefile->filePtr = lseek(thefile->filedes, offset, SEEK_SET); + if (thefile->filePtr == -1) rv = errno; + } thefile->bufpos = thefile->dataRead = 0; thefile->direction = 1; } - rv = 0; while (rv == 0 && size > 0) { if (thefile->bufpos == thefile->bufsize) /* write buffer is full*/ rv = apr_file_flush_locked(thefile); @@ -244,12 +245,15 @@ */ apr_int64_t offset = thefile->filePtr - thefile->dataRead + thefile->bufpos; - if (offset != thefile->filePtr) - lseek(thefile->filedes, offset, SEEK_SET); + if (offset != thefile->filePtr) { + thefile->filePtr = lseek(thefile->filedes, offset, SEEK_SET); + if (thefile->filePtr == -1) rv = errno; + } thefile->bufpos = thefile->dataRead = 0; } file_unlock(thefile); + if (rv) return rv; } if ((bytes = writev(thefile->filedes, vec, nvec)) < 0) { --- apr-1.7.0/locks/unix/proc_mutex.c +++ apr-1.7.0/locks/unix/proc_mutex.c @@ -1518,11 +1518,10 @@ APR_DECLARE(const char *) apr_proc_mutex_defname(void) { - apr_status_t rv; apr_proc_mutex_t mutex; - if ((rv = proc_mutex_choose_method(&mutex, APR_LOCK_DEFAULT, - NULL)) != APR_SUCCESS) { + if (proc_mutex_choose_method(&mutex, APR_LOCK_DEFAULT, + NULL) != APR_SUCCESS) { return "unknown"; } --- apr-1.7.0/memory/unix/apr_pools.c +++ apr-1.7.0/memory/unix/apr_pools.c @@ -1338,7 +1338,7 @@ apr_size_t free_index; pool_concurrency_set_used(pool); - ps.node = active = pool->active; + ps.node = pool->active; ps.pool = pool; ps.vbuff.curpos = ps.node->first_avail; --- apr-1.7.0/test/teststr.c +++ apr-1.7.0/test/teststr.c @@ -394,6 +394,19 @@ ABTS_STR_EQUAL(tc, apr_cstr_skip_prefix("", "12"), NULL); } +static void pstrcat(abts_case *tc, void *data) +{ + ABTS_STR_EQUAL(tc, apr_pstrcat(p, "a", "bc", "def", NULL), + "abcdef"); + ABTS_STR_EQUAL(tc, apr_pstrcat(p, NULL), ""); + ABTS_STR_EQUAL(tc, apr_pstrcat(p, + "a", "b", "c", "d", "e", + "f", "g", "h", "i", "j", + "1", "2", "3", "4", "5", + NULL), + "abcdefghij12345"); +} + abts_suite *teststr(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -412,6 +425,7 @@ abts_run_test(suite, string_cpystrn, NULL); abts_run_test(suite, snprintf_overflow, NULL); abts_run_test(suite, skip_prefix, NULL); + abts_run_test(suite, pstrcat, NULL); return suite; }