- ack
On 09/10/2012 06:02 PM, Jakub Filak wrote:
Signed-off-by: Jakub Filak <jfilak(a)redhat.com>
---
src/lib/create_dump_dir.c | 35 +++++++++++++++++++++++++++--------
1 file changed, 27 insertions(+), 8 deletions(-)
diff --git a/src/lib/create_dump_dir.c b/src/lib/create_dump_dir.c
index 1e923a2..675547d 100644
--- a/src/lib/create_dump_dir.c
+++ b/src/lib/create_dump_dir.c
@@ -18,13 +18,14 @@
*/
#include "internal_libreport.h"
+#include <errno.h>
#define NEW_PD_SUFFIX ".new"
-static struct dump_dir *try_dd_create(const char *base_dir_name, const char *dir_name)
+static struct dump_dir *try_dd_create(const char *base_dir_name, const char *dir_name,
uid_t uid)
{
char *path = concat_path_file(base_dir_name, dir_name);
- struct dump_dir *dd = dd_create(path, (uid_t)-1L, 0640);
+ struct dump_dir *dd = dd_create(path, uid, 0640);
free(path);
return dd;
}
@@ -39,17 +40,35 @@ struct dump_dir *create_dump_dir_from_problem_data(problem_data_t
*problem_data,
return NULL;
}
+ uid_t uid = (uid_t)-1L;
+ char *uid_str = problem_data_get_content_or_NULL(problem_data, FILENAME_UID);
+
+ if (uid_str)
+ {
+ char *endptr;
+ errno = 0;
+ long val = strtol(uid_str, &endptr, 10);
+
+ if (errno != 0 || endptr == uid_str || *endptr != '\0' || INT_MAX <
val)
+ {
+ error_msg(_("uid value is not valid: '%s'"), uid_str);
+ return NULL;
+ }
+
+ uid = (uid_t)val;
+ }
+
char *problem_id = xasprintf("%s-%s-%lu"NEW_PD_SUFFIX, type,
iso_date_string(NULL), (long)getpid());
- VERB2 log("Saving to %s/%s", base_dir_name, problem_id);
+ VERB2 log("Saving to %s/%s with uid %d", base_dir_name, problem_id, uid);
struct dump_dir *dd;
if (base_dir_name)
- dd = try_dd_create(base_dir_name, problem_id);
+ dd = try_dd_create(base_dir_name, problem_id, uid);
else
{
/* Try /var/run/abrt */
- dd = try_dd_create(LOCALSTATEDIR"/run/abrt", problem_id);
+ dd = try_dd_create(LOCALSTATEDIR"/run/abrt", problem_id, uid);
/* Try $HOME/tmp */
if (!dd)
{
@@ -58,14 +77,14 @@ struct dump_dir *create_dump_dir_from_problem_data(problem_data_t
*problem_data,
{
home = concat_path_file(home, "tmp");
/*mkdir(home, 0777); - do we want this? */
- dd = try_dd_create(home, problem_id);
+ dd = try_dd_create(home, problem_id, uid);
free(home);
}
}
//TODO: try user's home dir obtained by getpwuid(getuid())?
/* Try /tmp */
if (!dd)
- dd = try_dd_create("/tmp", problem_id);
+ dd = try_dd_create("/tmp", problem_id, uid);
}
if (!dd) /* try_dd_create() already emitted the error message */
@@ -106,7 +125,7 @@ struct dump_dir *create_dump_dir_from_problem_data(problem_data_t
*problem_data,
* reporting from anaconda where we can't read /etc/{system,redhat}-release
* and os_release is taken from anaconda
*/
- dd_create_basic_files(dd, (uid_t)-1L, NULL);
+ dd_create_basic_files(dd, uid, NULL);
problem_id[strlen(problem_id) - strlen(NEW_PD_SUFFIX)] = '\0';
char* new_path = concat_path_file(base_dir_name, problem_id);