diff options
author | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2005-08-28 11:56:10 +0800 |
---|---|---|
committer | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2005-08-28 11:56:10 +0800 |
commit | 730e5cbbccac23c675e7e525b83472d85967bed7 (patch) | |
tree | 847a2112d47b022745ebf57214acdd3cb0cd32ae /mbbsd | |
parent | ba48df6dc3374db17a3138fecbe2e75640a15967 (diff) | |
download | pttbbs-730e5cbbccac23c675e7e525b83472d85967bed7.tar pttbbs-730e5cbbccac23c675e7e525b83472d85967bed7.tar.gz pttbbs-730e5cbbccac23c675e7e525b83472d85967bed7.tar.bz2 pttbbs-730e5cbbccac23c675e7e525b83472d85967bed7.tar.lz pttbbs-730e5cbbccac23c675e7e525b83472d85967bed7.tar.xz pttbbs-730e5cbbccac23c675e7e525b83472d85967bed7.tar.zst pttbbs-730e5cbbccac23c675e7e525b83472d85967bed7.zip |
fix: don't do anything if itemlist is empty, otherwise it may corrupt memory.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3096 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd')
-rw-r--r-- | mbbsd/read.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/mbbsd/read.c b/mbbsd/read.c index 54417146..af304da3 100644 --- a/mbbsd/read.c +++ b/mbbsd/read.c @@ -318,6 +318,9 @@ thread(const keeploc_t * locmem, int stypen) int fd = -1, amatch = -1; int step = (stypen & RS_FORWARD) ? 1 : -1; char *key; + + if(locmem->crs_ln==0) + return locmem->crs_ln; STATINC(STAT_THREAD); if (stypen & RS_AUTHOR) @@ -423,7 +426,12 @@ select_read(const keeploc_t * locmem, int sr_mode) static int _mode = 0; int len, fd, fr, i, count=0, reference = 0, n_recommend = 0, n_money=0, diff; - fileheader_t *fh = &headers[locmem->crs_ln - locmem->top_ln]; + fileheader_t *fh; + + if(locmem->crs_ln == 0) + return locmem->crs_ln; + + fh = &headers[locmem->crs_ln - locmem->top_ln]; STATINC(STAT_SELECTREAD); if(sr_mode & RS_AUTHOR) @@ -615,7 +623,7 @@ i_read_key(const onekey_t * rcmdlist, keeploc_t * locmem, case 'q': case 'e': case KEY_LEFT: - if(currmode & MODE_SELECT){ + if(currmode & MODE_SELECT && locmem->crs_ln>0){ char genbuf[PATHLEN]; fileheader_t *fhdr = &headers[locmem->crs_ln - locmem->top_ln]; board_select(); @@ -744,7 +752,7 @@ i_read_key(const onekey_t * rcmdlist, keeploc_t * locmem, case 'F': case 'U': - if (HasUserPerm(PERM_FORWARD)) { + if (HasUserPerm(PERM_FORWARD) && locmem->crs_ln>0) { mail_forward(&headers[locmem->crs_ln - locmem->top_ln], currdirect, ch /* == 'U' */ ); /* by CharlieL */ @@ -754,11 +762,12 @@ i_read_key(const onekey_t * rcmdlist, keeploc_t * locmem, break; case Ctrl('Q'): - mode = my_query(headers[locmem->crs_ln - locmem->top_ln].owner); + if(locmem->crs_ln>0) + mode = my_query(headers[locmem->crs_ln - locmem->top_ln].owner); break; case Ctrl('S'): - if (HasUserPerm(PERM_ACCOUNTS)) { + if (HasUserPerm(PERM_ACCOUNTS) && locmem->crs_ln>0) { int id; userec_t muser; @@ -777,6 +786,8 @@ i_read_key(const onekey_t * rcmdlist, keeploc_t * locmem, /* rocker.011018: 採用新的tag模式 */ case 't': + if(locmem->crs_ln == 0) + break; /* 將原本在 Read() 裡面的 "TagNum = 0" 移至此處 */ if ((currstat & RMAIL && TagBoard != 0) || (!(currstat & RMAIL) && TagBoard != bid)) { @@ -827,6 +838,8 @@ i_read_key(const onekey_t * rcmdlist, keeploc_t * locmem, default: if( ch == 'h' && currmode & (MODE_DIGEST) ) break; + if(locmem->crs_ln == 0) + break; if (ch > 0 && ch <= onekey_size) { int (*func)() = rcmdlist[ch - 1]; if (func != NULL){ |