| @@ -52,6 +52,15 @@ dump (const char *str, void *vp, size_t len) · 51 unmodified lines |
| 52 | 52 | #define IA64_FIRST_ROTATING_FR 32 |
| 53 | 53 | #define SIGN_EXT9 0xffffffffffffff00ul |
| 54 | 54 | |
| 55 | +/* |
| 56 | + * sysctl settable hook which tells the kernel whether to honor the |
| 57 | + * IA64_THREAD_UAC_NOPRINT prctl. Because this is user settable, we want |
| 58 | + * to allow the super user to enable/disable this for security reasons |
| 59 | + * (i.e. don't allow attacker to fill up logs with unaligned accesses). |
| 60 | + */ |
| 61 | +int no_unaligned_warning; |
| 62 | +static int noprint_warning; |
| 63 | + |
| 55 | 64 | /* |
| 56 | 65 | * For M-unit: |
| 57 | 66 | * |
| @@ -1324,8 +1333,9 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) · 1266 unmodified lines |
| 1324 | 1333 | if ((current->thread.flags & IA64_THREAD_UAC_SIGBUS) != 0) |
| 1325 | 1334 | goto force_sigbus; |
| 1326 | 1335 | |
| 1327 | | − if (!(current->thread.flags & IA64_THREAD_UAC_NOPRINT) |
| 1328 | | − && within_logging_rate_limit()) |
| 1336 | + if (!no_unaligned_warning && |
| 1337 | + !(current->thread.flags & IA64_THREAD_UAC_NOPRINT) && |
| 1338 | + within_logging_rate_limit()) |
| 1329 | 1339 | { |
| 1330 | 1340 | char buf[200]; /* comm[] is at most 16 bytes... */ |
| 1331 | 1341 | size_t len; |
| @@ -1340,7 +1350,22 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) · 8 unmodified lines |
| 1340 | 1350 | if (user_mode(regs)) |
| 1341 | 1351 | tty_write_message(current->signal->tty, buf); |
| 1342 | 1352 | buf[len-1] = '\0'; /* drop '\r' */ |
| 1343 | | − printk(KERN_WARNING "%s", buf); /* watch for command names containing %s */ |
| 1353 | + /* watch for command names containing %s */ |
| 1354 | + printk(KERN_WARNING "%s", buf); |
| 1355 | + } else { |
| 1356 | + if (no_unaligned_warning && !noprint_warning) { |
| 1357 | + noprint_warning = 1; |
| 1358 | + printk(KERN_WARNING "%s(%d) encountered an " |
| 1359 | + "unaligned exception which required\n" |
| 1360 | + "kernel assistance, which degrades " |
| 1361 | + "the performance of the application.\n" |
| 1362 | + "Unaligned exception warnings have " |
| 1363 | + "been disabled by the system " |
| 1364 | + "administrator\n" |
| 1365 | + "echo 0 > /proc/sys/kernel/ignore-" |
| 1366 | + "unaligned-usertrap to re-enable\n", |
| 1367 | + current->comm, current->pid); |
| 1368 | + } |
| 1344 | 1369 | } |
| 1345 | 1370 | } else { |
| 1346 | 1371 | if (within_logging_rate_limit()) |