diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-01-29 17:19:00 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-01-29 17:19:00 +0000 |
commit | b7a08ad494477cd3d6d01f0815de99e4182202c1 (patch) | |
tree | d851eb20381f7561e17eda34cb6b8de09b7a60ae | |
parent | c9b28ef278c244be490981ad717114eb926defea (diff) |
2009-01-29 Nickolay Semyonov-Kolchin <nbkolchin@gmail.com>
PR 1359/cpukit
* libcsupport/src/libio.c: rtems_libio_allocate:
rtems_libio_iop_freelist incorrectly zeroed on semaphore error. Now
checks error and does not modify anything until sure it has created
semaphore.
-rw-r--r-- | cpukit/ChangeLog | 8 | ||||
-rw-r--r-- | cpukit/libcsupport/src/libio.c | 14 |
2 files changed, 16 insertions, 6 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index 3f70d40ae5..7f06a72f6f 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,11 @@ +2009-01-29 Nickolay Semyonov-Kolchin <nbkolchin@gmail.com> + + PR 1359/cpukit + * libcsupport/src/libio.c: rtems_libio_allocate: + rtems_libio_iop_freelist incorrectly zeroed on semaphore error. Now + checks error and does not modify anything until sure it has created + semaphore. + 2009-01-29 Gene Smith <gene.smith@siemens.com> PR 1363/filesystem diff --git a/cpukit/libcsupport/src/libio.c b/cpukit/libcsupport/src/libio.c index 879cd8134c..b225b57f6f 100644 --- a/cpukit/libcsupport/src/libio.c +++ b/cpukit/libcsupport/src/libio.c @@ -149,23 +149,25 @@ rtems_libio_t *rtems_libio_allocate( void ) { rtems_libio_t *iop, *next; rtems_status_code rc; + rtems_id sema; rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT ); if (rtems_libio_iop_freelist) { - iop = rtems_libio_iop_freelist; - next = iop->data1; - (void) memset( iop, 0, sizeof(rtems_libio_t) ); - iop->flags = LIBIO_FLAGS_OPEN; rc = rtems_semaphore_create( - RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops), + RTEMS_LIBIO_IOP_SEM(rtems_libio_iop_freelist - rtems_libio_iops), 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, - &iop->sem + &sema ); if (rc != RTEMS_SUCCESSFUL) goto failed; + iop = rtems_libio_iop_freelist; + next = iop->data1; + (void) memset( iop, 0, sizeof(rtems_libio_t) ); + iop->flags = LIBIO_FLAGS_OPEN; + iop->sem = sema; rtems_libio_iop_freelist = next; goto done; } |