diff options
-rw-r--r-- | inc/dump_dir.h | 2 | ||||
-rw-r--r-- | lib/plugins/KerneloopsScanner.cpp | 6 | ||||
-rw-r--r-- | lib/utils/dump_dir.c | 47 | ||||
-rw-r--r-- | src/daemon/abrt-server.c | 6 | ||||
-rw-r--r-- | src/hooks/abrt-hook-ccpp.cpp | 4 |
5 files changed, 29 insertions, 36 deletions
diff --git a/inc/dump_dir.h b/inc/dump_dir.h index ef9ef7a7..c5218a3b 100644 --- a/inc/dump_dir.h +++ b/inc/dump_dir.h @@ -43,8 +43,8 @@ struct dump_dir *dd_init(void); void dd_close(struct dump_dir *dd); int dd_opendir(struct dump_dir *dd, const char *dir, int flags); +struct dump_dir *dd_create(const char *dir, uid_t uid); int dd_exist(struct dump_dir *dd, const char *path); -int dd_create(struct dump_dir *dd, const char *dir, uid_t uid); DIR *dd_init_next_file(struct dump_dir *dd); int dd_get_next_file(struct dump_dir *dd, char **short_name, char **full_name); diff --git a/lib/plugins/KerneloopsScanner.cpp b/lib/plugins/KerneloopsScanner.cpp index 9336a7d8..d187daa9 100644 --- a/lib/plugins/KerneloopsScanner.cpp +++ b/lib/plugins/KerneloopsScanner.cpp @@ -132,8 +132,8 @@ int save_oops_to_debug_dump(GList **oopsList) char *second_line = (char*)strchr(first_line, '\n'); /* never NULL */ *second_line++ = '\0'; - struct dump_dir *dd = dd_init(); - if (dd_create(dd, path, /*uid:*/ 0)) + struct dump_dir *dd = dd_create(path, /*uid:*/ 0); + if (dd) { dd_save_text(dd, FILENAME_ANALYZER, "Kerneloops"); dd_save_text(dd, FILENAME_EXECUTABLE, "kernel"); @@ -143,10 +143,10 @@ int save_oops_to_debug_dump(GList **oopsList) /* Optional, makes generated bz more informative */ strchrnul(second_line, '\n')[0] = '\0'; dd_save_text(dd, FILENAME_REASON, second_line); + dd_close(dd); } else errors++; - dd_close(dd); } return errors; diff --git a/lib/utils/dump_dir.c b/lib/utils/dump_dir.c index 11442d9b..4cba8eb1 100644 --- a/lib/utils/dump_dir.c +++ b/lib/utils/dump_dir.c @@ -181,7 +181,7 @@ int dd_opendir(struct dump_dir *dd, const char *dir, int flags) if (!dd->dd_dir) { if (!(flags & DD_FAIL_QUIETLY)) - error_msg("'%s' does not exist", dir); + error_msg("'%s' does not exist", dd_dir); if (flags & DD_CLOSE_ON_OPEN_ERR) dd_close(dd); return 0; @@ -226,10 +226,9 @@ int dd_opendir(struct dump_dir *dd, const char *dir, int flags) * Currently, we set dir's gid to passwd(uid)->pw_gid parameter, and we set uid to * abrt's user id. We do not allow write access to group. */ -int dd_create(struct dump_dir *dd, const char *dir, uid_t uid) +struct dump_dir *dd_create(const char *dir, uid_t uid) { - if (dd->locked) - error_msg_and_die("dump_dir is already opened"); /* bug */ + struct dump_dir *dd = dd_init(); /* Unlike dd_opendir, can't use realpath: the directory doesn't exist yet, * realpath will always return NULL. We don't really have to: @@ -248,7 +247,8 @@ int dd_create(struct dump_dir *dd, const char *dir, uid_t uid) * dd_create("dir/..") and similar are madness, refuse them. */ error_msg("Bad dir name '%s'", dd->dd_dir); - return 0; + dd_close(dd); + return NULL; } dd_lock(dd); @@ -259,21 +259,21 @@ int dd_create(struct dump_dir *dd, const char *dir, uid_t uid) */ if (mkdir(dd->dd_dir, 0750) == -1) { - perror_msg("Can't create dir '%s'", dir); - dd_unlock(dd); - return 0; + perror_msg("Can't create dir '%s'", dd->dd_dir); + dd_close(dd); + return NULL; } /* mkdir's mode (above) can be affected by umask, fix it */ if (chmod(dd->dd_dir, 0750) == -1) { perror_msg("Can't change mode of '%s'", dd->dd_dir); - dd_unlock(dd); - return 0; + dd_close(dd); + return NULL; } /* Get ABRT's user id */ - dd->dd_uid = 0; + /*dd->dd_uid = 0; - dd_init did this already */ struct passwd *pw = getpwnam("abrt"); if (pw) dd->dd_uid = pw->pw_uid; @@ -281,7 +281,7 @@ int dd_create(struct dump_dir *dd, const char *dir, uid_t uid) error_msg("User 'abrt' does not exist, using uid 0"); /* Get crashed application's group id */ - dd->dd_gid = 0; + /*dd->dd_gid = 0; - dd_init did this already */ pw = getpwuid(uid); if (pw) dd->dd_gid = pw->pw_gid; @@ -299,25 +299,20 @@ int dd_create(struct dump_dir *dd, const char *dir, uid_t uid) sprintf(long_str, "%lu", (long)uid); dd_save_text(dd, CD_UID, long_str); - { - struct utsname buf; - if (uname(&buf) != 0) - { - perror_msg_and_die("uname"); - } - dd_save_text(dd, FILENAME_KERNEL, buf.release); - dd_save_text(dd, FILENAME_ARCHITECTURE, buf.machine); - char *release = load_text_file("/etc/redhat-release"); - strchrnul(release, '\n')[0] = '\0'; - dd_save_text(dd, FILENAME_RELEASE, release); - free(release); - } + struct utsname buf; + uname(&buf); /* never fails */ + dd_save_text(dd, FILENAME_KERNEL, buf.release); + dd_save_text(dd, FILENAME_ARCHITECTURE, buf.machine); + char *release = load_text_file("/etc/redhat-release"); + strchrnul(release, '\n')[0] = '\0'; + dd_save_text(dd, FILENAME_RELEASE, release); + free(release); time_t t = time(NULL); sprintf(long_str, "%lu", (long)t); dd_save_text(dd, FILENAME_TIME, long_str); - return 1; + return dd; } static void delete_file_dir(const char *dir) diff --git a/src/daemon/abrt-server.c b/src/daemon/abrt-server.c index 231fc0bd..67978561 100644 --- a/src/daemon/abrt-server.c +++ b/src/daemon/abrt-server.c @@ -115,11 +115,9 @@ static void create_debug_dump() /* No need to check the path length, as all variables used are limited, and dd_create() fails if the path is too long. */ - struct dump_dir *dd = dd_init(); - if (!dd_create(dd, path, client_uid)) + struct dump_dir *dd = dd_create(path, client_uid); + if (!dd) { - dd_delete(dd); - dd_close(dd); error_msg_and_die("Error creating crash dump %s", path); } diff --git a/src/hooks/abrt-hook-ccpp.cpp b/src/hooks/abrt-hook-ccpp.cpp index 279ac5db..146de6e0 100644 --- a/src/hooks/abrt-hook-ccpp.cpp +++ b/src/hooks/abrt-hook-ccpp.cpp @@ -415,8 +415,8 @@ int main(int argc, char** argv) if (path_len >= (sizeof(path) - sizeof("/"FILENAME_COREDUMP))) return 1; - struct dump_dir *dd = dd_init(); - if (dd_create(dd, path, uid)) + struct dump_dir *dd = dd_create(path, uid); + if (dd) { char *cmdline = get_cmdline(pid); /* never NULL */ char *reason = xasprintf("Process %s was killed by signal %s (SIG%s)", executable, signal_str, signame ? signame : signal_str); |