From c5484be541d5c1e1929b5dce01cd757fb65d5974 Mon Sep 17 00:00:00 2001 From: piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> Date: Sun, 30 Dec 2007 03:50:33 +0000 Subject: - prevent possible bug to create unlimited huge file git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3763 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- mbbsd/announce.c | 96 ++++++++++++++++++++++++++++++++++---------------------- mbbsd/edit.c | 1 + 2 files changed, 60 insertions(+), 37 deletions(-) diff --git a/mbbsd/announce.c b/mbbsd/announce.c index f7400006..4b2382c1 100644 --- a/mbbsd/announce.c +++ b/mbbsd/announce.c @@ -11,6 +11,9 @@ // // XXX 9999 �·зQ�Ӥ覡�ﱼ +// for max file size limitation here, see edit.c +#define MAX_FILE_SIZE (32768*1024) + /* copy temp queue operation -------------------------------------- */ /* TODO @@ -553,44 +556,59 @@ a_appenditem(const menu_t * pm, int isask) else { CopyQueue *cq = copyqueue_gethead(); + off_t sz; - if (dashf(cq->copyfile)) { - snprintf(fname, sizeof(fname), "%s/%s", pm->path, - pm->header[pm->now - pm->page].filename); - if (dashf(fname)) { - if (isask) { - snprintf(buf, sizeof(buf), - "�T�w�n�N[%s]���[��(Y/N)�H[N] ", cq->copytitle); - getdata(b_lines - 2, 1, buf, ans, sizeof(ans), LCECHO); - } - if (ans[0] == 'y') { - if ((fp = fopen(fname, "a+"))) { - if ((fin = fopen(cq->copyfile, "r"))) { - memset(buf, '-', 74); - buf[74] = '\0'; - fprintf(fp, "\n> %s <\n\n", buf); - if (isask) - getdata(b_lines - 1, 1, - "�O�_����ñ�W�ɳ���(Y/N)�H[Y] ", - ans, sizeof(ans), LCECHO); - while (fgets(buf, sizeof(buf), fin)) { - if ((ans[0] == 'n') && - !strcmp(buf, "--\n")) - break; - fputs(buf, fp); - } - fclose(fin); - cq->copyfile[0] = '\0'; - } - fclose(fp); - } - } - } else { - vmsg("�ɮפ��o���[�I"); - } - } else { + if (!dashf(cq->copyfile)) { vmsg("�ؿ����o���[���ɮ�I"); + return; } + + snprintf(fname, sizeof(fname), "%s/%s", pm->path, + pm->header[pm->now - pm->page].filename); + + if (!dashf(fname)) { + vmsg("�ɮפ��o���[�I"); + return; + } + + sz = dashs(fname); + if (sz >= MAX_FILE_SIZE) + { + vmsg("�ɮפw�W�L�̤j����A�L�k�A���["); + return; + } + + if (isask) { + snprintf(buf, sizeof(buf), + "�T�w�n�N[%s]���[��(Y/N)�H[N] ", cq->copytitle); + getdata(b_lines - 2, 1, buf, ans, sizeof(ans), LCECHO); + } + + if (ans[0] != 'y' || !(fp = fopen(fname, "a+"))) + return; + + if (!(fin = fopen(cq->copyfile, "r"))) { + fclose(fp); + return; + } + + memset(buf, '-', 74); + buf[74] = '\0'; + fprintf(fp, "\n> %s <\n\n", buf); + if (isask) + getdata(b_lines - 1, 1, + "�O�_����ñ�W�ɳ���(Y/N)�H[Y] ", + ans, sizeof(ans), LCECHO); + + while (fgets(buf, sizeof(buf), fin)) { + if ((ans[0] == 'n') && + !strcmp(buf, "--\n")) + break; + fputs(buf, fp); + } + fclose(fin); + fclose(fp); + cq->copyfile[0] = '\0'; } } @@ -612,14 +630,18 @@ a_pastetagpost(menu_t * pm, int mode) } tagnum = TagNum; - if (!tagnum) + // prevent if anything wrong + if (tagnum >= MAXTAGS) + tagnum = MAXTAGS; + + if (tagnum < 1) return ans; /* since we use different tag features, * copyqueue is not required/used. */ copyqueue_reset(); - while (tagnum--) { + while (tagnum-- > 0) { memset(&fhdr, 0, sizeof(fhdr)); EnumTagFhdr(&fhdr, dirname, ent++); diff --git a/mbbsd/edit.c b/mbbsd/edit.c index 03f2d014..315cfc65 100644 --- a/mbbsd/edit.c +++ b/mbbsd/edit.c @@ -39,6 +39,7 @@ * 32M �� size limit * 1M �� line limit * �S�A���M�o�{���e totaln �������O short... �ҥH 65536 �N���F? + * ���: ���G�O�� announce �� append �@�X�Ӫ��A���ݨ� > --- <- mark�C */ #include "bbs.h" -- cgit v1.2.3