Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.1
syslog-ng
syslog-ng-no-perm-change.dif
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File syslog-ng-no-perm-change.dif of Package syslog-ng
--- src/affile.c +++ src/affile.c 2008/08/19 11:49:06 @@ -38,12 +38,22 @@ #if !HAVE_O_LARGEFILE #define O_LARGEFILE 0 #endif +/* + * Flags used to remember which option was explicitly set + * to the default value (-1) to avoid any permission and + * ownership changes on already existing (device) files. + * In case the file does not exists, global options apply. + * Note: The pipe driver never creates any (device) file. + */ +#define OPT_NO_CHMOD 0x0001 +#define OPT_NO_CHOWN 0x0002 +#define OPT_NO_CHGRP 0x0004 static gboolean affile_open_file(gchar *name, int flags, int uid, int gid, int mode, int dir_uid, int dir_gid, int dir_mode, - int create_dirs, int *fd) + int create_dirs, int *fd, guint32 nochopts) { if (strstr(name, "../") || strstr(name, "/..")) { @@ -53,7 +63,7 @@ affile_open_file(gchar *name, int flags, return FALSE; } - *fd = open(name, flags, mode); + *fd = open(name, flags, mode != -1 ? mode : 0600); if (create_dirs && *fd == -1 && errno == ENOENT) { /* directory does not exist */ @@ -71,7 +81,7 @@ affile_open_file(gchar *name, int flags, } else if (errno == ENOENT) { - if (mkdir(name, dir_mode) == -1) + if (mkdir(name, dir_mode != (mode_t)-1 ? dir_mode : 0700) == -1) return 0; if (dir_uid != -1 || dir_gid != -1) chown(name, dir_uid, dir_gid); @@ -81,16 +91,16 @@ affile_open_file(gchar *name, int flags, *p = '/'; p = strchr(p + 1, '/'); } - *fd = open(name, flags, mode); + *fd = open(name, flags, mode != (mode_t)-1 ? mode : 0600); } if (*fd != -1) { g_fd_set_cloexec(*fd, TRUE); - if (uid != -1) + if (uid != (uid_t)-1 && !(nochopts & OPT_NO_CHOWN)) fchown(*fd, uid, -1); - if (gid != -1) + if (gid != (gid_t)-1 && !(nochopts & OPT_NO_CHGRP)) fchown(*fd, -1, gid); - if (mode != -1) + if (mode != (mode_t)-1 && !(nochopts & OPT_NO_CHMOD)) fchmod(*fd, mode); } return *fd != -1; @@ -106,7 +116,8 @@ affile_sd_open_file(AFFileSourceDriver * else flags = O_RDONLY | O_NOCTTY | O_NONBLOCK | O_LARGEFILE; - if (affile_open_file(self->filename->str, flags, -1, -1, -1, 0, 0, 0, 0, fd)) + if (affile_open_file(self->filename->str, flags, -1, -1, -1, 0, 0, 0, 0, fd, + (OPT_NO_CHOWN|OPT_NO_CHGRP|OPT_NO_CHMOD))) return TRUE; return FALSE; @@ -340,7 +351,7 @@ affile_dw_init(LogPipe *s, GlobalConfig if (affile_open_file(self->filename->str, flags, self->owner->file_uid, self->owner->file_gid, self->owner->file_perm, self->owner->dir_uid, self->owner->dir_gid, self->owner->dir_perm, - !!(self->owner->flags & AFFILE_CREATE_DIRS), &fd)) + !!((self->owner->flags & AFFILE_PIPE) ? 0 : (self->owner->flags & AFFILE_CREATE_DIRS)), &fd, self->owner->chopt)) { FDWrite *fdw; @@ -461,6 +472,8 @@ affile_dd_set_file_uid(LogDriver *s, con evt_tag_str("user", file_uid), NULL); } + if (self->file_uid == (uid_t)-1) + self->chopt |= OPT_NO_CHOWN; } void @@ -475,6 +488,8 @@ affile_dd_set_file_gid(LogDriver *s, con evt_tag_str("group", file_gid), NULL); } + if (self->file_gid == (gid_t)-1) + self->chopt |= OPT_NO_CHGRP; } void @@ -483,6 +498,8 @@ affile_dd_set_file_perm(LogDriver *s, mo AFFileDestDriver *self = (AFFileDestDriver *) s; self->file_perm = file_perm; + if (self->file_perm == (mode_t)-1) + self->chopt |= OPT_NO_CHMOD; } void @@ -840,6 +857,7 @@ affile_dd_new(gchar *filename, guint32 f self->super.super.free_fn = affile_dd_free; self->filename_template = log_template_new(NULL, filename); self->flags = flags; + self->chopt = 0; self->file_uid = self->file_gid = -1; self->file_perm = (mode_t) -1; self->dir_uid = self->dir_gid = -1; --- src/affile.h +++ src/affile.h 2008/08/19 11:20:12 @@ -53,6 +53,7 @@ typedef struct _AFFileDestDriver LogTemplate *filename_template; AFFileDestWriter *writer; guint32 flags; + guint32 chopt; uid_t file_uid; gid_t file_gid; mode_t file_perm;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor