Diff
checker
文本
文本
图像
文档
Excel
文件夹
Legal
Enterprise
桌面版
定价
登录
下载 Diffchecker 桌面版
比较文本
查找两个文本文件之间的差异
工具
历史
实时编辑器
折叠未更改行
关闭换行
视图
拆分
统一
比对精度
智能
单词
字符
语法高亮
选择语法
忽略
文本转换
转到第一个差异
编辑输入
Diffchecker Desktop
运行Diffchecker最安全的方式。获取Diffchecker桌面应用:您的差异永远不会离开您的电脑!
获取桌面版
Untitled diff
创建于
11年前
差异永不过期
清除
导出
分享
解释
10 删除
行
总计
删除
字符
总计
删除
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
372 行
全部复制
17 添加
行
总计
添加
字符
总计
添加
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
379 行
全部复制
/*
/*
* This file is part of John the Ripper password cracker,
* This file is part of John the Ripper password cracker,
* Copyright (c) 1996-2003,2006,2010,2013 by Solar Designer
* Copyright (c) 1996-2003,2006,2010,2013 by Solar Designer
*
*
* Redistribution and use in source and binary forms, with or without
* Redistribution and use in source and binary forms, with or without
* modification, are permitted.
* modification, are permitted.
*
*
* There's ABSOLUTELY NO WARRANTY, express or implied.
* There's ABSOLUTELY NO WARRANTY, express or implied.
*/
*/
#define _XOPEN_SOURCE 500 /* for setitimer(2) and siginterrupt(3) */
#define _XOPEN_SOURCE 500 /* for setitimer(2) and siginterrupt(3) */
#ifdef __ultrix__
#ifdef __ultrix__
#define __POSIX
#define __POSIX
#define _POSIX_SOURCE
#define _POSIX_SOURCE
#endif
#endif
#define NEED_OS_TIMER
#define NEED_OS_TIMER
#define NEED_OS_FORK
#define NEED_OS_FORK
#include "os.h"
#include "os.h"
#ifdef _SCO_C_DIALECT
#ifdef _SCO_C_DIALECT
#include <limits.h>
#include <limits.h>
#endif
#endif
#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <signal.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/time.h>
#include <errno.h>
#include <errno.h>
#ifdef __DJGPP__
#ifdef __DJGPP__
#include <dos.h>
#include <dos.h>
#endif
#endif
#ifdef __CYGWIN32__
#ifdef __CYGWIN32__
#include <windows.h>
#include <windows.h>
#endif
#endif
#include "arch.h"
#include "arch.h"
#include "misc.h"
#include "misc.h"
#include "params.h"
#include "params.h"
#include "tty.h"
#include "tty.h"
#include "options.h"
#include "options.h"
#include "config.h"
#include "config.h"
#include "bench.h"
#include "bench.h"
#include "john.h"
#include "john.h"
volatile int event_pending = 0;
volatile int event_pending = 0;
volatile int event_abort = 0, event_save = 0, event_status = 0;
volatile int event_abort = 0, event_save = 0, event_status = 0;
volatile int event_ticksafety = 0;
volatile int event_ticksafety = 0;
static int timer_save_interval, timer_save_value;
static int timer_save_interval, timer_save_value;
static clock_t timer_ticksafety_interval, timer_ticksafety_value;
static clock_t timer_ticksafety_interval, timer_ticksafety_value;
#if !OS_TIMER
#if !OS_TIMER
#include <time.h>
#include <time.h>
#include <sys/times.h>
#include <sys/times.h>
static clock_t timer_emu_interval = 0;
static clock_t timer_emu_interval = 0;
static unsigned int timer_emu_count = 0, timer_emu_max = 0;
static unsigned int timer_emu_count = 0, timer_emu_max = 0;
void sig_timer_emu_init(clock_t interval)
void sig_timer_emu_init(clock_t interval)
{
{
timer_emu_interval = interval;
timer_emu_interval = interval;
timer_emu_count = 0; timer_emu_max = 0;
timer_emu_count = 0; timer_emu_max = 0;
}
}
void sig_timer_emu_tick(void)
void sig_timer_emu_tick(void)
{
{
static clock_t last = 0;
static clock_t last = 0;
clock_t current;
clock_t current;
struct tms buf;
struct tms buf;
if (++timer_emu_count < timer_emu_max) return;
if (++timer_emu_count < timer_emu_max) return;
current = times(&buf);
current = times(&buf);
if (!last) {
if (!last) {
last = current;
last = current;
return;
return;
}
}
if (current - last < timer_emu_interval && current >= last) {
if (current - last < timer_emu_interval && current >= last) {
timer_emu_max += timer_emu_max + 1;
timer_emu_max += timer_emu_max + 1;
return;
return;
}
}
last = current;
last = current;
timer_emu_count = 0;
timer_emu_count = 0;
timer_emu_max >>= 1;
timer_emu_max >>= 1;
raise(SIGALRM);
raise(SIGALRM);
}
}
#endif
#endif
static void sig_install_update(void);
static void sig_install_update(void);
复制
已复制
复制
已复制
Text moved from lines 208-216
#if OS_FORK
static void signal_children(int signum)
{
int i;
for (i = 0; i < john_child_count; i++)
if (john_child_pids[i])
kill(john_child_pids[i], signum);
}
#endif
static void sig_handle_update(int signum)
static void sig_handle_update(int signum)
{
{
event_save = event_pending = 1;
event_save = event_pending = 1;
#ifndef SA_RESTART
#ifndef SA_RESTART
sig_install_update();
sig_install_update();
#endif
#endif
}
}
static void sig_install_update(void)
static void sig_install_update(void)
{
{
#ifdef SA_RESTART
#ifdef SA_RESTART
struct sigaction sa;
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
memset(&sa, 0, sizeof(sa));
sa.sa_handler = sig_handle_update;
sa.sa_handler = sig_handle_update;
sa.sa_flags = SA_RESTART;
sa.sa_flags = SA_RESTART;
sigaction(SIGHUP, &sa, NULL);
sigaction(SIGHUP, &sa, NULL);
#else
#else
signal(SIGHUP, sig_handle_update);
signal(SIGHUP, sig_handle_update);
#endif
#endif
}
}
static void sig_remove_update(void)
static void sig_remove_update(void)
{
{
signal(SIGHUP, SIG_IGN);
signal(SIGHUP, SIG_IGN);
}
}
void check_abort(int be_async_signal_safe)
void check_abort(int be_async_signal_safe)
{
{
if (!event_abort) return;
if (!event_abort) return;
tty_done();
tty_done();
if (be_async_signal_safe) {
if (be_async_signal_safe) {
if (john_main_process)
if (john_main_process)
write_loop(2, "Session aborted\n", 16);
write_loop(2, "Session aborted\n", 16);
_exit(1);
_exit(1);
}
}
if (john_main_process)
if (john_main_process)
fprintf(stderr, "Session aborted\n");
fprintf(stderr, "Session aborted\n");
error();
error();
}
}
static void sig_install_abort(void);
static void sig_install_abort(void);
static void sig_handle_abort(int signum)
static void sig_handle_abort(int signum)
{
{
int saved_errno = errno;
int saved_errno = errno;
check_abort(1);
check_abort(1);
复制
已复制
复制
已复制
#if OS_FORK
// Forward SIGINT,SIGTERM to children
if(john_main_process)
{
signal_children(signum);
}
#endif
event_abort = event_pending = 1;
event_abort = event_pending = 1;
write_loop(2, "Wait...\r", 8);
write_loop(2, "Wait...\r", 8);
sig_install_abort();
sig_install_abort();
errno = saved_errno;
errno = saved_errno;
}
}
#ifdef __CYGWIN32__
#ifdef __CYGWIN32__
static CALLBACK BOOL sig_handle_abort_ctrl(DWORD ctrltype)
static CALLBACK BOOL sig_handle_abort_ctrl(DWORD ctrltype)
{
{
sig_handle_abort(SIGINT);
sig_handle_abort(SIGINT);
return TRUE;
return TRUE;
}
}
#endif
#endif
static void sig_install_abort(void)
static void sig_install_abort(void)
{
{
#ifdef __DJGPP__
#ifdef __DJGPP__
setcbrk(1);
setcbrk(1);
#endif
#endif
#ifdef __CYGWIN32__
#ifdef __CYGWIN32__
SetConsoleCtrlHandler(sig_handle_abort_ctrl, TRUE);
SetConsoleCtrlHandler(sig_handle_abort_ctrl, TRUE);
#endif
#endif
signal(SIGINT, sig_handle_abort);
signal(SIGINT, sig_handle_abort);
signal(SIGTERM, sig_handle_abort);
signal(SIGTERM, sig_handle_abort);
#ifdef SIGXCPU
#ifdef SIGXCPU
signal(SIGXCPU, sig_handle_abort);
signal(SIGXCPU, sig_handle_abort);
#endif
#endif
#ifdef SIGXFSZ
#ifdef SIGXFSZ
signal(SIGXFSZ, sig_handle_abort);
signal(SIGXFSZ, sig_handle_abort);
#endif
#endif
}
}
static void sig_remove_abort(void)
static void sig_remove_abort(void)
{
{
#ifdef __CYGWIN32__
#ifdef __CYGWIN32__
SetConsoleCtrlHandler(sig_handle_abort_ctrl, FALSE);
SetConsoleCtrlHandler(sig_handle_abort_ctrl, FALSE);
#endif
#endif
signal(SIGINT, SIG_DFL);
signal(SIGINT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#ifdef SIGXCPU
#ifdef SIGXCPU
signal(SIGXCPU, SIG_DFL);
signal(SIGXCPU, SIG_DFL);
#endif
#endif
#ifdef SIGXFSZ
#ifdef SIGXFSZ
signal(SIGXFSZ, SIG_DFL);
signal(SIGXFSZ, SIG_DFL);
#endif
#endif
}
}
复制
已复制
复制
已复制
Text moved to lines 101-109
#if OS_FORK
static void signal_children(int signum)
{
int i;
for (i = 0; i < john_child_count; i++)
if (john_child_pids[i])
kill(john_child_pids[i], signum);
}
#endif
static void sig_install_timer(void);
static void sig_install_timer(void);
static void sig_handle_timer(int signum)
static void sig_handle_timer(int signum)
{
{
int saved_errno = errno;
int saved_errno = errno;
if (!--timer_save_value) {
if (!--timer_save_value) {
timer_save_value = timer_save_interval;
timer_save_value = timer_save_interval;
event_save = event_pending = 1;
event_save = event_pending = 1;
}
}
if (!--timer_ticksafety_value) {
if (!--timer_ticksafety_value) {
timer_ticksafety_value = timer_ticksafety_interval;
timer_ticksafety_value = timer_ticksafety_interval;
event_ticksafety = event_pending = 1;
event_ticksafety = event_pending = 1;
}
}
if (john_main_process) {
if (john_main_process) {
int c;
int c;
#if OS_FORK
#if OS_FORK
int new_abort = 0, new_status = 0;
int new_abort = 0, new_status = 0;
#endif
#endif
while ((c = tty_getchar()) >= 0) {
while ((c = tty_getchar()) >= 0) {
if (c == 3 || c == 'q') {
if (c == 3 || c == 'q') {
#if OS_FORK
#if OS_FORK
new_abort = 1;
new_abort = 1;
#endif
#endif
sig_handle_abort(0);
sig_handle_abort(0);
} else {
} else {
#if OS_FORK
#if OS_FORK
new_status = 1;
new_status = 1;
#endif
#endif
event_status = event_pending = 1;
event_status = event_pending = 1;
}
}
}
}
#if OS_FORK
#if OS_FORK
if (new_abort || new_status)
if (new_abort || new_status)
signal_children(new_abort ? SIGTERM : SIGUSR2);
signal_children(new_abort ? SIGTERM : SIGUSR2);
#endif
#endif
}
}
#if !OS_TIMER
#if !OS_TIMER
signal(SIGALRM, sig_handle_timer);
signal(SIGALRM, sig_handle_timer);
#elif !defined(SA_RESTART) && !defined(__DJGPP__)
#elif !defined(SA_RESTART) && !defined(__DJGPP__)
sig_install_timer();
sig_install_timer();
#endif
#endif
errno = saved_errno;
errno = saved_errno;
}
}
#if OS_TIMER
#if OS_TIMER
static void sig_init_timer(void)
static void sig_init_timer(void)
{
{
struct itimerval it;
struct itimerval it;
it.it_value.tv_sec = TIMER_INTERVAL;
it.it_value.tv_sec = TIMER_INTERVAL;
it.it_value.tv_usec = 0;
it.it_value.tv_usec = 0;
#if defined(SA_RESTART) || defined(__DJGPP__)
#if defined(SA_RESTART) || defined(__DJGPP__)
it.it_interval = it.it_value;
it.it_interval = it.it_value;
#else
#else
memset(&it.it_interval, 0, sizeof(it.it_interval));
memset(&it.it_interval, 0, sizeof(it.it_interval));
#endif
#endif
if (setitimer(ITIMER_REAL, &it, NULL))
if (setitimer(ITIMER_REAL, &it, NULL))
pexit("setitimer");
pexit("setitimer");
}
}
#endif
#endif
static void sig_install_timer(void)
static void sig_install_timer(void)
{
{
#if !OS_TIMER
#if !OS_TIMER
signal(SIGALRM, sig_handle_timer);
signal(SIGALRM, sig_handle_timer);
sig_timer_emu_init(TIMER_INTERVAL * clk_tck);
sig_timer_emu_init(TIMER_INTERVAL * clk_tck);
#else
#else
struct sigaction sa;
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
memset(&sa, 0, sizeof(sa));
sa.sa_handler = sig_handle_timer;
sa.sa_handler = sig_handle_timer;
#ifdef SA_RESTART
#ifdef SA_RESTART
sa.sa_flags = SA_RESTART;
sa.sa_flags = SA_RESTART;
#endif
#endif
sigaction(SIGALRM, &sa, NULL);
sigaction(SIGALRM, &sa, NULL);
#if !defined(SA_RESTART) && !defined(__DJGPP__)
#if !defined(SA_RESTART) && !defined(__DJGPP__)
siginterrupt(SIGALRM, 0);
siginterrupt(SIGALRM, 0);
#endif
#endif
sig_init_timer();
sig_init_timer();
#endif
#endif
}
}
static void sig_remove_timer(void)
static void sig_remove_timer(void)
{
{
#if OS_TIMER
#if OS_TIMER
struct itimerval it;
struct itimerval it;
memset(&it, 0, sizeof(it));
memset(&it, 0, sizeof(it));
if (setitimer(ITIMER_REAL, &it, NULL)) perror("setitimer");
if (setitimer(ITIMER_REAL, &it, NULL)) perror("setitimer");
#endif
#endif
signal(SIGALRM, SIG_DFL);
signal(SIGALRM, SIG_DFL);
}
}
#if OS_FORK
#if OS_FORK
static void sig_handle_status(int signum)
static void sig_handle_status(int signum)
{
{
event_status = event_pending = 1;
event_status = event_pending = 1;
signal(SIGUSR2, sig_handle_status);
signal(SIGUSR2, sig_handle_status);
}
}
#endif
#endif
static void sig_done(void);
static void sig_done(void);
void sig_init(void)
void sig_init(void)
{
{
clk_tck_init();
clk_tck_init();
timer_save_interval = cfg_get_int(SECTION_OPTIONS, NULL, "Save");
timer_save_interval = cfg_get_int(SECTION_OPTIONS, NULL, "Save");
if (timer_save_interval < 0)
if (timer_save_interval < 0)
timer_save_interval = TIMER_SAVE_DELAY;
timer_save_interval = TIMER_SAVE_DELAY;
else
else
if ((timer_save_interval /= TIMER_INTERVAL) <= 0)
if ((timer_save_interval /= TIMER_INTERVAL) <= 0)
timer_save_interval = 1;
timer_save_interval = 1;
timer_save_value = timer_save_interval;
timer_save_value = timer_save_interval;
timer_ticksafety_interval = (clock_t)1 << (sizeof(clock_t) * 8 - 4);
timer_ticksafety_interval = (clock_t)1 << (sizeof(clock_t) * 8 - 4);
timer_ticksafety_interval /= clk_tck;
timer_ticksafety_interval /= clk_tck;
if ((timer_ticksafety_interval /= TIMER_INTERVAL) <= 0)
if ((timer_ticksafety_interval /= TIMER_INTERVAL) <= 0)
timer_ticksafety_interval = 1;
timer_ticksafety_interval = 1;
timer_ticksafety_value = timer_ticksafety_interval;
timer_ticksafety_value = timer_ticksafety_interval;
atexit(sig_done);
atexit(sig_done);
sig_install_update();
sig_install_update();
sig_install_abort();
sig_install_abort();
sig_install_timer();
sig_install_timer();
#if OS_FORK
#if OS_FORK
signal(SIGUSR2, sig_handle_status);
signal(SIGUSR2, sig_handle_status);
#endif
#endif
}
}
void sig_init_child(void)
void sig_init_child(void)
{
{
#if OS_TIMER
#if OS_TIMER
sig_init_timer();
sig_init_timer();
#endif
#endif
}
}
static void sig_done(void)
static void sig_done(void)
{
{
sig_remove_update();
sig_remove_update();
sig_remove_abort();
sig_remove_abort();
sig_remove_timer();
sig_remove_timer();
}
}
已保存差异
原始文本
打开文件
/* * This file is part of John the Ripper password cracker, * Copyright (c) 1996-2003,2006,2010,2013 by Solar Designer * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. */ #define _XOPEN_SOURCE 500 /* for setitimer(2) and siginterrupt(3) */ #ifdef __ultrix__ #define __POSIX #define _POSIX_SOURCE #endif #define NEED_OS_TIMER #define NEED_OS_FORK #include "os.h" #ifdef _SCO_C_DIALECT #include <limits.h> #endif #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <sys/time.h> #include <errno.h> #ifdef __DJGPP__ #include <dos.h> #endif #ifdef __CYGWIN32__ #include <windows.h> #endif #include "arch.h" #include "misc.h" #include "params.h" #include "tty.h" #include "options.h" #include "config.h" #include "bench.h" #include "john.h" volatile int event_pending = 0; volatile int event_abort = 0, event_save = 0, event_status = 0; volatile int event_ticksafety = 0; static int timer_save_interval, timer_save_value; static clock_t timer_ticksafety_interval, timer_ticksafety_value; #if !OS_TIMER #include <time.h> #include <sys/times.h> static clock_t timer_emu_interval = 0; static unsigned int timer_emu_count = 0, timer_emu_max = 0; void sig_timer_emu_init(clock_t interval) { timer_emu_interval = interval; timer_emu_count = 0; timer_emu_max = 0; } void sig_timer_emu_tick(void) { static clock_t last = 0; clock_t current; struct tms buf; if (++timer_emu_count < timer_emu_max) return; current = times(&buf); if (!last) { last = current; return; } if (current - last < timer_emu_interval && current >= last) { timer_emu_max += timer_emu_max + 1; return; } last = current; timer_emu_count = 0; timer_emu_max >>= 1; raise(SIGALRM); } #endif static void sig_install_update(void); static void sig_handle_update(int signum) { event_save = event_pending = 1; #ifndef SA_RESTART sig_install_update(); #endif } static void sig_install_update(void) { #ifdef SA_RESTART struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_handle_update; sa.sa_flags = SA_RESTART; sigaction(SIGHUP, &sa, NULL); #else signal(SIGHUP, sig_handle_update); #endif } static void sig_remove_update(void) { signal(SIGHUP, SIG_IGN); } void check_abort(int be_async_signal_safe) { if (!event_abort) return; tty_done(); if (be_async_signal_safe) { if (john_main_process) write_loop(2, "Session aborted\n", 16); _exit(1); } if (john_main_process) fprintf(stderr, "Session aborted\n"); error(); } static void sig_install_abort(void); static void sig_handle_abort(int signum) { int saved_errno = errno; check_abort(1); event_abort = event_pending = 1; write_loop(2, "Wait...\r", 8); sig_install_abort(); errno = saved_errno; } #ifdef __CYGWIN32__ static CALLBACK BOOL sig_handle_abort_ctrl(DWORD ctrltype) { sig_handle_abort(SIGINT); return TRUE; } #endif static void sig_install_abort(void) { #ifdef __DJGPP__ setcbrk(1); #endif #ifdef __CYGWIN32__ SetConsoleCtrlHandler(sig_handle_abort_ctrl, TRUE); #endif signal(SIGINT, sig_handle_abort); signal(SIGTERM, sig_handle_abort); #ifdef SIGXCPU signal(SIGXCPU, sig_handle_abort); #endif #ifdef SIGXFSZ signal(SIGXFSZ, sig_handle_abort); #endif } static void sig_remove_abort(void) { #ifdef __CYGWIN32__ SetConsoleCtrlHandler(sig_handle_abort_ctrl, FALSE); #endif signal(SIGINT, SIG_DFL); signal(SIGTERM, SIG_DFL); #ifdef SIGXCPU signal(SIGXCPU, SIG_DFL); #endif #ifdef SIGXFSZ signal(SIGXFSZ, SIG_DFL); #endif } #if OS_FORK static void signal_children(int signum) { int i; for (i = 0; i < john_child_count; i++) if (john_child_pids[i]) kill(john_child_pids[i], signum); } #endif static void sig_install_timer(void); static void sig_handle_timer(int signum) { int saved_errno = errno; if (!--timer_save_value) { timer_save_value = timer_save_interval; event_save = event_pending = 1; } if (!--timer_ticksafety_value) { timer_ticksafety_value = timer_ticksafety_interval; event_ticksafety = event_pending = 1; } if (john_main_process) { int c; #if OS_FORK int new_abort = 0, new_status = 0; #endif while ((c = tty_getchar()) >= 0) { if (c == 3 || c == 'q') { #if OS_FORK new_abort = 1; #endif sig_handle_abort(0); } else { #if OS_FORK new_status = 1; #endif event_status = event_pending = 1; } } #if OS_FORK if (new_abort || new_status) signal_children(new_abort ? SIGTERM : SIGUSR2); #endif } #if !OS_TIMER signal(SIGALRM, sig_handle_timer); #elif !defined(SA_RESTART) && !defined(__DJGPP__) sig_install_timer(); #endif errno = saved_errno; } #if OS_TIMER static void sig_init_timer(void) { struct itimerval it; it.it_value.tv_sec = TIMER_INTERVAL; it.it_value.tv_usec = 0; #if defined(SA_RESTART) || defined(__DJGPP__) it.it_interval = it.it_value; #else memset(&it.it_interval, 0, sizeof(it.it_interval)); #endif if (setitimer(ITIMER_REAL, &it, NULL)) pexit("setitimer"); } #endif static void sig_install_timer(void) { #if !OS_TIMER signal(SIGALRM, sig_handle_timer); sig_timer_emu_init(TIMER_INTERVAL * clk_tck); #else struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_handle_timer; #ifdef SA_RESTART sa.sa_flags = SA_RESTART; #endif sigaction(SIGALRM, &sa, NULL); #if !defined(SA_RESTART) && !defined(__DJGPP__) siginterrupt(SIGALRM, 0); #endif sig_init_timer(); #endif } static void sig_remove_timer(void) { #if OS_TIMER struct itimerval it; memset(&it, 0, sizeof(it)); if (setitimer(ITIMER_REAL, &it, NULL)) perror("setitimer"); #endif signal(SIGALRM, SIG_DFL); } #if OS_FORK static void sig_handle_status(int signum) { event_status = event_pending = 1; signal(SIGUSR2, sig_handle_status); } #endif static void sig_done(void); void sig_init(void) { clk_tck_init(); timer_save_interval = cfg_get_int(SECTION_OPTIONS, NULL, "Save"); if (timer_save_interval < 0) timer_save_interval = TIMER_SAVE_DELAY; else if ((timer_save_interval /= TIMER_INTERVAL) <= 0) timer_save_interval = 1; timer_save_value = timer_save_interval; timer_ticksafety_interval = (clock_t)1 << (sizeof(clock_t) * 8 - 4); timer_ticksafety_interval /= clk_tck; if ((timer_ticksafety_interval /= TIMER_INTERVAL) <= 0) timer_ticksafety_interval = 1; timer_ticksafety_value = timer_ticksafety_interval; atexit(sig_done); sig_install_update(); sig_install_abort(); sig_install_timer(); #if OS_FORK signal(SIGUSR2, sig_handle_status); #endif } void sig_init_child(void) { #if OS_TIMER sig_init_timer(); #endif } static void sig_done(void) { sig_remove_update(); sig_remove_abort(); sig_remove_timer(); }
更改后文本
打开文件
/* * This file is part of John the Ripper password cracker, * Copyright (c) 1996-2003,2006,2010,2013 by Solar Designer * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. */ #define _XOPEN_SOURCE 500 /* for setitimer(2) and siginterrupt(3) */ #ifdef __ultrix__ #define __POSIX #define _POSIX_SOURCE #endif #define NEED_OS_TIMER #define NEED_OS_FORK #include "os.h" #ifdef _SCO_C_DIALECT #include <limits.h> #endif #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <sys/time.h> #include <errno.h> #ifdef __DJGPP__ #include <dos.h> #endif #ifdef __CYGWIN32__ #include <windows.h> #endif #include "arch.h" #include "misc.h" #include "params.h" #include "tty.h" #include "options.h" #include "config.h" #include "bench.h" #include "john.h" volatile int event_pending = 0; volatile int event_abort = 0, event_save = 0, event_status = 0; volatile int event_ticksafety = 0; static int timer_save_interval, timer_save_value; static clock_t timer_ticksafety_interval, timer_ticksafety_value; #if !OS_TIMER #include <time.h> #include <sys/times.h> static clock_t timer_emu_interval = 0; static unsigned int timer_emu_count = 0, timer_emu_max = 0; void sig_timer_emu_init(clock_t interval) { timer_emu_interval = interval; timer_emu_count = 0; timer_emu_max = 0; } void sig_timer_emu_tick(void) { static clock_t last = 0; clock_t current; struct tms buf; if (++timer_emu_count < timer_emu_max) return; current = times(&buf); if (!last) { last = current; return; } if (current - last < timer_emu_interval && current >= last) { timer_emu_max += timer_emu_max + 1; return; } last = current; timer_emu_count = 0; timer_emu_max >>= 1; raise(SIGALRM); } #endif static void sig_install_update(void); #if OS_FORK static void signal_children(int signum) { int i; for (i = 0; i < john_child_count; i++) if (john_child_pids[i]) kill(john_child_pids[i], signum); } #endif static void sig_handle_update(int signum) { event_save = event_pending = 1; #ifndef SA_RESTART sig_install_update(); #endif } static void sig_install_update(void) { #ifdef SA_RESTART struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_handle_update; sa.sa_flags = SA_RESTART; sigaction(SIGHUP, &sa, NULL); #else signal(SIGHUP, sig_handle_update); #endif } static void sig_remove_update(void) { signal(SIGHUP, SIG_IGN); } void check_abort(int be_async_signal_safe) { if (!event_abort) return; tty_done(); if (be_async_signal_safe) { if (john_main_process) write_loop(2, "Session aborted\n", 16); _exit(1); } if (john_main_process) fprintf(stderr, "Session aborted\n"); error(); } static void sig_install_abort(void); static void sig_handle_abort(int signum) { int saved_errno = errno; check_abort(1); #if OS_FORK // Forward SIGINT,SIGTERM to children if(john_main_process) { signal_children(signum); } #endif event_abort = event_pending = 1; write_loop(2, "Wait...\r", 8); sig_install_abort(); errno = saved_errno; } #ifdef __CYGWIN32__ static CALLBACK BOOL sig_handle_abort_ctrl(DWORD ctrltype) { sig_handle_abort(SIGINT); return TRUE; } #endif static void sig_install_abort(void) { #ifdef __DJGPP__ setcbrk(1); #endif #ifdef __CYGWIN32__ SetConsoleCtrlHandler(sig_handle_abort_ctrl, TRUE); #endif signal(SIGINT, sig_handle_abort); signal(SIGTERM, sig_handle_abort); #ifdef SIGXCPU signal(SIGXCPU, sig_handle_abort); #endif #ifdef SIGXFSZ signal(SIGXFSZ, sig_handle_abort); #endif } static void sig_remove_abort(void) { #ifdef __CYGWIN32__ SetConsoleCtrlHandler(sig_handle_abort_ctrl, FALSE); #endif signal(SIGINT, SIG_DFL); signal(SIGTERM, SIG_DFL); #ifdef SIGXCPU signal(SIGXCPU, SIG_DFL); #endif #ifdef SIGXFSZ signal(SIGXFSZ, SIG_DFL); #endif } static void sig_install_timer(void); static void sig_handle_timer(int signum) { int saved_errno = errno; if (!--timer_save_value) { timer_save_value = timer_save_interval; event_save = event_pending = 1; } if (!--timer_ticksafety_value) { timer_ticksafety_value = timer_ticksafety_interval; event_ticksafety = event_pending = 1; } if (john_main_process) { int c; #if OS_FORK int new_abort = 0, new_status = 0; #endif while ((c = tty_getchar()) >= 0) { if (c == 3 || c == 'q') { #if OS_FORK new_abort = 1; #endif sig_handle_abort(0); } else { #if OS_FORK new_status = 1; #endif event_status = event_pending = 1; } } #if OS_FORK if (new_abort || new_status) signal_children(new_abort ? SIGTERM : SIGUSR2); #endif } #if !OS_TIMER signal(SIGALRM, sig_handle_timer); #elif !defined(SA_RESTART) && !defined(__DJGPP__) sig_install_timer(); #endif errno = saved_errno; } #if OS_TIMER static void sig_init_timer(void) { struct itimerval it; it.it_value.tv_sec = TIMER_INTERVAL; it.it_value.tv_usec = 0; #if defined(SA_RESTART) || defined(__DJGPP__) it.it_interval = it.it_value; #else memset(&it.it_interval, 0, sizeof(it.it_interval)); #endif if (setitimer(ITIMER_REAL, &it, NULL)) pexit("setitimer"); } #endif static void sig_install_timer(void) { #if !OS_TIMER signal(SIGALRM, sig_handle_timer); sig_timer_emu_init(TIMER_INTERVAL * clk_tck); #else struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_handle_timer; #ifdef SA_RESTART sa.sa_flags = SA_RESTART; #endif sigaction(SIGALRM, &sa, NULL); #if !defined(SA_RESTART) && !defined(__DJGPP__) siginterrupt(SIGALRM, 0); #endif sig_init_timer(); #endif } static void sig_remove_timer(void) { #if OS_TIMER struct itimerval it; memset(&it, 0, sizeof(it)); if (setitimer(ITIMER_REAL, &it, NULL)) perror("setitimer"); #endif signal(SIGALRM, SIG_DFL); } #if OS_FORK static void sig_handle_status(int signum) { event_status = event_pending = 1; signal(SIGUSR2, sig_handle_status); } #endif static void sig_done(void); void sig_init(void) { clk_tck_init(); timer_save_interval = cfg_get_int(SECTION_OPTIONS, NULL, "Save"); if (timer_save_interval < 0) timer_save_interval = TIMER_SAVE_DELAY; else if ((timer_save_interval /= TIMER_INTERVAL) <= 0) timer_save_interval = 1; timer_save_value = timer_save_interval; timer_ticksafety_interval = (clock_t)1 << (sizeof(clock_t) * 8 - 4); timer_ticksafety_interval /= clk_tck; if ((timer_ticksafety_interval /= TIMER_INTERVAL) <= 0) timer_ticksafety_interval = 1; timer_ticksafety_value = timer_ticksafety_interval; atexit(sig_done); sig_install_update(); sig_install_abort(); sig_install_timer(); #if OS_FORK signal(SIGUSR2, sig_handle_status); #endif } void sig_init_child(void) { #if OS_TIMER sig_init_timer(); #endif } static void sig_done(void) { sig_remove_update(); sig_remove_abort(); sig_remove_timer(); }
查找差异