summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--inc/dump_dir.h2
-rw-r--r--lib/plugins/KerneloopsScanner.cpp6
-rw-r--r--lib/utils/dump_dir.c47
-rw-r--r--src/daemon/abrt-server.c6
-rw-r--r--src/hooks/abrt-hook-ccpp.cpp4
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);