diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-01-29 17:18:50 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-01-29 17:18:50 +0000 |
commit | 9ae7cd523783f345e146a4b3c10dc1fd788df8da (patch) | |
tree | 9a5c60044533e37921bf6876e99d2a8a7758e409 /cpukit | |
parent | 2009-01-29 Gene Smith <gene.smith@siemens.com> (diff) | |
download | rtems-9ae7cd523783f345e146a4b3c10dc1fd788df8da.tar.bz2 |
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.
Diffstat (limited to 'cpukit')
-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 9462e27274..cec18aa074 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 16bd7f1ec8..a0c184b3d5 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; } |