chiark / gitweb /
fix ENV{TEST}="Test: $env{TEST}"
[elogind.git] / udev_rules.c
index d9e1d89e6c91b249a9028e9a933cf5c836ef103d..1483f8f4930d50b0d62d2c2a594b1a31f38353c2 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * udev_rules.c
- *
  * Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com>
  * Copyright (C) 2003-2006 Kay Sievers <kay.sievers@vrfy.org>
  *
@@ -15,7 +13,7 @@
  *
  *     You should have received a copy of the GNU General Public License along
  *     with this program; if not, write to the Free Software Foundation, Inc.,
- *     675 Mass Ave, Cambridge, MA 02139, USA.
+ *     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
  */
 
@@ -28,6 +26,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <syslog.h>
+#include <fnmatch.h>
 #include <sys/wait.h>
 #include <sys/stat.h>
 
@@ -246,7 +245,7 @@ static int import_parent_into_env(struct udevice *udev, const char *filter)
                                if (pos) {
                                        pos[0] = '\0';
                                        pos++;
-                                       if (strcmp_pattern(filter, name) == 0) {
+                                       if (fnmatch(filter, name, 0) == 0) {
                                                dbg("import key '%s'", name_loop->name);
                                                name_list_add(&udev->env_list, name_loop->name, 0);
                                                setenv(name, pos, 1);
@@ -583,7 +582,7 @@ static int match_key(const char *key_name, struct udev_rule *rule, struct key *k
                        pos++;
                }
                dbg("match %s '%s' <-> '%s'", key_name, key_value, val);
-               match = (strcmp_pattern(key_value, val) == 0);
+               match = (fnmatch(key_value, val, 0) == 0);
                if (match && (key->operation != KEY_OP_NOMATCH)) {
                        dbg("%s is true (matching value)", key_name);
                        return 0;
@@ -803,13 +802,19 @@ try_parent:
                struct key_pair *pair = &rule->env.keys[i];
 
                if (pair->key.operation == KEY_OP_ASSIGN) {
+                       char temp_value[NAME_SIZE];
                        const char *key_name = key_pair_name(rule, pair);
                        const char *value = key_val(rule, &pair->key);
-                       char *key_value = name_list_key_add(&udev->env_list, key_name, value);
+                       char *key_value;
+
+                       /* make sure we don't write to the same string we possibly read from */
+                       strlcpy(temp_value, value, sizeof(temp_value));
+                       udev_rules_apply_format(udev, temp_value, NAME_SIZE);
+
+                       key_value = name_list_key_add(&udev->env_list, key_name, temp_value);
                        if (key_value == NULL)
                                break;
 
-                       udev_rules_apply_format(udev, key_value, NAME_SIZE);
                        putenv(key_value);
                        dbg("export ENV '%s'", key_value);
                }