diff options
Diffstat (limited to 'kernel/auditsc.c')
| -rw-r--r-- | kernel/auditsc.c | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index ae40ac8c39e7..b939ed2da3ee 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
| @@ -1199,14 +1199,18 @@ void audit_putname(const char *name) | |||
| 1199 | #endif | 1199 | #endif |
| 1200 | } | 1200 | } |
| 1201 | 1201 | ||
| 1202 | static void audit_inode_context(int idx, const struct inode *inode) | 1202 | /* Copy inode data into an audit_names. */ |
| 1203 | static void audit_copy_inode(struct audit_names *name, const struct inode *inode) | ||
| 1203 | { | 1204 | { |
| 1204 | struct audit_context *context = current->audit_context; | 1205 | name->ino = inode->i_ino; |
| 1205 | 1206 | name->dev = inode->i_sb->s_dev; | |
| 1206 | selinux_get_inode_sid(inode, &context->names[idx].osid); | 1207 | name->mode = inode->i_mode; |
| 1208 | name->uid = inode->i_uid; | ||
| 1209 | name->gid = inode->i_gid; | ||
| 1210 | name->rdev = inode->i_rdev; | ||
| 1211 | selinux_get_inode_sid(inode, &name->osid); | ||
| 1207 | } | 1212 | } |
| 1208 | 1213 | ||
| 1209 | |||
| 1210 | /** | 1214 | /** |
| 1211 | * audit_inode - store the inode and device from a lookup | 1215 | * audit_inode - store the inode and device from a lookup |
| 1212 | * @name: name being audited | 1216 | * @name: name being audited |
| @@ -1240,13 +1244,7 @@ void __audit_inode(const char *name, const struct inode *inode) | |||
| 1240 | ++context->ino_count; | 1244 | ++context->ino_count; |
| 1241 | #endif | 1245 | #endif |
| 1242 | } | 1246 | } |
| 1243 | context->names[idx].ino = inode->i_ino; | 1247 | audit_copy_inode(&context->names[idx], inode); |
| 1244 | context->names[idx].dev = inode->i_sb->s_dev; | ||
| 1245 | context->names[idx].mode = inode->i_mode; | ||
| 1246 | context->names[idx].uid = inode->i_uid; | ||
| 1247 | context->names[idx].gid = inode->i_gid; | ||
| 1248 | context->names[idx].rdev = inode->i_rdev; | ||
| 1249 | audit_inode_context(idx, inode); | ||
| 1250 | } | 1248 | } |
| 1251 | 1249 | ||
| 1252 | /** | 1250 | /** |
| @@ -1302,16 +1300,37 @@ update_context: | |||
| 1302 | context->names[idx].name_len = AUDIT_NAME_FULL; | 1300 | context->names[idx].name_len = AUDIT_NAME_FULL; |
| 1303 | context->names[idx].name_put = 0; /* don't call __putname() */ | 1301 | context->names[idx].name_put = 0; /* don't call __putname() */ |
| 1304 | 1302 | ||
| 1305 | if (inode) { | 1303 | if (!inode) |
| 1306 | context->names[idx].ino = inode->i_ino; | 1304 | context->names[idx].ino = (unsigned long)-1; |
| 1307 | context->names[idx].dev = inode->i_sb->s_dev; | 1305 | else |
| 1308 | context->names[idx].mode = inode->i_mode; | 1306 | audit_copy_inode(&context->names[idx], inode); |
| 1309 | context->names[idx].uid = inode->i_uid; | 1307 | } |
| 1310 | context->names[idx].gid = inode->i_gid; | 1308 | |
| 1311 | context->names[idx].rdev = inode->i_rdev; | 1309 | /** |
| 1312 | audit_inode_context(idx, inode); | 1310 | * audit_inode_update - update inode info for last collected name |
| 1313 | } else | 1311 | * @inode: inode being audited |
| 1314 | context->names[idx].ino = (unsigned long)-1; | 1312 | * |
| 1313 | * When open() is called on an existing object with the O_CREAT flag, the inode | ||
| 1314 | * data audit initially collects is incorrect. This additional hook ensures | ||
| 1315 | * audit has the inode data for the actual object to be opened. | ||
| 1316 | */ | ||
| 1317 | void __audit_inode_update(const struct inode *inode) | ||
| 1318 | { | ||
| 1319 | struct audit_context *context = current->audit_context; | ||
| 1320 | int idx; | ||
| 1321 | |||
| 1322 | if (!context->in_syscall || !inode) | ||
| 1323 | return; | ||
| 1324 | |||
| 1325 | if (context->name_count == 0) { | ||
| 1326 | context->name_count++; | ||
| 1327 | #if AUDIT_DEBUG | ||
| 1328 | context->ino_count++; | ||
| 1329 | #endif | ||
| 1330 | } | ||
| 1331 | idx = context->name_count - 1; | ||
| 1332 | |||
| 1333 | audit_copy_inode(&context->names[idx], inode); | ||
| 1315 | } | 1334 | } |
| 1316 | 1335 | ||
| 1317 | /** | 1336 | /** |
