summaryrefslogtreecommitdiffstats
path: root/mbbsd/bbs.c
diff options
context:
space:
mode:
authorptt <ptt@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-01-18 17:13:53 +0800
committerptt <ptt@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-01-18 17:13:53 +0800
commit5a0e612ca4825c5b35acf82d142fd7d7e745e1d0 (patch)
tree0f13deee81f1f569c8dc13cc3f686299c41f2ed3 /mbbsd/bbs.c
parent519c7a330f916c29c21ef80d2fc20326e7ba96e2 (diff)
downloadpttbbs-5a0e612ca4825c5b35acf82d142fd7d7e745e1d0.tar
pttbbs-5a0e612ca4825c5b35acf82d142fd7d7e745e1d0.tar.gz
pttbbs-5a0e612ca4825c5b35acf82d142fd7d7e745e1d0.tar.bz2
pttbbs-5a0e612ca4825c5b35acf82d142fd7d7e745e1d0.tar.lz
pttbbs-5a0e612ca4825c5b35acf82d142fd7d7e745e1d0.tar.xz
pttbbs-5a0e612ca4825c5b35acf82d142fd7d7e745e1d0.tar.zst
pttbbs-5a0e612ca4825c5b35acf82d142fd7d7e745e1d0.zip
fix the bug of the cost of deleting post
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3475 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/bbs.c')
-rw-r--r--mbbsd/bbs.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c
index 4dbae34b..a5d72bd5 100644
--- a/mbbsd/bbs.c
+++ b/mbbsd/bbs.c
@@ -545,10 +545,11 @@ cancelpost(const fileheader_t *fh, int by_BM, char *newpath)
}
static void
-do_deleteCrossPost(fileheader_t *fh, char bname[])
+do_deleteCrossPost(const fileheader_t *fh, char bname[])
{
char bdir[MAXPATHLEN]="", file[MAXPATHLEN]="";
- if(!bname) return;
+ fileheader_t newfh;
+ if(!bname || !fh) return;
int i, bid = getbnum(bname);
if(bid <=0 || !fh->filename[0]) return;
@@ -558,11 +559,14 @@ do_deleteCrossPost(fileheader_t *fh, char bname[])
setbdir(bdir, bname);
setbfile(file, bname, fh->filename);
- if( (i=getindex(bdir, fh, 0))>0)
+ memcpy(&newfh, fh, sizeof(fileheader_t));
+ // Ptt: protect original fh
+ // because getindex safe_article_delete will change fh in some case
+ if( (i=getindex(bdir, &newfh, 0))>0)
{
#ifdef SAFE_ARTICLE_DELETE
if(bp && !(currmode & MODE_DIGEST) && bp->nuser > 30 )
- safe_article_delete(i, fh, bdir);
+ safe_article_delete(i, &newfh, bdir);
else
#endif
delete_record(bdir, sizeof(fileheader_t), i);
@@ -572,17 +576,21 @@ do_deleteCrossPost(fileheader_t *fh, char bname[])
}
static void
-deleteCrossPost(fileheader_t *fh, char *bname)
+deleteCrossPost(const fileheader_t *fh, char *bname)
{
if(!fh || !fh->filename[0]) return;
if(!strcmp(bname, ALLPOST) || !strcmp(bname, "NEWIDPOST") ||
!strcmp(bname, ALLHIDPOST) || !strcmp(bname, "UnAnonymous"))
{
+ int len=0;
char xbname[TTLEN + 1], *po = strrchr(fh->title, '.');
if(!po) return;
-
- sprintf(xbname, "%.*s", (int) strlen(po)-3, po+1);
+ po++;
+ len = (int) strlen(po)-2;
+
+ if(len > TTLEN) return;
+ sprintf(xbname, "%.*s", len, po);
do_deleteCrossPost(fh, xbname);
}
else