On Tue, Sep 19, 2006 at 03:01:51PM +0200, Abraham vd Merwe wrote:
> Thanks for the help. Can you send me your patch with the memmove()'s and
> I'll have a look at it?
The attached patch makes tinysnmpd survive a full snmpwalk on sparc. As I
said, I don't think this is the correct fix, since nothing in memmove(3)
indicates it can be relied on for copying non-aligned data. But at least
it shows some of the problematic points.
FWIW, this seems to work with -Os as well, so -O0 is no longer needed.
Cheers,
--
Niko Tyni [EMAIL PROTECTED]
--- /tmp/GdYvJ6nBqN/tinysnmp-0.8.4/agent/odb.c 2004-07-30 19:59:29.000000000
+0300
+++ /tmp/vKVcLAvHZW/tinysnmp-0.8.4+memmove/agent/odb.c 2006-09-19
23:27:33.000000000 +0300
@@ -80,7 +80,7 @@
static int snmp_copy_value (snmp_value_t *dest,const snmp_value_t *src)
{
- memcpy (dest,src,sizeof (snmp_value_t));
+ memmove (dest,src,sizeof (snmp_value_t));
if (src->type == BER_OCTET_STRING)
{
@@ -145,7 +145,7 @@
odb->parent = odb->sibling = odb->child = NULL;
if (type == VALUE)
- odb->data.value = node->value;
+ memmove(&(odb->data.value), &(node->value), sizeof(snmp_value_t));
else
odb->data.node = node->oid[0];
--- /tmp/GdYvJ6nBqN/tinysnmp-0.8.4/modules/resources/diskinfo_linux.c
2004-07-17 17:02:24.000000000 +0300
+++ /tmp/vKVcLAvHZW/tinysnmp-0.8.4+memmove/modules/resources/diskinfo_linux.c
2006-09-19 23:40:33.000000000 +0300
@@ -137,6 +137,7 @@
struct statfs fs;
struct mntent *entry;
struct diskinfo *pt;
+ uint64_t tmp;
FILE *fp;
abz_clear_error ();
@@ -194,8 +195,10 @@
strcpy (pt->d_dev,entry->mnt_fsname);
strcpy (pt->d_dir,entry->mnt_dir);
pt->d_type = type;
- pt->d_total = ((uint64_t) fs.f_bsize * (uint64_t) fs.f_blocks)
>> 20;
- pt->d_free = ((uint64_t) fs.f_bsize * (uint64_t) fs.f_bavail)
>> 20;
+ tmp = ((uint64_t) fs.f_bsize * (uint64_t) fs.f_blocks) >> 20;
+ memmove(&(pt->d_total), &tmp, sizeof(uint64_t));
+ tmp = ((uint64_t) fs.f_bsize * (uint64_t) fs.f_bavail) >> 20;
+ memmove(&(pt->d_free), &tmp, sizeof(uint64_t));
disk_insert (list,pt);
}
--- /tmp/GdYvJ6nBqN/tinysnmp-0.8.4/modules/resources/main.c 2004-07-31
21:13:01.000000000 +0300
+++ /tmp/vKVcLAvHZW/tinysnmp-0.8.4+memmove/modules/resources/main.c
2006-09-19 23:44:44.000000000 +0300
@@ -134,13 +134,15 @@
static void diskTotal (snmp_value_t *value,const struct diskinfo *disk)
{
value->type = BER_Gauge32;
- value->data.Gauge32 = disk->d_total;
+ /* should this be uint64_t or uint32_t ? */
+ memmove(&value->data.Gauge32, &disk->d_total, sizeof(uint64_t));
}
static void diskFree (snmp_value_t *value,const struct diskinfo *disk)
{
value->type = BER_Gauge32;
- value->data.Gauge32 = disk->d_free;
+ /* should this be uint64_t or uint32_t ? */
+ memmove(&value->data.Gauge32, &disk->d_free, sizeof(uint64_t));
}
static int storage_update (struct odb **odb)