Fix context leak

This commit is contained in:
Nishi 2026-06-20 01:21:01 +09:00
commit dc16dd98fb
12 changed files with 59 additions and 38 deletions

View file

@ -157,6 +157,11 @@ typedef struct workarea {
typedef struct sj3context {
Global* work;
STDY* stdy;
JREC* jrec_free;
JREC* jrec_pool;
CLREC* clrec_free;
CLREC* clrec_pool;
} Sj3Context;
#endif

View file

@ -64,10 +64,10 @@ TypeIdxOfs count_uidx(SJ3_CONTEXT2);
void chg_uidx(SJ3_CONTEXT TypeDicSeg, u_char*, int);
/* alloc.c */
JREC* alloc_jrec(void);
void free_jrec(JREC*);
CLREC* alloc_clrec(void);
void free_clrec(CLREC*);
JREC* alloc_jrec(SJ3_CONTEXT2);
void free_jrec(SJ3_CONTEXT JREC*);
CLREC* alloc_clrec(SJ3_CONTEXT2);
void free_clrec(SJ3_CONTEXT CLREC*);
/* charsize.c */
int codesize(u_char);
@ -163,10 +163,10 @@ int istrcmp(u_char*, u_char*, int, int);
void sstrncpy(u_char*, u_char*, int);
/* memory.c */
JREC* free_jlst(JREC*);
JREC* free_jlst(SJ3_CONTEXT JREC*);
CLREC* free_clst(SJ3_CONTEXT CLREC*, int);
void free_clall(CLREC*);
void free_jall(JREC*);
void free_clall(SJ3_CONTEXT CLREC*);
void free_jall(SJ3_CONTEXT JREC*);
void freework(SJ3_CONTEXT2);
/* mk2claus.c */

View file

@ -46,10 +46,15 @@
#define JREC_NUM 128
#define CLREC_NUM 128
#ifdef SJ3_GLOBAL
static JREC* jrec = NULL;
static CLREC* clrec = NULL;
#else
#define jrec ctx->jrec_free
#define clrec ctx->clrec_free
#endif
JREC* alloc_jrec() {
JREC* alloc_jrec(SJ3_CONTEXT2) {
JREC* p;
int i;
@ -59,6 +64,10 @@ JREC* alloc_jrec() {
for(i = 0, p = jrec; i < JREC_NUM - 1; i++, p++)
p->jsort = p + 1;
p->jsort = NULL;
#ifndef SJ3_GLOBAL
ctx->jrec_pool = jrec;
#endif
}
p = jrec;
jrec = jrec->jsort;
@ -66,7 +75,7 @@ JREC* alloc_jrec() {
return p;
}
void free_jrec(JREC* p) {
void free_jrec(SJ3_CONTEXT JREC* p) {
if(p != NULL) {
p->jsort = jrec;
jrec = p;
@ -74,7 +83,7 @@ void free_jrec(JREC* p) {
}
CLREC*
alloc_clrec() {
alloc_clrec(SJ3_CONTEXT2) {
CLREC* p;
int i;
@ -84,6 +93,10 @@ alloc_clrec() {
for(i = 0, p = clrec; i < CLREC_NUM - 1; i++, p++)
p->clsort = p + 1;
p->clsort = NULL;
#ifndef SJ3_GLOBAL
ctx->clrec_pool = clrec;
#endif
}
p = clrec;
clrec = clrec->clsort;
@ -91,7 +104,7 @@ alloc_clrec() {
return p;
}
void free_clrec(CLREC* p) {
void free_clrec(SJ3_CONTEXT CLREC* p) {
if(p != NULL) {
p->clsort = clrec;
clrec = p;

View file

@ -87,8 +87,8 @@ void cvtphknj(SJ3_CONTEXT2) {
not_enough_memory:
free_clall(clt1st);
free_jall(jrt1st);
free_clall(SJ3_CONTEXT_PASS clt1st);
free_jall(SJ3_CONTEXT_PASS jrt1st);
}
void cvtkouho(SJ3_CONTEXT KHREC* krec) {

View file

@ -118,6 +118,9 @@ void free_context(Sj3Context* ctx) {
freework(ctx);
free(ctx->jrec_pool);
free(ctx->clrec_pool);
free(ctx->stdy);
free(ctx->work);

View file

@ -37,7 +37,7 @@
#include "sj_kanakan.h"
JREC* free_jlst(JREC* p) {
JREC* free_jlst(SJ3_CONTEXT JREC* p) {
JREC* jpk;
JREC* jp;
JREC* jn;
@ -57,7 +57,7 @@ JREC* free_jlst(JREC* p) {
}
else {
free_jrec(p);
free_jrec(SJ3_CONTEXT_PASS p);
}
}
@ -97,7 +97,7 @@ free_clst(SJ3_CONTEXT CLREC* p, int l) {
else {
(p->jnode->count)--;
free_clrec(p);
free_clrec(SJ3_CONTEXT_PASS p);
}
}
@ -106,31 +106,31 @@ free_clst(SJ3_CONTEXT CLREC* p, int l) {
return cpk;
}
void free_clall(CLREC* p) {
void free_clall(SJ3_CONTEXT CLREC* p) {
CLREC* next;
while(p) {
(p->jnode->count)--;
next = p->clsort;
free_clrec(p);
free_clrec(SJ3_CONTEXT_PASS p);
p = next;
}
}
void free_jall(JREC* p) {
void free_jall(SJ3_CONTEXT JREC* p) {
JREC* next;
while(p) {
next = p->jsort;
free_jrec(p);
free_jrec(SJ3_CONTEXT_PASS p);
p = next;
}
}
void freework(SJ3_CONTEXT2) {
free_clall(maxclptr);
free_clall(SJ3_CONTEXT_PASS maxclptr);
clt1st = maxclptr = NULL;
free_jall(maxjptr);
free_jall(SJ3_CONTEXT_PASS maxjptr);
jrt1st = maxjptr = NULL;
}

View file

@ -99,8 +99,8 @@ void mk2claus(SJ3_CONTEXT2) {
if(len != clrec->cllen) {
if(clt2nd != maxclptr) {
free_clall(maxclptr);
free_jall(maxjptr);
free_clall(SJ3_CONTEXT_PASS maxclptr);
free_jall(SJ3_CONTEXT_PASS maxjptr);
}
save2ln = set2nd(SJ3_CONTEXT_PASS clrec);
@ -138,16 +138,16 @@ void mk2claus(SJ3_CONTEXT2) {
if(clt2nd == maxclptr) continue;
free_clall(clt2nd);
free_jall(jrt2nd);
free_clall(SJ3_CONTEXT_PASS clt2nd);
free_jall(SJ3_CONTEXT_PASS jrt2nd);
jrt2nd = maxjptr;
clt2nd = maxclptr;
}
if(clt2nd != maxclptr) {
free_clall(maxclptr);
free_clall(SJ3_CONTEXT_PASS maxclptr);
maxclptr = NULL;
free_jall(maxjptr);
free_jall(SJ3_CONTEXT_PASS maxjptr);
maxjptr = NULL;
}

View file

@ -100,7 +100,7 @@ argclrec(SJ3_CONTEXT int len) {
CLREC* rec;
CLREC* child;
rec = alloc_clrec();
rec = alloc_clrec(SJ3_CONTEXT_PASS2);
if(!rec) {
if(!maxclptr)

View file

@ -104,7 +104,7 @@ JREC* argjrec(SJ3_CONTEXT int len, JREC* rec) {
JREC* jrec;
JREC* child;
jrec = alloc_jrec();
jrec = alloc_jrec(SJ3_CONTEXT_PASS2);
if(!jrec) {
if(!maxjptr) return NULL;

View file

@ -86,7 +86,7 @@ int ph2knj(SJ3_CONTEXT u_char* zyomi, u_char* kanji, int knjlen) {
prevclrow = selcl->right;
clt1st = free_clst(SJ3_CONTEXT_PASS clt1st, (int)selcl->cllen);
jrt1st = free_jlst(jrt1st);
jrt1st = free_jlst(SJ3_CONTEXT_PASS jrt1st);
cnvstart += selcl->cllen;
cnvlen -= selcl->cllen;
@ -98,8 +98,8 @@ int ph2knj(SJ3_CONTEXT u_char* zyomi, u_char* kanji, int knjlen) {
}
if(!kanjilen) {
free_clall(clt1st);
free_jall(jrt1st);
free_clall(SJ3_CONTEXT_PASS clt1st);
free_jall(SJ3_CONTEXT_PASS jrt1st);
}
*kanjipos = 0;

View file

@ -77,8 +77,8 @@ void selclrec(SJ3_CONTEXT2) {
int klen;
u_char ch;
free_clall(clt1st);
free_jall(jrt1st);
free_clall(SJ3_CONTEXT_PASS clt1st);
free_jall(SJ3_CONTEXT_PASS jrt1st);
klen = cnvlen;
cnvlen = len;
@ -97,8 +97,8 @@ void selclrec(SJ3_CONTEXT2) {
*(cnvstart + len) = ch;
}
free_clall(clt2nd);
free_clall(SJ3_CONTEXT_PASS clt2nd);
clt2nd = NULL;
free_jall(jrt2nd);
free_jall(SJ3_CONTEXT_PASS jrt2nd);
jrt2nd = NULL;
}

View file

@ -50,7 +50,7 @@ void wakachi(SJ3_CONTEXT2) {
int i;
int maxlen;
free_jall(maxjptr);
free_jall(SJ3_CONTEXT_PASS maxjptr);
maxjptr = NULL;
maxlen = (cnvlen > MAXCLINPUTLEN) ? MAXCLINPUTLEN : cnvlen;