From 0dad0ee03bd568f64bc79460384d0f56d3b0afdeeffe025b969eb30ed92bae79 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Mon, 10 Dec 2012 13:11:27 +0000 Subject: [PATCH 1/5] - Extend i486 pthread_cond_timedwait to use futex syscall with absolute timeout - Properly check for short writes when sending the response in nscd OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=246 --- glibc.changes | 7 + glibc.spec | 6 + nscd-short-write.patch | 178 ++++++++++ pthread-cond-timedwait-i486.patch | 526 ++++++++++++++++++++++++++++++ 4 files changed, 717 insertions(+) create mode 100644 nscd-short-write.patch create mode 100644 pthread-cond-timedwait-i486.patch diff --git a/glibc.changes b/glibc.changes index 62c338c..56f230e 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Mon Dec 10 13:08:01 UTC 2012 - schwab@suse.de + +- Extend i486 pthread_cond_timedwait to use futex syscall with absolute + timeout +- Properly check for short writes when sending the response in nscd + ------------------------------------------------------------------- Sat Dec 8 18:55:53 UTC 2012 - aj@suse.de diff --git a/glibc.spec b/glibc.spec index 27ea49a..1737da6 100644 --- a/glibc.spec +++ b/glibc.spec @@ -240,6 +240,10 @@ Patch306: glibc-fix-double-loopback.diff ### # PATCH-FIX-OPENSUSE Fix LD_PROFILE (glibc bug#13818) - aj@suse.de Patch2008: glibc-ld-profile.patch +# PATCH-FIX-OPENSUSE Extend i486 pthread_cond_timedwait to use futex syscall with absolute timeout +Patch2009: pthread-cond-timedwait-i486.patch +# PATCH-FIX-OPENSUSE Properly check for short writes when sending the response in nscd +Patch2010: nscd-short-write.patch %description The GNU C Library provides the most important standard libraries used @@ -463,6 +467,8 @@ rm nscd/s-stamp # XXX Disable, it breaks the testsuite, test elf/tst-audit2 # %patch2008 -p1 +%patch2009 -p1 +%patch2010 -p1 # # Inconsistency detected by ld.so: dl-close.c: 719: _dl_close: Assertion `map->l_init_called' failed! diff --git a/nscd-short-write.patch b/nscd-short-write.patch new file mode 100644 index 0000000..6734e4a --- /dev/null +++ b/nscd-short-write.patch @@ -0,0 +1,178 @@ +From 5a7b70c87c5ba03a122db0372e87ecb550ee4b38 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Tue, 4 Dec 2012 16:14:13 +0100 +Subject: [PATCH] Properly check for short writes when sending the response in + nscd + + * nscd/grpcache.c (cache_addgr): Properly check for short write. + * nscd/initgrcache.c (addinitgroupsX): Likewise. + * nscd/pwdcache.c (cache_addpw): Likewise. + * nscd/servicescache.c (cache_addserv): Likewise. Don't write + more than recsize. +--- + nscd/grpcache.c | 6 +++++- + nscd/initgrcache.c | 7 ++++++- + nscd/pwdcache.c | 8 ++++++-- + nscd/servicescache.c | 12 ++++++++---- + 4 files changed, 25 insertions(+), 8 deletions(-) + +diff --git a/nscd/grpcache.c b/nscd/grpcache.c +index f0dad4d..696162f 100644 +--- a/nscd/grpcache.c ++++ b/nscd/grpcache.c +@@ -75,6 +75,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req, + const void *key, struct group *grp, uid_t owner, + struct hashentry *const he, struct datahead *dh, int errval) + { ++ bool all_written = true; + ssize_t total; + ssize_t written; + time_t t = time (NULL); +@@ -342,6 +343,9 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req, + # endif + #endif + written = writeall (fd, &dataset->resp, dataset->head.recsize); ++ ++ if (written != dataset->head.recsize) ++ all_written = false; + } + + /* Add the record to the database. But only if it has not been +@@ -401,7 +405,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req, + } + } + +- if (__builtin_expect (written != total, 0) && debug_level > 0) ++ if (__builtin_expect (!all_written, 0) && debug_level > 0) + { + char buf[256]; + dbg_log (_("short write in %s: %s"), __FUNCTION__, +diff --git a/nscd/initgrcache.c b/nscd/initgrcache.c +index 255b121..13ee86e 100644 +--- a/nscd/initgrcache.c ++++ b/nscd/initgrcache.c +@@ -171,10 +171,12 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req, + nip = nip->next; + } + ++ bool all_written; + ssize_t total; + ssize_t written; + time_t timeout; + out: ++ all_written = true; + timeout = MAX_TIMEOUT_VALUE; + if (!any_success) + { +@@ -379,6 +381,9 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req, + # endif + #endif + written = writeall (fd, &dataset->resp, dataset->head.recsize); ++ ++ if (written != dataset->head.recsize) ++ all_written = false; + } + + +@@ -405,7 +410,7 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req, + + free (groups); + +- if (__builtin_expect (written != total, 0) && debug_level > 0) ++ if (__builtin_expect (!all_written, 0) && debug_level > 0) + { + char buf[256]; + dbg_log (_("short write in %s: %s"), __FUNCTION__, +diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c +index a8ea407..d6b91ef 100644 +--- a/nscd/pwdcache.c ++++ b/nscd/pwdcache.c +@@ -81,6 +81,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req, + const void *key, struct passwd *pwd, uid_t owner, + struct hashentry *const he, struct datahead *dh, int errval) + { ++ bool all_written = true; + ssize_t total; + ssize_t written; + time_t t = time (NULL); +@@ -306,7 +307,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req, + + db->head->data_size)); + written = sendfileall (fd, db->wr_fd, + (char *) &dataset->resp +- - (char *) db->head, dataset->head.recsize ); ++ - (char *) db->head, dataset->head.recsize); + # ifndef __ASSUME_SENDFILE + if (written == -1 && errno == ENOSYS) + goto use_write; +@@ -318,6 +319,9 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req, + # endif + #endif + written = writeall (fd, &dataset->resp, dataset->head.recsize); ++ ++ if (written != dataset->head.recsize) ++ all_written = false; + } + + +@@ -377,7 +381,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req, + } + } + +- if (__builtin_expect (written != total, 0) && debug_level > 0) ++ if (__builtin_expect (!all_written, 0) && debug_level > 0) + { + char buf[256]; + dbg_log (_("short write in %s: %s"), __FUNCTION__, +diff --git a/nscd/servicescache.c b/nscd/servicescache.c +index 0e7520d..917daa4 100644 +--- a/nscd/servicescache.c ++++ b/nscd/servicescache.c +@@ -65,6 +65,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, + const void *key, struct servent *serv, uid_t owner, + struct hashentry *const he, struct datahead *dh, int errval) + { ++ bool all_written = true; + ssize_t total; + ssize_t written; + time_t t = time (NULL); +@@ -290,14 +291,14 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, + { + assert (db->wr_fd != -1); + assert ((char *) &dataset->resp > (char *) db->data); +- assert ((char *) &dataset->resp - (char *) db->head ++ assert ((char *) dataset - (char *) db->head + + total + <= (sizeof (struct database_pers_head) + + db->head->module * sizeof (ref_t) + + db->head->data_size)); + written = sendfileall (fd, db->wr_fd, + (char *) &dataset->resp +- - (char *) db->head, total); ++ - (char *) db->head, dataset->head.recsize); + # ifndef __ASSUME_SENDFILE + if (written == -1 && errno == ENOSYS) + goto use_write; +@@ -308,7 +309,10 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, + use_write: + # endif + #endif +- written = writeall (fd, &dataset->resp, total); ++ written = writeall (fd, &dataset->resp, dataset->head.recsize); ++ ++ if (written != dataset->head.recsize) ++ all_written = false; + } + + /* Add the record to the database. But only if it has not been +@@ -332,7 +336,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, + } + } + +- if (__builtin_expect (written != total, 0) && debug_level > 0) ++ if (__builtin_expect (!all_written, 0) && debug_level > 0) + { + char buf[256]; + dbg_log (_("short write in %s: %s"), __FUNCTION__, +-- +1.8.0.1 + diff --git a/pthread-cond-timedwait-i486.patch b/pthread-cond-timedwait-i486.patch new file mode 100644 index 0000000..1295d93 --- /dev/null +++ b/pthread-cond-timedwait-i486.patch @@ -0,0 +1,526 @@ +From b8a72d0c4ca74e52ea06fa4e56489499489ec158 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Thu, 22 Nov 2012 12:57:37 +0100 +Subject: [PATCH] Extend i486 pthread_cond_timedwait to use futex syscall with + absolute timeout + + * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S + (__pthread_cond_timedwait): If possible use FUTEX_WAIT_BITSET to + directly use absolute timeout. +--- + .../sysv/linux/i386/i486/pthread_cond_timedwait.S | 381 +++++++++++++++++---- + 1 file changed, 315 insertions(+), 66 deletions(-) + +diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S +index 6011f69..b9dbe6b 100644 +--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S ++++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S +@@ -66,6 +66,34 @@ __pthread_cond_timedwait: + movl $EINVAL, %eax + jae 18f + ++ /* Stack frame: ++ ++ esp + 32 ++ +--------------------------+ ++ esp + 24 | timeout value | ++ +--------------------------+ ++ esp + 20 | futex pointer | ++ +--------------------------+ ++ esp + 16 | pi-requeued flag | ++ +--------------------------+ ++ esp + 12 | old broadcast_seq value | ++ +--------------------------+ ++ esp + 4 | old wake_seq value | ++ +--------------------------+ ++ esp + 0 | old cancellation mode | ++ +--------------------------+ ++ */ ++ ++#ifndef __ASSUME_FUTEX_CLOCK_REALTIME ++# ifdef PIC ++ LOAD_PIC_REG (cx) ++ cmpl $0, __have_futex_clock_realtime@GOTOFF(%ecx) ++# else ++ cmpl $0, __have_futex_clock_realtime ++# endif ++ je .Lreltmo ++#endif ++ + /* Get internal lock. */ + movl $1, %edx + xorl %eax, %eax +@@ -96,7 +124,11 @@ __pthread_cond_timedwait: + addl $1, cond_futex(%ebx) + addl $(1 << nwaiters_shift), cond_nwaiters(%ebx) + +-#define FRAME_SIZE 32 ++#ifdef __ASSUME_FUTEX_CLOCK_REALTIME ++# define FRAME_SIZE 24 ++#else ++# define FRAME_SIZE 32 ++#endif + subl $FRAME_SIZE, %esp + cfi_adjust_cfa_offset(FRAME_SIZE) + cfi_remember_state +@@ -105,60 +137,19 @@ __pthread_cond_timedwait: + movl wakeup_seq(%ebx), %edi + movl wakeup_seq+4(%ebx), %edx + movl broadcast_seq(%ebx), %eax +- movl %edi, 12(%esp) +- movl %edx, 16(%esp) +- movl %eax, 20(%esp) ++ movl %edi, 4(%esp) ++ movl %edx, 8(%esp) ++ movl %eax, 12(%esp) + + /* Reset the pi-requeued flag. */ +-8: movl $0, 24(%esp) +- /* Get the current time. */ +- movl %ebx, %edx +-#ifdef __NR_clock_gettime +- /* Get the clock number. */ +- movl cond_nwaiters(%ebx), %ebx +- andl $((1 << nwaiters_shift) - 1), %ebx +- /* Only clocks 0 and 1 are allowed so far. Both are handled in the +- kernel. */ +- leal 4(%esp), %ecx +- movl $__NR_clock_gettime, %eax +- ENTER_KERNEL +- movl %edx, %ebx +- +- /* Compute relative timeout. */ +- movl (%ebp), %ecx +- movl 4(%ebp), %edx +- subl 4(%esp), %ecx +- subl 8(%esp), %edx +-#else +- /* Get the current time. */ +- leal 4(%esp), %ebx +- xorl %ecx, %ecx +- movl $__NR_gettimeofday, %eax +- ENTER_KERNEL +- movl %edx, %ebx ++ movl $0, 16(%esp) + +- /* Compute relative timeout. */ +- movl 8(%esp), %eax +- movl $1000, %edx +- mul %edx /* Milli seconds to nano seconds. */ +- movl (%ebp), %ecx +- movl 4(%ebp), %edx +- subl 4(%esp), %ecx +- subl %eax, %edx +-#endif +- jns 12f +- addl $1000000000, %edx +- subl $1, %ecx +-12: testl %ecx, %ecx ++ cmpl $0, (%ebp) + movl $-ETIMEDOUT, %esi + js 6f + +- /* Store relative timeout. */ +-21: movl %ecx, 4(%esp) +- movl %edx, 8(%esp) +- +- movl cond_futex(%ebx), %edi +- movl %edi, 28(%esp) ++8: movl cond_futex(%ebx), %edi ++ movl %edi, 20(%esp) + + /* Unlock. */ + LOCK +@@ -173,6 +164,7 @@ __pthread_cond_timedwait: + 4: call __pthread_enable_asynccancel + movl %eax, (%esp) + ++ leal (%ebp), %esi + #if FUTEX_PRIVATE_FLAG > 255 + xorl %ecx, %ecx + #endif +@@ -196,9 +188,7 @@ __pthread_cond_timedwait: + jne 42f + orl $FUTEX_CLOCK_REALTIME, %ecx + +- /* Requeue-PI uses absolute timeout */ +-42: leal (%ebp), %esi +- movl 28(%esp), %edx ++42: movl 20(%esp), %edx + addl $cond_futex, %ebx + .Ladd_cond_futex_pi: + movl $SYS_futex, %eax +@@ -209,12 +199,12 @@ __pthread_cond_timedwait: + /* Set the pi-requeued flag only if the kernel has returned 0. The + kernel does not hold the mutex on ETIMEDOUT or any other error. */ + cmpl $0, %eax +- sete 24(%esp) ++ sete 16(%esp) + je 41f + + /* When a futex syscall with FUTEX_WAIT_REQUEUE_PI returns + successfully, it has already locked the mutex for us and the +- pi_flag (24(%esp)) is set to denote that fact. However, if another ++ pi_flag (16(%esp)) is set to denote that fact. However, if another + thread changed the futex value before we entered the wait, the + syscall may return an EAGAIN and the mutex is not locked. We go + ahead with a success anyway since later we look at the pi_flag to +@@ -234,22 +224,28 @@ __pthread_cond_timedwait: + xorl %ecx, %ecx + + 40: subl $1, %ecx ++ movl $0, 16(%esp) + #ifdef __ASSUME_PRIVATE_FUTEX + andl $FUTEX_PRIVATE_FLAG, %ecx + #else + andl %gs:PRIVATE_FUTEX, %ecx + #endif +-#if FUTEX_WAIT != 0 +- addl $FUTEX_WAIT, %ecx +-#endif +- leal 4(%esp), %esi +- movl 28(%esp), %edx ++ addl $FUTEX_WAIT_BITSET, %ecx ++ /* The following only works like this because we only support ++ two clocks, represented using a single bit. */ ++ testl $1, cond_nwaiters(%ebx) ++ jne 30f ++ orl $FUTEX_CLOCK_REALTIME, %ecx ++30: ++ movl 20(%esp), %edx ++ movl $0xffffffff, %ebp + addl $cond_futex, %ebx + .Ladd_cond_futex: + movl $SYS_futex, %eax + ENTER_KERNEL + subl $cond_futex, %ebx + .Lsub_cond_futex: ++ movl 28+FRAME_SIZE(%esp), %ebp + movl %eax, %esi + + 41: movl (%esp), %eax +@@ -268,7 +264,7 @@ __pthread_cond_timedwait: + jnz 5f + + 6: movl broadcast_seq(%ebx), %eax +- cmpl 20(%esp), %eax ++ cmpl 12(%esp), %eax + jne 23f + + movl woken_seq(%ebx), %eax +@@ -277,9 +273,9 @@ __pthread_cond_timedwait: + movl wakeup_seq(%ebx), %edi + movl wakeup_seq+4(%ebx), %edx + +- cmpl 16(%esp), %edx ++ cmpl 8(%esp), %edx + jne 7f +- cmpl 12(%esp), %edi ++ cmpl 4(%esp), %edi + je 15f + + 7: cmpl %ecx, %edx +@@ -292,7 +288,7 @@ __pthread_cond_timedwait: + + /* We need to go back to futex_wait. If we're using requeue_pi, then + release the mutex we had acquired and go back. */ +- movl 24(%esp), %edx ++ movl 16(%esp), %edx + test %edx, %edx + jz 8b + +@@ -357,13 +353,13 @@ __pthread_cond_timedwait: + + 11: movl 24+FRAME_SIZE(%esp), %eax + /* With requeue_pi, the mutex lock is held in the kernel. */ +- movl 24(%esp), %ecx ++ movl 16(%esp), %ecx + testl %ecx, %ecx + jnz 27f + + call __pthread_mutex_cond_lock + 26: addl $FRAME_SIZE, %esp +- cfi_adjust_cfa_offset(-FRAME_SIZE); ++ cfi_adjust_cfa_offset(-FRAME_SIZE) + + /* We return the result of the mutex_lock operation if it failed. */ + testl %eax, %eax +@@ -509,6 +505,245 @@ __pthread_cond_timedwait: + #endif + call __lll_unlock_wake + jmp 11b ++ cfi_adjust_cfa_offset(-FRAME_SIZE) ++ ++#ifndef __ASSUME_FUTEX_CLOCK_REALTIME ++.Lreltmo: ++ /* Get internal lock. */ ++ movl $1, %edx ++ xorl %eax, %eax ++ LOCK ++# if cond_lock == 0 ++ cmpxchgl %edx, (%ebx) ++# else ++ cmpxchgl %edx, cond_lock(%ebx) ++# endif ++ jnz 101f ++ ++ /* Store the reference to the mutex. If there is already a ++ different value in there this is a bad user bug. */ ++102: cmpl $-1, dep_mutex(%ebx) ++ movl 24(%esp), %eax ++ je 117f ++ movl %eax, dep_mutex(%ebx) ++ ++ /* Unlock the mutex. */ ++117: xorl %edx, %edx ++ call __pthread_mutex_unlock_usercnt ++ ++ testl %eax, %eax ++ jne 16b ++ ++ addl $1, total_seq(%ebx) ++ adcl $0, total_seq+4(%ebx) ++ addl $1, cond_futex(%ebx) ++ addl $(1 << nwaiters_shift), cond_nwaiters(%ebx) ++ ++ subl $FRAME_SIZE, %esp ++ cfi_adjust_cfa_offset(FRAME_SIZE) ++ ++ /* Get and store current wakeup_seq value. */ ++ movl wakeup_seq(%ebx), %edi ++ movl wakeup_seq+4(%ebx), %edx ++ movl broadcast_seq(%ebx), %eax ++ movl %edi, 4(%esp) ++ movl %edx, 8(%esp) ++ movl %eax, 12(%esp) ++ ++ /* Reset the pi-requeued flag. */ ++ movl $0, 16(%esp) ++ ++ /* Get the current time. */ ++108: movl %ebx, %edx ++# ifdef __NR_clock_gettime ++ /* Get the clock number. */ ++ movl cond_nwaiters(%ebx), %ebx ++ andl $((1 << nwaiters_shift) - 1), %ebx ++ /* Only clocks 0 and 1 are allowed so far. Both are handled in the ++ kernel. */ ++ leal 24(%esp), %ecx ++ movl $__NR_clock_gettime, %eax ++ ENTER_KERNEL ++ movl %edx, %ebx ++ ++ /* Compute relative timeout. */ ++ movl (%ebp), %ecx ++ movl 4(%ebp), %edx ++ subl 24(%esp), %ecx ++ subl 28(%esp), %edx ++# else ++ /* Get the current time. */ ++ leal 24(%esp), %ebx ++ xorl %ecx, %ecx ++ movl $__NR_gettimeofday, %eax ++ ENTER_KERNEL ++ movl %edx, %ebx ++ ++ /* Compute relative timeout. */ ++ movl 28(%esp), %eax ++ movl $1000, %edx ++ mul %edx /* Milli seconds to nano seconds. */ ++ movl (%ebp), %ecx ++ movl 4(%ebp), %edx ++ subl 24(%esp), %ecx ++ subl %eax, %edx ++# endif ++ jns 112f ++ addl $1000000000, %edx ++ subl $1, %ecx ++112: testl %ecx, %ecx ++ movl $-ETIMEDOUT, %esi ++ js 106f ++ ++ /* Store relative timeout. */ ++121: movl %ecx, 24(%esp) ++ movl %edx, 28(%esp) ++ ++ movl cond_futex(%ebx), %edi ++ movl %edi, 20(%esp) ++ ++ /* Unlock. */ ++ LOCK ++# if cond_lock == 0 ++ subl $1, (%ebx) ++# else ++ subl $1, cond_lock(%ebx) ++# endif ++ jne 103f ++ ++.LcleanupSTART2: ++104: call __pthread_enable_asynccancel ++ movl %eax, (%esp) ++ ++ leal 24(%esp), %esi ++# if FUTEX_PRIVATE_FLAG > 255 ++ xorl %ecx, %ecx ++# endif ++ cmpl $-1, dep_mutex(%ebx) ++ sete %cl ++ subl $1, %ecx ++# ifdef __ASSUME_PRIVATE_FUTEX ++ andl $FUTEX_PRIVATE_FLAG, %ecx ++# else ++ andl %gs:PRIVATE_FUTEX, %ecx ++# endif ++# if FUTEX_WAIT != 0 ++ addl $FUTEX_WAIT, %ecx ++# endif ++ movl 20(%esp), %edx ++ addl $cond_futex, %ebx ++.Ladd_cond_futex2: ++ movl $SYS_futex, %eax ++ ENTER_KERNEL ++ subl $cond_futex, %ebx ++.Lsub_cond_futex2: ++ movl %eax, %esi ++ ++141: movl (%esp), %eax ++ call __pthread_disable_asynccancel ++.LcleanupEND2: ++ ++ ++ /* Lock. */ ++ movl $1, %edx ++ xorl %eax, %eax ++ LOCK ++# if cond_lock == 0 ++ cmpxchgl %edx, (%ebx) ++# else ++ cmpxchgl %edx, cond_lock(%ebx) ++# endif ++ jnz 105f ++ ++106: movl broadcast_seq(%ebx), %eax ++ cmpl 12(%esp), %eax ++ jne 23b ++ ++ movl woken_seq(%ebx), %eax ++ movl woken_seq+4(%ebx), %ecx ++ ++ movl wakeup_seq(%ebx), %edi ++ movl wakeup_seq+4(%ebx), %edx ++ ++ cmpl 8(%esp), %edx ++ jne 107f ++ cmpl 4(%esp), %edi ++ je 115f ++ ++107: cmpl %ecx, %edx ++ jne 9b ++ cmp %eax, %edi ++ jne 9b ++ ++115: cmpl $-ETIMEDOUT, %esi ++ je 28b ++ ++ jmp 8b ++ ++ cfi_adjust_cfa_offset(-FRAME_SIZE) ++ /* Initial locking failed. */ ++101: ++# if cond_lock == 0 ++ movl %ebx, %edx ++# else ++ leal cond_lock(%ebx), %edx ++# endif ++# if (LLL_SHARED-LLL_PRIVATE) > 255 ++ xorl %ecx, %ecx ++# endif ++ cmpl $-1, dep_mutex(%ebx) ++ setne %cl ++ subl $1, %ecx ++ andl $(LLL_SHARED-LLL_PRIVATE), %ecx ++# if LLL_PRIVATE != 0 ++ addl $LLL_PRIVATE, %ecx ++# endif ++ call __lll_lock_wait ++ jmp 102b ++ ++ cfi_adjust_cfa_offset(FRAME_SIZE) ++ ++ /* Unlock in loop requires wakeup. */ ++103: ++# if cond_lock == 0 ++ movl %ebx, %eax ++# else ++ leal cond_lock(%ebx), %eax ++# endif ++# if (LLL_SHARED-LLL_PRIVATE) > 255 ++ xorl %ecx, %ecx ++# endif ++ cmpl $-1, dep_mutex(%ebx) ++ setne %cl ++ subl $1, %ecx ++ andl $(LLL_SHARED-LLL_PRIVATE), %ecx ++# if LLL_PRIVATE != 0 ++ addl $LLL_PRIVATE, %ecx ++# endif ++ call __lll_unlock_wake ++ jmp 104b ++ ++ /* Locking in loop failed. */ ++105: ++# if cond_lock == 0 ++ movl %ebx, %edx ++# else ++ leal cond_lock(%ebx), %edx ++# endif ++# if (LLL_SHARED-LLL_PRIVATE) > 255 ++ xorl %ecx, %ecx ++# endif ++ cmpl $-1, dep_mutex(%ebx) ++ setne %cl ++ subl $1, %ecx ++ andl $(LLL_SHARED-LLL_PRIVATE), %ecx ++# if LLL_PRIVATE != 0 ++ addl $LLL_PRIVATE, %ecx ++# endif ++ call __lll_lock_wait ++ jmp 106b ++ cfi_adjust_cfa_offset(-FRAME_SIZE) ++#endif + + .size __pthread_cond_timedwait, .-__pthread_cond_timedwait + versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait, +@@ -552,7 +787,7 @@ __condvar_tw_cleanup: + call __lll_lock_wait + + 1: movl broadcast_seq(%ebx), %eax +- cmpl 20(%esp), %eax ++ cmpl 12(%esp), %eax + jne 3f + + /* We increment the wakeup_seq counter only if it is lower than +@@ -706,6 +941,20 @@ __condvar_tw_cleanup: + .long .LcleanupEND-.Lsub_cond_futex + .long __condvar_tw_cleanup-.LSTARTCODE + .uleb128 0 ++#ifndef __ASSUME_FUTEX_CLOCK_REALTIME ++ .long .LcleanupSTART2-.LSTARTCODE ++ .long .Ladd_cond_futex2-.LcleanupSTART2 ++ .long __condvar_tw_cleanup-.LSTARTCODE ++ .uleb128 0 ++ .long .Ladd_cond_futex2-.LSTARTCODE ++ .long .Lsub_cond_futex2-.Ladd_cond_futex2 ++ .long __condvar_tw_cleanup2-.LSTARTCODE ++ .uleb128 0 ++ .long .Lsub_cond_futex2-.LSTARTCODE ++ .long .LcleanupEND2-.Lsub_cond_futex2 ++ .long __condvar_tw_cleanup-.LSTARTCODE ++ .uleb128 0 ++#endif + .long .LcallUR-.LSTARTCODE + .long .LENDCODE-.LcallUR + .long 0 +-- +1.8.0.1 + From c8c0e4d40911472619c622abc85443549349e272be9b863faf429a88692c6b53 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Mon, 10 Dec 2012 14:20:57 +0000 Subject: [PATCH 2/5] - pthread-cond-timedwait-i486.patch: Extend i486 pthread_cond_timedwait to use futex syscall with absolute - nscd-short-write.patch: Properly check for short writes when sending the response in nscd OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=247 --- glibc.changes | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/glibc.changes b/glibc.changes index 56f230e..454f007 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,9 +1,11 @@ ------------------------------------------------------------------- Mon Dec 10 13:08:01 UTC 2012 - schwab@suse.de -- Extend i486 pthread_cond_timedwait to use futex syscall with absolute +- pthread-cond-timedwait-i486.patch: + Extend i486 pthread_cond_timedwait to use futex syscall with absolute timeout -- Properly check for short writes when sending the response in nscd +- nscd-short-write.patch: + Properly check for short writes when sending the response in nscd ------------------------------------------------------------------- Sat Dec 8 18:55:53 UTC 2012 - aj@suse.de From 314b3d4c178648a3dad141b4e35638d150dccdd39d20a7a2fffcd2582c443cab Mon Sep 17 00:00:00 2001 From: OBS User buildservice-autocommit Date: Mon, 10 Dec 2012 16:16:01 +0000 Subject: [PATCH 3/5] Updating link to change in openSUSE:Factory/glibc revision 130.0 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=a60263f202f365d2f9531bbf6776d8df --- glibc.changes | 8 -------- 1 file changed, 8 deletions(-) diff --git a/glibc.changes b/glibc.changes index 454f007..aeab8e5 100644 --- a/glibc.changes +++ b/glibc.changes @@ -4084,14 +4084,6 @@ Sat Sep 13 07:01:40 CEST 2003 - kukuk@suse.de ------------------------------------------------------------------- Thu Sep 11 16:59:49 CEST 2003 - kukuk@suse.de -- Update to current CVS -- Remove patches which are merged in CVS -- Update to nptl-0.58 -- Remove _POSIX_VERSION hack - -------------------------------------------------------------------- -Thu Sep 11 16:59:49 CEST 2003 - kukuk@suse.de - - version.h: Fix comment how to compile kernel modules ------------------------------------------------------------------- From 6849b2d07df063818072d11b6410781657f5a2e008e885231901e91ef8ff1ec8 Mon Sep 17 00:00:00 2001 From: OBS User buildservice-autocommit Date: Mon, 10 Dec 2012 16:16:02 +0000 Subject: [PATCH 4/5] Accepting request 144728 from Base:System baserev update by copy to link target OBS-URL: https://build.opensuse.org/request/show/144728 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=248 --- glibc.changes | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/glibc.changes b/glibc.changes index aeab8e5..454f007 100644 --- a/glibc.changes +++ b/glibc.changes @@ -4084,6 +4084,14 @@ Sat Sep 13 07:01:40 CEST 2003 - kukuk@suse.de ------------------------------------------------------------------- Thu Sep 11 16:59:49 CEST 2003 - kukuk@suse.de +- Update to current CVS +- Remove patches which are merged in CVS +- Update to nptl-0.58 +- Remove _POSIX_VERSION hack + +------------------------------------------------------------------- +Thu Sep 11 16:59:49 CEST 2003 - kukuk@suse.de + - version.h: Fix comment how to compile kernel modules ------------------------------------------------------------------- From 640ba0ecad41dc735160c07b8fd4bba52f95e014871c2ded6c1f0beb0cb80ea8 Mon Sep 17 00:00:00 2001 From: Andreas Jaeger Date: Wed, 12 Dec 2012 09:26:46 +0000 Subject: [PATCH 5/5] Accepting request 145178 from home:a_jaeger:my-factory-packages Update to current git. OBS-URL: https://build.opensuse.org/request/show/145178 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=249 --- glibc-2.16.90-4641d57e1e00.tar.xz | 3 +++ glibc-2.16.90-56e7d3ad5c2f.tar.xz | 3 --- glibc.changes | 7 +++++++ glibc.spec | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 glibc-2.16.90-4641d57e1e00.tar.xz delete mode 100644 glibc-2.16.90-56e7d3ad5c2f.tar.xz diff --git a/glibc-2.16.90-4641d57e1e00.tar.xz b/glibc-2.16.90-4641d57e1e00.tar.xz new file mode 100644 index 0000000..7576275 --- /dev/null +++ b/glibc-2.16.90-4641d57e1e00.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71986496690c30d7b37cd140bda4e5a471c5c32d2ade05348fe6eacee1de235e +size 11130856 diff --git a/glibc-2.16.90-56e7d3ad5c2f.tar.xz b/glibc-2.16.90-56e7d3ad5c2f.tar.xz deleted file mode 100644 index 220fd19..0000000 --- a/glibc-2.16.90-56e7d3ad5c2f.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bbe236fe37232839b0232f826b4cbadd09d688cabc63530a6d124a9039d2378 -size 11132824 diff --git a/glibc.changes b/glibc.changes index 454f007..8f4469e 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Wed Dec 12 08:32:53 UTC 2012 - aj@suse.de + +- Update to 4641d57e1e00: + * Updated translations + * bug fixes + ------------------------------------------------------------------- Mon Dec 10 13:08:01 UTC 2012 - schwab@suse.de diff --git a/glibc.spec b/glibc.spec index 1737da6..90eabab 100644 --- a/glibc.spec +++ b/glibc.spec @@ -123,7 +123,7 @@ Provides: ld-linux.so.3(GLIBC_2.4) Version: 2.16.90 Release: 0 %define glibc_major_version 2.16.90 -%define git_id 56e7d3ad5c2f +%define git_id 4641d57e1e00 Url: http://www.gnu.org/software/libc/libc.html BuildRoot: %{_tmppath}/%{name}-%{version}-build Source: glibc-%{version}-%{git_id}.tar.xz