summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
4e291aa)
reduce the amount of failure that can happin in that function.
git-svn-id: svn://svn.sv.gnu.org/sysvinit/sysvinit/trunk@148
456724a4-4300-0410-8514-
c89748c515a2
Debian.
* Adjust makefile to make it easier to link all binaries statically.
Patch from Matias A. Fonzo and Dragora.
Debian.
* Adjust makefile to make it easier to link all binaries statically.
Patch from Matias A. Fonzo and Dragora.
+ * Rewrite findtty() in bootlogd.c to not chance working directory, to
+ reduce the amount of failure that can happin in that function.
-- Petter Reinholdtsen <pere@hungry.com> Sun Apr 11 11:28:55 CEST 2010
-- Petter Reinholdtsen <pere@hungry.com> Sun Apr 11 11:28:55 CEST 2010
{
DIR *dir;
struct dirent *ent;
{
DIR *dir;
struct dirent *ent;
- char *olddir = getcwd(NULL, 0);
- if (chdir(startdir) < 0 || (dir = opendir(".")) == NULL) {
+ if ((dir = opendir(startdir)) == NULL) {
int msglen = strlen(startdir) + 11;
char *msg = malloc(msglen);
snprintf(msg, msglen, "bootlogd: %s", startdir);
perror(msg);
free(msg);
int msglen = strlen(startdir) + 11;
char *msg = malloc(msglen);
snprintf(msg, msglen, "bootlogd: %s", startdir);
perror(msg);
free(msg);
return -1;
}
while ((ent = readdir(dir)) != NULL) {
return -1;
}
while ((ent = readdir(dir)) != NULL) {
- if (lstat(ent->d_name, &st) != 0)
+ struct stat st;
+ int pathlen = strlen(startdir) + strlen(ent->d_name) + 2;
+ char *path = malloc(pathlen);
+ snprintf(path, pathlen, "%s/%s", startdir, ent->d_name);
+
+ if (lstat(path, &st) != 0) {
+ free(path);
if (S_ISDIR(st.st_mode)
&& 0 != strcmp(".", ent->d_name)
&& 0 != strcmp("..", ent->d_name)) {
if (S_ISDIR(st.st_mode)
&& 0 != strcmp(".", ent->d_name)
&& 0 != strcmp("..", ent->d_name)) {
- char *path = malloc(rlen);
- snprintf(path, rlen, "%s/%s", startdir, ent->d_name);
r = findtty(res, path, rlen, dev);
r = findtty(res, path, rlen, dev);
if (0 == r) { /* device found, return */
if (0 == r) { /* device found, return */
+ free(path);
+ path = NULL;
if (!S_ISCHR(st.st_mode))
continue;
if (st.st_rdev == dev) {
if ( (strlen(ent->d_name) + strlen(startdir) + 1) >= rlen) {
fprintf(stderr, "bootlogd: console device name too long\n");
closedir(dir);
if (!S_ISCHR(st.st_mode))
continue;
if (st.st_rdev == dev) {
if ( (strlen(ent->d_name) + strlen(startdir) + 1) >= rlen) {
fprintf(stderr, "bootlogd: console device name too long\n");
closedir(dir);
return -1;
} else {
snprintf(res, rlen, "%s/%s", startdir, ent->d_name);
closedir(dir);
return -1;
} else {
snprintf(res, rlen, "%s/%s", startdir, ent->d_name);
closedir(dir);
return 0;
}
}
}
closedir(dir);
return 0;
}
}
}
closedir(dir);