* [PATCH] Fix dangling pointer returned by attr_get_by_subsys_id()
@ 2008-08-31 17:15 Alan Jenkins
0 siblings, 0 replies; 2+ messages in thread
From: Alan Jenkins @ 2008-08-31 17:15 UTC (permalink / raw)
To: linux-hotplug
Temporary stack buffers should be allocated by caller, not callee :-).
After uncommenting the valgrind line in udev-test.pl:
./udev-test.pl 147
udev-test will run test number 147 only:
TEST 147: magic subsys/kernel lookup
device '/block/sda' expecting node '00:e0:00:fb:04:e1'
=18218= Memcheck, a memory error detector.
=18218= Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
=18218= Using LibVEX rev 1804, a library for dynamic binary translation.
=18218= Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
=18218= Using valgrind-3.3.0-Debian, a dynamic binary instrumentation framework.
=18218= Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
=18218= For more details, rerun with: -v
=18218=
=18218= Conditional jump or move depends on uninitialised value(s)
=18218= at 0x40CF41: strlcat (udev_sysdeps.c:60)
=18218= by 0x40DE5F: sysfs_attr_get_value (udev_sysfs.c:345)
=18218= by 0x4081B4: udev_rules_apply_format (udev_rules.c:835)
=18218= by 0x40A442: udev_rules_get_name (udev_rules.c:1497)
=18218= by 0x403FB8: udev_device_event (udev_device_event.c:138)
=18218= by 0x4104BC: main (test-udev.c:157)
(and more with same backtrace)
=18218= Conditional jump or move depends on uninitialised value(s)
=18218= at 0x40CE84: strlcpy (udev_sysdeps.c:34)
=18218= by 0x40DF3D: sysfs_attr_get_value (udev_sysfs.c:361)
...
=18218= Syscall param lstat(file_name) points to uninitialised byte(s)
=18218= at 0x510BB15: _lxstat (lxstat.c:38)
=18218= by 0x40DF61: sysfs_attr_get_value (udev_sysfs.c:365)
=18218= Address 0x7feffe703 is on thread 1's stack
...
=18218= Syscall param open(filename) points to uninitialised byte(s)
=18218= at 0x510C330: __open_nocancel (in /usr/lib/debug/libc-2.7.so)
=18218= by 0x40E063: sysfs_attr_get_value (udev_sysfs.c:398)
...
=18218= Address 0x7feffe703 is on thread 1's stack
Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
diff --git a/udev/udev_rules.c b/udev/udev_rules.c
index 693bce2..cc0dbbb 100644
--- a/udev/udev_rules.c
+++ b/udev/udev_rules.c
@@ -566,7 +566,7 @@ static int wait_for_file(struct udevice *udev, const char *file, int timeout)
}
/* handle "[$SUBSYSTEM/$KERNEL]<attribute>" lookup */
-static int attr_get_by_subsys_id(const char *attrstr, char *devpath, size_t len, char **attr)
+static int attr_get_by_subsys_id(const char *attrstr, char *devpath, size_t pathlen, char *attr, size_t attrlen)
{
char subsys[NAME_SIZE];
char *attrib;
@@ -590,12 +590,9 @@ static int attr_get_by_subsys_id(const char *attrstr, char *devpath, size_t len,
id[0] = '\0';
id = &id[1];
- if (sysfs_lookup_devpath_by_subsys_id(devpath, len, subsys, id)) {
+ if (sysfs_lookup_devpath_by_subsys_id(devpath, pathlen, subsys, id)) {
if (attr != NULL) {
- if (attrib[0] != '\0')
- *attr = attrib;
- else
- *attr = NULL;
+ strlcpy(attr, attrib, attrlen);
}
found = 1;
}
@@ -826,12 +823,12 @@ found:
err("missing file parameter for attr\n");
else {
char devpath[PATH_SIZE];
- char *attrib;
+ char attrib[NAME_SIZE];
const char *value = NULL;
size_t size;
- if (attr_get_by_subsys_id(attr, devpath, sizeof(devpath), &attrib)) {
- if (attrib != NULL)
+ if (attr_get_by_subsys_id(attr, devpath, sizeof(devpath), attrib, sizeof(attrib))) {
+ if (attrib[0] != '\0')
value = sysfs_attr_get_value(devpath, attrib);
else
break;
@@ -1074,17 +1071,17 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule)
rule->test.operation = KEY_OP_NOMATCH) {
char filename[PATH_SIZE];
char devpath[PATH_SIZE];
- char *attr;
+ char attr[NAME_SIZE];
struct stat statbuf;
int match;
strlcpy(filename, key_val(rule, &rule->test), sizeof(filename));
udev_rules_apply_format(udev, filename, sizeof(filename));
- if (attr_get_by_subsys_id(filename, devpath, sizeof(devpath), &attr)) {
+ if (attr_get_by_subsys_id(filename, devpath, sizeof(devpath), attr, sizeof(attr))) {
strlcpy(filename, sysfs_path, sizeof(filename));
strlcat(filename, devpath, sizeof(filename));
- if (attr != NULL) {
+ if (attr[0] != '\0') {
strlcat(filename, "/", sizeof(filename));
strlcat(filename, attr, sizeof(filename));
}
@@ -1135,13 +1132,13 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule)
const char *key_name = key_pair_name(rule, pair);
const char *key_value = key_val(rule, &pair->key);
char devpath[PATH_SIZE];
- char *attrib;
+ char attrib[NAME_SIZE];
const char *value = NULL;
char val[VALUE_SIZE];
size_t len;
- if (attr_get_by_subsys_id(key_name, devpath, sizeof(devpath), &attrib)) {
- if (attrib != NULL)
+ if (attr_get_by_subsys_id(key_name, devpath, sizeof(devpath), attrib, sizeof(attrib))) {
+ if (attrib[0] != '\0')
value = sysfs_attr_get_value(devpath, attrib);
else
goto nomatch;
@@ -1324,13 +1321,13 @@ try_parent:
if (pair->key.operation = KEY_OP_ASSIGN) {
const char *key_name = key_pair_name(rule, pair);
char devpath[PATH_SIZE];
- char *attrib;
+ char attrib[NAME_SIZE];
char attr[PATH_SIZE] = "";
char value[NAME_SIZE];
FILE *f;
- if (attr_get_by_subsys_id(key_name, devpath, sizeof(devpath), &attrib)) {
- if (attrib != NULL) {
+ if (attr_get_by_subsys_id(key_name, devpath, sizeof(devpath), attrib, sizeof(attrib))) {
+ if (attrib[0] != '\0') {
strlcpy(attr, sysfs_path, sizeof(attr));
strlcat(attr, devpath, sizeof(attr));
strlcat(attr, "/", sizeof(attr));
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] Fix dangling pointer returned by attr_get_by_subsys_id()
@ 2008-09-01 14:28 Kay Sievers
0 siblings, 0 replies; 2+ messages in thread
From: Kay Sievers @ 2008-09-01 14:28 UTC (permalink / raw)
To: linux-hotplug
On Sun, Aug 31, 2008 at 19:15, Alan Jenkins <alan-jenkins@tuffmail.co.uk> wrote:
> Temporary stack buffers should be allocated by caller, not callee :-).
>
> /* handle "[$SUBSYSTEM/$KERNEL]<attribute>" lookup */
> -static int attr_get_by_subsys_id(const char *attrstr, char *devpath, size_t len, char **attr)
Ah, attr is supposed to return the position in attstr. Should be fixed now.
Thanks,
Kay
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-09-01 14:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-31 17:15 [PATCH] Fix dangling pointer returned by attr_get_by_subsys_id() Alan Jenkins
-- strict thread matches above, loose matches on Subject: below --
2008-09-01 14:28 Kay Sievers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).