void sig_segv(int sig) { server->error++; server->sigsegv++; #ifdef PRE_FORK (server->childs)[my_num].status = S_SIGSEGV; (server->childs)[my_num].pid = 0x00; #endif #ifdef WEB_ERROR_LOG #if 1 request_rec->atime = time(0); #endif if (request_rec->mark1 != 0x55 || request_rec->mark2 != 0xaa) { fprintf(stderr, "ERR=\"Caught SIGSEGV\" request_rec data error!"); weblog_line(server->error_log, "ERR=\"Caught SIGSEGV\" request_rec data error!"); } else { fprintf(stderr, "ERR=\"Caught SIGSEGV\" REQ=\"%s %s\" UA=\"%s\"", request_rec->request_method, request_rec->URI, request_rec->user_agent); weblog_line(server->error_log, "ERR=\"Caught SIGSEGV\" REQ=\"%s %s\" UA=\"%s\"", request_rec->request_method, request_rec->URI, request_rec->user_agent); } fflush(server->error_log); #endif exit(11); /* SIGSEGV 11 Core Segmentation Fault */ }
void sig_segv(int sig) { server->error++; server->sigsegv++; #ifdef PRE_FORK (server->childs)[my_num].status = S_SIGSEGV; (server->childs)[my_num].pid = 0x00; #endif #ifdef WEB_ERROR_LOG { char log[HTTP_REQUEST_LINE_BUF]; if(request_rec->mark1 != 0x55 || request_rec->mark2 != 0xaa) sprintf(log, "ERR=\"Caught SIGSEGV\" request_rec data error!"); else sprintf(log, "ERR=\"Caught SIGSEGV\" REQ=\"%s %s\" UA=\"%s\"", request_rec->request_method, request_rec->URI, request_rec->user_agent); fprintf(stderr, "%s", log); weblog_line(log, server->error_log, request_rec->fromhost, time(0)); fflush(server->error_log); } #endif exit(11); /* SIGSEGV 11 Core Segmentation Fault */ }
/******************************************************************* * 檢查首頁 HTML_Announce 登入密碼正確與否 * * *******************************************************************/ int WebLoginCheck() { if (strstr(skin_file->filename, HTML_Announce)) { if (PSCorrect == Correct) { UpdateUserRec(request_rec->URLParaType, &curuser, NULL); #ifdef WEB_EVENT_LOG weblog_line(server->access_log, "LOGIN ID=\"%s\" UA=\"%s\"", curuser.userid, request_rec->user_agent); #endif } else if (strcmp(username, "guest") && strlen(username) != 0 && PSCorrect != Correct) return WEB_INVALID_PASSWORD; } return WEB_OK; }
/******************************************************************* * reaper - clean up zombie children *******************************************************************/ void reaper(int sig) { pid_t cpid; #if defined(SOLARIS) || defined(AIX) || defined(LINUX) int status; #else union wait status; #endif /* SOLARIS */ while ((cpid = wait3(&status, WNOHANG, (struct rusage *) 0)) > 0) { #ifdef PRE_FORK int i; #endif server->child++; #ifdef PRE_FORK for (i = 0; i < server->max_child; i++) { if ((server->childs)[i].pid == cpid) { (server->childs)[i].pid = 0x00; (server->childs)[i].status = S_ERROR; server->error++; #ifdef WEB_ERROR_LOG #if 1 request_rec->atime = time(0); xstrncpy(request_rec->fromhost, "127.0.0.1", HOSTLEN); #endif weblog_line(server->error_log, "ERR=\"Child unexpected return, pid=%d, status=%d (%s)\"", (int) cpid, (int) status, strsignal(status)); fflush(server->error_log); #endif } } #endif } (void) signal(SIGCHLD, reaper); /* 再度啟動 signal 接收 */ }
void sig_pipe(int sig) { server->error++; server->sigpipe++; #ifdef PRE_FORK (server->childs)[my_num].status = S_SIGPIPE; #if 0 (server->childs)[my_num].pid = 0x00; #endif shutdown(0, 2); #endif #ifdef WEB_ERROR_LOG weblog_line(server->error_log, "ERR=\"%s\" REQ=\"%s %s\" UA=\"%s\"", "Caught SIGPIPE", request_rec->request_method, request_rec->URI, request_rec->user_agent); fflush(server->error_log); #endif #ifdef PRE_FORK siglongjmp(env, 1); #else _exit(13); /* SIGPIPE 13 Exit Broken Pipe */ #endif }
/******************************************************************* * 根據 URLParaType 執行 POST 的要求 * * return HttpRespondType *******************************************************************/ int DoPostRequest(REQUEST_REC * r, BOARDHEADER * board, POST_FILE * pf) { int result, URLParaType; char *form_data, *boardname; result = WEB_ERROR; URLParaType = r->URLParaType; boardname = board->filename; /* Get FORM data */ if ((form_data = GetFormBody(r->content_length, WEBBBS_ERROR_MESSAGE)) == NULL) return WEB_ERROR; #ifdef DEBUG weblog_line(server->debug_log, form_data); fflush(server->debug_log); #endif if (PSCorrect == nLogin && URLParaType == PostSend) { /* PostSend allow username&password in form body without login */ char pass[PASSLEN * 3]; GetPara2(username, "Name", form_data, IDLEN, ""); /* get userdata from form */ GetPara2(pass, "Password", form_data, PASSLEN * 3, ""); Convert(pass, password); PSCorrect = CheckUserPassword(username, password); } if (URLParaType == PostSend || URLParaType == TreaSend || URLParaType == PostEdit || URLParaType == TreaEdit || URLParaType == PostForward || URLParaType == TreaForward || URLParaType == PostDelete || URLParaType == TreaDelete || URLParaType == SkinModify || URLParaType == AccessListModify ) { int perm; /* boardname should set in advance, now in ParseURI() */ if (get_board(board, boardname) <= 0 || board->filename[0] == '\0') return WEB_BOARD_NOT_FOUND; if ((perm = CheckBoardPerm(board, &curuser)) != WEB_OK) return perm; } if (PSCorrect == Correct || (PSCorrect == gLogin && (URLParaType == PostSend || URLParaType == TreaSend)) || URLParaType == UserNew) { int start, end; char path[PATHLEN]; switch (URLParaType) { case PostSend: case TreaSend: if ((result = PostArticle(form_data, board, pf))) { #if 1 if (URLParaType == TreaSend) { if (strlen(pf->POST_NAME)) sprintf(skin_file->filename, "/%streasure/%s/%s/$", BBS_SUBDIR, boardname, pf->POST_NAME); else sprintf(skin_file->filename, "/%streasure/%s/$", BBS_SUBDIR, boardname); } else { sprintf(skin_file->filename, "/%sboards/%s/", BBS_SUBDIR, boardname); } #endif if (PSCorrect == Correct) UpdateUserRec(URLParaType, &curuser, board); } break; case MailSend: if ((result = PostArticle(form_data, board, pf))) { sprintf(skin_file->filename, "/%smail/", BBS_SUBDIR); UpdateUserRec(URLParaType, &curuser, NULL); } break; case PostEdit: case TreaEdit: if ((result = EditArticle(form_data, board, pf))) { sprintf(skin_file->filename, "/%s%s.html", BBS_SUBDIR, pf->POST_NAME); } break; case PostForward: case TreaForward: case MailForward: if ((result = ForwardArticle(form_data, board, pf))) { find_list_range(&start, &end, pf->num, DEFAULT_PAGE_SIZE, pf->total_rec); setdotfile(path, pf->POST_NAME, NULL); sprintf(skin_file->filename, "/%s%s%d-%d", BBS_SUBDIR, path, start, end); } break; case PostDelete: case TreaDelete: case MailDelete: if ((result = DeleteArticle(form_data, board, pf))) { if (URLParaType == PostDelete) { find_list_range(&start, &end, pf->num, DEFAULT_PAGE_SIZE, pf->total_rec); sprintf(skin_file->filename, "/%sboards/%s/%d-%d", BBS_SUBDIR, boardname, start, end); } else if (URLParaType == TreaDelete) { setdotfile(path, pf->POST_NAME, NULL); sprintf(skin_file->filename, "/%s%s", BBS_SUBDIR, path); } else /* MailDelete */ { sprintf(skin_file->filename, "/%smail/", BBS_SUBDIR); } } break; case UserNew: if ((result = NewUser(form_data, &curuser))) sprintf(skin_file->filename, "%s%s%s", HTML_PATH, BBS_SUBDIR, HTML_UserNewOK); break; case UserIdent: if ((result = DoUserIdent(form_data, &curuser))) sprintf(skin_file->filename, "%s%s%s", HTML_PATH, BBS_SUBDIR, HTML_UserIdentOK); break; case UserData: if ((result = UpdateUserData(form_data, &curuser))) sprintf(skin_file->filename, "/%susers/%s", BBS_SUBDIR, HTML_UserData); break; case UserPlan: if ((result = UpdateUserPlan(form_data, &curuser))) sprintf(skin_file->filename, "/%susers/%s", BBS_SUBDIR, HTML_UserPlan); break; case UserSign: if ((result = UpdateUserSign(form_data, &curuser))) sprintf(skin_file->filename, "/%susers/%s", BBS_SUBDIR, HTML_UserSign); break; case UserFriend: if ((result = UpdateUserFriend(form_data, &curuser))) sprintf(skin_file->filename, "/%susers/%s", BBS_SUBDIR, HTML_UserFriend); break; #ifdef WEB_ADMIN case BoardModify: /* admin function */ if (!HAS_PERM(PERM_SYSOP) #ifdef NSYSUBBS || !strstr(request_rec->fromhost, "140.17.12.") #endif ) { sprintf(WEBBBS_ERROR_MESSAGE, "%s 沒有權限修改看板設定", username); result = WEB_ERROR; } else if ((result = ModifyBoard(form_data, board))) sprintf(skin_file->filename, "/%sboards/%s/%s", BBS_SUBDIR, boardname, HTML_BoardModify); break; #endif case SkinModify: /* customize board skins */ if (strcmp(username, board->owner) && !HAS_PERM(PERM_SYSOP)) { sprintf(WEBBBS_ERROR_MESSAGE, "%s 沒有權限修改討論區介面", username); result = WEB_ERROR; } else if (!(board->brdtype & BRD_WEBSKIN)) { sprintf(WEBBBS_ERROR_MESSAGE, "討論區 [%s] 尚未打開自定介面功\能", board->filename); result = WEB_ERROR; } else if ((result = ModifySkin(form_data, board, pf)))