summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2007-08-28 14:03:52 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2007-08-28 14:03:52 +0000
commit4d11115798b72d14794c2e05d0f28e6c60a6a593 (patch)
tree2aebc579837fe247970729c9a9cbb5aaed7eeff8
parent2007-07-31 Joel Sherrill <joel.sherrill@OARcorp.com> (diff)
downloadrtems-4d11115798b72d14794c2e05d0f28e6c60a6a593.tar.bz2
2007-08-28 Joel Sherrill <joel.sherrill@OARcorp.com>
PR 1256/networking * ftpd/ftpd.c, sapi/src/io.c: Fix unaligned access.
-rw-r--r--cpukit/ChangeLog5
-rw-r--r--cpukit/ftpd/ftpd.c17
-rw-r--r--cpukit/sapi/src/io.c11
3 files changed, 22 insertions, 11 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog
index 4758c52409..a8f5e53a1d 100644
--- a/cpukit/ChangeLog
+++ b/cpukit/ChangeLog
@@ -1,3 +1,8 @@
+2007-08-28 Joel Sherrill <joel.sherrill@OARcorp.com>
+
+ PR 1256/networking
+ * ftpd/ftpd.c, sapi/src/io.c: Fix unaligned access.
+
2007-07-31 Joel Sherrill <joel.sherrill@OARcorp.com>
PR 1248/networking
diff --git a/cpukit/ftpd/ftpd.c b/cpukit/ftpd/ftpd.c
index dc2153793d..bdb406b39e 100644
--- a/cpukit/ftpd/ftpd.c
+++ b/cpukit/ftpd/ftpd.c
@@ -1432,13 +1432,19 @@ command_port(FTPD_SessionInfo_t *info, char const *args)
if(NUM_FIELDS == n)
{
int i;
- uint8_t b[NUM_FIELDS];
+ union {
+ uint8_t b[NUM_FIELDS];
+ struct {
+ uint32_t ip;
+ uint16_t port;
+ };
+ } ip_info;
for(i = 0; i < NUM_FIELDS; ++i)
{
if(a[i] > 255)
break;
- b[i] = (uint8_t)a[i];
+ ip_info.b[i] = (uint8_t)a[i];
}
if(i == NUM_FIELDS)
@@ -1446,11 +1452,10 @@ command_port(FTPD_SessionInfo_t *info, char const *args)
/* Note: while it contradicts with RFC959, we don't allow PORT command
* to specify IP address different than those of the originating client
* for the sake of safety. */
- uint32_t const *ip = (uint32_t *)b;
- if(*ip == info->def_addr.sin_addr.s_addr)
+ if (ip_info.ip == info->def_addr.sin_addr.s_addr)
{
- info->data_addr.sin_addr.s_addr = *ip;
- info->data_addr.sin_port = *(uint16_t *)(b + 4);
+ info->data_addr.sin_addr.s_addr = ip_info.ip;
+ info->data_addr.sin_port = ip_info.port;
info->data_addr.sin_family = AF_INET;
memset(info->data_addr.sin_zero, 0, sizeof(info->data_addr.sin_zero));
diff --git a/cpukit/sapi/src/io.c b/cpukit/sapi/src/io.c
index 823427fd47..c989711535 100644
--- a/cpukit/sapi/src/io.c
+++ b/cpukit/sapi/src/io.c
@@ -136,15 +136,16 @@ rtems_status_code rtems_io_register_driver(
if ( major == 0 )
{
+ bool found = FALSE;
for ( major = _IO_Number_of_drivers - 1 ; major ; major-- )
if ( _IO_Driver_address_table[major].initialization_entry == 0 &&
- _IO_Driver_address_table[major].open_entry == 0 )
+ _IO_Driver_address_table[major].open_entry == 0 ) {
+ found = FALSE;
break;
+ }
- if (( major == 0 ) &&
- ( _IO_Driver_address_table[major].initialization_entry == 0 &&
- _IO_Driver_address_table[major].open_entry == 0 ))
- return RTEMS_TOO_MANY;
+ if ( !found )
+ return RTEMS_TOO_MANY;
}
if ( _IO_Driver_address_table[major].initialization_entry == 0 &&