chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] udev - safer sprintf() use
[elogind.git]
/
namedev.c
diff --git
a/namedev.c
b/namedev.c
index f688507dc39c985b389e3b1c68cf2efafce110f3..581a7f2218ca08973d90bef696ba45d1132f2a36 100644
(file)
--- a/
namedev.c
+++ b/
namedev.c
@@
-228,7
+228,7
@@
static void apply_format(struct udevice *udev, char *string, size_t maxsize,
pos = string;
while (1) {
pos = string;
while (1) {
- pos = strchr(
pos
, '%');
+ pos = strchr(
string
, '%');
if (pos != NULL) {
pos[0] = '\0';
tail = pos+1;
if (pos != NULL) {
pos[0] = '\0';
tail = pos+1;
@@
-247,27
+247,27
@@
static void apply_format(struct udevice *udev, char *string, size_t maxsize,
case 'b':
if (strlen(udev->bus_id) == 0)
break;
case 'b':
if (strlen(udev->bus_id) == 0)
break;
- strnfieldcat(
pos
, udev->bus_id, maxsize);
+ strnfieldcat(
string
, udev->bus_id, maxsize);
dbg("substitute bus_id '%s'", udev->bus_id);
break;
case 'k':
if (strlen(udev->kernel_name) == 0)
break;
dbg("substitute bus_id '%s'", udev->bus_id);
break;
case 'k':
if (strlen(udev->kernel_name) == 0)
break;
- strnfieldcat(
pos
, udev->kernel_name, maxsize);
+ strnfieldcat(
string
, udev->kernel_name, maxsize);
dbg("substitute kernel name '%s'", udev->kernel_name);
break;
case 'n':
if (strlen(udev->kernel_number) == 0)
break;
dbg("substitute kernel name '%s'", udev->kernel_name);
break;
case 'n':
if (strlen(udev->kernel_number) == 0)
break;
- strnfieldcat(
pos
, udev->kernel_number, maxsize);
+ strnfieldcat(
string
, udev->kernel_number, maxsize);
dbg("substitute kernel number '%s'", udev->kernel_number);
break;
case 'm':
dbg("substitute kernel number '%s'", udev->kernel_number);
break;
case 'm':
- s
printf(pos, "%u", udev->minor
);
+ s
trnintcat(string, udev->minor, maxsize
);
dbg("substitute minor number '%u'", udev->minor);
break;
dbg("substitute minor number '%u'", udev->minor);
break;
-
case 'M':
- s
printf(pos, "%u", udev->major
);
+ case 'M':
+ s
trnintcat(string, udev->major, maxsize
);
dbg("substitute major number '%u'", udev->major);
break;
case 'c':
dbg("substitute major number '%u'", udev->major);
break;
case 'c':
@@
-289,11
+289,11
@@
static void apply_format(struct udevice *udev, char *string, size_t maxsize,
}
}
if (pos3) {
}
}
if (pos3) {
- strnfieldcat(
pos
, pos3, maxsize);
+ strnfieldcat(
string
, pos3, maxsize);
dbg("substitute part of result string '%s'", pos3);
}
} else {
dbg("substitute part of result string '%s'", pos3);
}
} else {
- strnfieldcat(
pos
, udev->program_result, maxsize);
+ strnfieldcat(
string
, udev->program_result, maxsize);
dbg("substitute result string '%s'", udev->program_result);
}
break;
dbg("substitute result string '%s'", udev->program_result);
}
break;
@@
-304,20
+304,20
@@
static void apply_format(struct udevice *udev, char *string, size_t maxsize,
dbg("sysfa attribute '%s' not found", attr);
break;
}
dbg("sysfa attribute '%s' not found", attr);
break;
}
- strnfieldc
py(pos
, tmpattr->value, maxsize);
+ strnfieldc
at(string
, tmpattr->value, maxsize);
dbg("substitute sysfs value '%s'", tmpattr->value);
} else {
dbg("missing attribute");
}
break;
case '%':
dbg("substitute sysfs value '%s'", tmpattr->value);
} else {
dbg("missing attribute");
}
break;
case '%':
- strnfieldcat(
pos
, "%", maxsize);
+ strnfieldcat(
string
, "%", maxsize);
break;
default:
dbg("unknown substitution type '%%%c'", c);
break;
}
break;
default:
dbg("unknown substitution type '%%%c'", c);
break;
}
- strnfieldcat(
pos
, tail, maxsize);
+ strnfieldcat(
string
, tail, maxsize);
}
}
}
}
@@
-405,7
+405,7
@@
static int execute_program(char *path, char *value, int len)
int fds[2];
pid_t pid;
int value_set = 0;
int fds[2];
pid_t pid;
int value_set = 0;
- char buffer[25
6
];
+ char buffer[25
5
];
char *pos;
char *args[PROGRAM_MAXARG];
int i;
char *pos;
char *args[PROGRAM_MAXARG];
int i;
@@
-421,7
+421,13
@@
static int execute_program(char *path, char *value, int len)
case 0:
/* child */
close(STDOUT_FILENO);
case 0:
/* child */
close(STDOUT_FILENO);
- dup(fds[1]); /* dup write side of pipe to STDOUT */
+
+ /* dup write side of pipe to STDOUT */
+ dup(fds[1]);
+
+ /* copy off our path to use incase we have too many args */
+ strnfieldcpy(buffer, path, sizeof(buffer));
+
if (strchr(path, ' ')) {
/* exec with arguments */
pos = path;
if (strchr(path, ' ')) {
/* exec with arguments */
pos = path;
@@
-431,14
+437,16
@@
static int execute_program(char *path, char *value, int len)
break;
}
if (args[i]) {
break;
}
if (args[i]) {
- dbg("too many args - %d", i);
- args[i] = NULL;
+ dbg("too many args - %d, using subshell instead '%s'", i, buffer);
+ retval = execl("/bin/sh", "sh", "-c", buffer, NULL);
+ } else {
+ dbg("execute program '%s'", path);
+ retval = execv(args[0], args);
}
}
- retval = execv(args[0], args);
} else {
retval = execv(path, main_argv);
}
} else {
retval = execv(path, main_argv);
}
-
dbg("child execve failed"
);
+
info(FIELD_PROGRAM " execution of '%s' failed", path
);
exit(1);
case -1:
dbg("fork failed");
exit(1);
case -1:
dbg("fork failed");