[Ptt Update] 2015/02/24 水桶日期計算變更

作者: HWBA (╭☆微風★╯)   2015-03-12 23:14:01
作者: HWBA.bbs@ptt2.cc (╭☆微風★╯) 看板: weifeng
標題: [Ptt Update] 2015/02/24 水桶日期計算變更
時間: Tue Feb 24 23:22:21 2015
[修正內容]
  更新水桶日期過多,導致溢位,造成水桶失效或錯亂的問題。
  ❶ 原先為 uint32_t 儲存欄位,
    更新之後變為 uint64_t 儲存欄位。
  ❷ 小知識 by HWBA (2015.02.24)
    uint8_t 為 0~2^8-1 (0x00~0xFF)
    uint16_t 為 0~2^16-1 (0x0000~0xFFFF)
    uint32_t 為 0~2^32-1 (0x00000000~0xFFFFFFFF)
    uint64_t 為 0~2^64-1 (0x0000000000000000~0xFFFFFFFFFFFFFFFF)
    2^8=256=0x00
    2^16=(2^8)^2=65536
    2^32=(2^16)^2=4294967296
    2^64=(2^32)^2=18446744073709551616
[修正代碼]
static int
ui_ban_user_for_board(const char *uid, const char *board) {
time4_t expire = now;
int y, x;
int result;
char ans[3];
char history_log[PATHLEN];
char reason[STRLEN];
char datebuf[STRLEN];
setbfile(history_log, board, FN_BANNED_HISTORY);
getyx(&y, &x);
if ((expire = is_user_banned_by_board(uid, board))) {
vmsgf("使用者之前已被禁言,尚有 %d 天;詳情可用(S)或(L)查看",
(expire - now) / DAY_SECONDS+1);
return -1;
}
prints("將使用者 %s 加入看板 %s 的禁言名單。", uid, board);
move(y+3, 0);
syncnow();
outs("目前接受的格式是 [數字][單位]。 "
"單位有: 年(y), 月(m), 天(d)\n"
"範例: 3m (三個月), 120d (120天), 10y (10年)\n"
"注意不可混合輸入(例:沒有三個半月這種東西,請換算成天數)\n"
);
getdata(y+1, 0, "請以數字跟單位(預設為天)輸入期限: ",
datebuf, 8, DOECHO);
trim(datebuf);
if (!*datebuf) {
vmsg("未輸入期限,放棄。");
return -1;
} else {
int val = atoi(datebuf);
uint64_t long_now;
switch(tolower(datebuf[strlen(datebuf)-1])) {
case 'y':
val *= 365;
break;
case 'm':
val *= 30;
break;
case 'd':
default:
break;
}
if (val < 1) {
vmsg("日期格式輸入錯誤或是小於一天無法處理。");
return -1;
}
long_now = (uint64_t)now + val * (uint64_t)DAY_SECONDS;
expire = long_now;
if ((uint64_t)expire != long_now) {
vmsg("日期過大或無法處理,請重新輸入。");
return -1;
}
move(y+3, 0); clrtobot();
// sprintf(datebuf, "%s", Cdatelite(&expire));
sprintf(datebuf, "%d 天", val);
prints("期限將設定為 %s之後: %s\n",
datebuf, Cdatelite(&expire));
if (val > KEEP_DAYS_REGGED) {
mvprints(y+6, 0, ANSI_COLOR(1;31)
"注意: 超過 %d 天的設定有可能因為對方一直"
"未上站而導致帳號過期被重新註冊,\n"
" 此時同名的新帳號由於不一定是同一人所以"
"不會被禁言。\n" ANSI_RESET,
KEEP_DAYS_REGGED);
}
}

Links booklink

Contact Us: admin [ a t ] ucptt.com