From 313f24f18bcc0b9cd5cdea3e6727d21c6b49f250 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Wed, 26 Nov 2025 14:55:28 +0900
Subject: [PATCH] util/IMdkit: Fix memory leaks with fail safe

Index: util/IMdkit/FrameMgr.c
--- util/IMdkit/FrameMgr.c.orig
+++ util/IMdkit/FrameMgr.c
@@ -23,6 +23,7 @@ SOFTWARE.
                              miyamoto@jrd.dec.com
 
     This version tidied and debugged by Steve Underwood May 1999
+    This version tidied and debugged by Takao Fujiwara Nov 2025
 
 ******************************************************************/
 
@@ -30,6 +31,7 @@ SOFTWARE.
 #include <assert.h>
 #include <stdlib.h>
 #include "FrameMgr.h"
+#include "XimProto.h"
 
 /* Convenient macro */
 
@@ -218,7 +220,11 @@ FrameMgr FrameMgrInit (XimFrame frame, char* area, Boo
 {
     FrameMgr fm;
 
-    fm = (FrameMgr) Xmalloc (sizeof (FrameMgrRec));
+    if ((fm = (FrameMgr) Xmalloc (sizeof (FrameMgrRec))) == NULL) {
+        fprintf (stderr, "(XIM-IMdkit) WARNING: malloc failed in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return NULL;
+    }
 
     fm->frame = frame;
     fm->fi = FrameInstInit (frame);
@@ -259,7 +265,8 @@ void FrameMgrFree (FrameMgr fm)
     }
     /*endwhile*/
 
-    FrameInstFree (fm->fi);
+    if (fm->fi)
+        FrameInstFree (fm->fi);
     Xfree (fm);
 }
 
@@ -868,7 +875,11 @@ static FrameInst FrameInstInit (XimFrame frame)
 {
     FrameInst fi;
 
-    fi = (FrameInst) Xmalloc (sizeof (FrameInstRec));
+    if ((fi = (FrameInst) Xmalloc (sizeof (FrameInstRec))) == NULL) {
+        fprintf (stderr, "(XIM-IMdkit) WARNING: malloc failed in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return NULL;
+    }
 
     fi->template = frame;
     fi->cur_no = 0;
@@ -884,7 +895,7 @@ static void FrameInstFree (FrameInst fi)
 
     ChainIterInit (&ci, &fi->cm);
 
-    while (ChainIterGetNext (&ci, &frame_no, &d))
+    while (ChainIterGetNext (&ci, &frame_no, &d) && fi->template)
     {
         register XimFrameType type;
         type = fi->template[frame_no].type;
@@ -912,6 +923,11 @@ static XimFrameType FrameInstGetNextType(FrameInst fi,
 {
     XimFrameType ret_type;
 
+    if (!fi) {
+        fprintf (stderr, "(XIM-IMdkit) WARNING: fi != NULL in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return -1;
+    }
     ret_type = fi->template[fi->cur_no].type;
 
     switch (ret_type)
@@ -944,7 +960,13 @@ static XimFrameType FrameInstGetNextType(FrameInst fi,
                 if ((d = ChainMgrGetExtraData (&fi->cm, iter_idx)) == NULL)
                 {
                     dr.iter = IterInit (&fi->template[iter_idx + 1], NO_VALUE);
+                    if (!dr.iter)
+                        return -1;
                     d = ChainMgrSetData (&fi->cm, iter_idx, dr);
+                    if (!d) {
+                        IterFree (dr.iter);
+                        return -1;
+                    }
                 }
                 /*endif*/
                 info->counter.iter = d->iter;
@@ -980,6 +1002,7 @@ static XimFrameType FrameInstGetNextType(FrameInst fi,
             register int unit;
             register int number;
             register int size;
+            register int s;
             register int i;
 
             unit = _UNIT ((long) fi->template[fi->cur_no].data);
@@ -991,11 +1014,21 @@ static XimFrameType FrameInstGetNextType(FrameInst fi,
             {
                 i = _FrameInstDecrement (fi->template, i);
                 assert (i >= 0);
-                size += _FrameInstGetItemSize (fi, i);
+                s = _FrameInstGetItemSize (fi, i);
+                if (s == NO_VALUE) {
+                    size = NO_VALUE;
+                    number = 0;
+                    break;
+                } else {
+                    size += s;
+                }
                 number--;
             }
             /*endwhile*/
-            info->num = (unit - (size%unit))%unit;
+            if (size == NO_VALUE)
+                info->num = NO_VALUE;
+            else
+                info->num = (unit - (size%unit))%unit;
         }
         /*endif*/
         fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no);
@@ -1011,7 +1044,13 @@ static XimFrameType FrameInstGetNextType(FrameInst fi,
             if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL)
             {
                 dr.iter = IterInit (&fi->template[fi->cur_no + 1], NO_VALUE);
+                if (!dr.iter)
+                    return -1;
                 d = ChainMgrSetData (&fi->cm, fi->cur_no, dr);
+                if (!d) {
+                    IterFree (dr.iter);
+                    return -1;
+                }
             }
             /*endif*/
             sub_type = IterGetNextType (d->iter, info);
@@ -1037,7 +1076,13 @@ static XimFrameType FrameInstGetNextType(FrameInst fi,
             if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL)
             {
                 dr.fi = FrameInstInit (fi->template[fi->cur_no + 1].data);
+                if (!dr.fi)
+                    return -1;
                 d = ChainMgrSetData (&fi->cm, fi->cur_no, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+                    return -1;
+                }
             }
             /*endif*/
             sub_type = FrameInstGetNextType (d->fi, info);
@@ -1064,6 +1109,11 @@ static XimFrameType FrameInstPeekNextType (FrameInst f
 {
     XimFrameType ret_type;
 
+    if (!fi) {
+        fprintf (stderr, "(XIM-IMdkit) WARNING: fi != NULL in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return -1;
+    }
     ret_type = fi->template[fi->cur_no].type;
 
     switch (ret_type)
@@ -1096,7 +1146,13 @@ static XimFrameType FrameInstPeekNextType (FrameInst f
                 if ((d = ChainMgrGetExtraData (&fi->cm, iter_idx)) == NULL)
                 {
                     dr.iter = IterInit (&fi->template[iter_idx + 1], NO_VALUE);
+                    if (!dr.iter)
+                        return -1;
                     d = ChainMgrSetData (&fi->cm, iter_idx, dr);
+                    if (!d) {
+                        IterFree (dr.iter);
+                        return -1;
+                    }
                 }
                 /*endif*/
                 info->counter.iter = d->iter;
@@ -1130,6 +1186,7 @@ static XimFrameType FrameInstPeekNextType (FrameInst f
             register int unit;
             register int number;
             register int size;
+            register int s;
             register int i;
 
             unit = _UNIT ((long) fi->template[fi->cur_no].data);
@@ -1141,11 +1198,21 @@ static XimFrameType FrameInstPeekNextType (FrameInst f
             {
                 i = _FrameInstDecrement (fi->template, i);
                 assert (i >= 0);
-                size += _FrameInstGetItemSize (fi, i);
+                s = _FrameInstGetItemSize (fi, i);
+                if (s == NO_VALUE) {
+                    size = NO_VALUE;
+                    number = 0;
+                    break;
+                } else {
+                    size += s;
+                }
                 number--;
             }
             /*endwhile*/
-            info->num = (unit - (size%unit))%unit;
+            if (size == NO_VALUE)
+                info->num = NO_VALUE;
+            else
+                info->num = (unit - (size%unit))%unit;
         }
         /*endif*/
         break;
@@ -1159,7 +1226,13 @@ static XimFrameType FrameInstPeekNextType (FrameInst f
             if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL)
             {
                 dr.iter = IterInit (&fi->template[fi->cur_no + 1], NO_VALUE);
+                if (!dr.iter)
+                    return -1;
                 d = ChainMgrSetData (&fi->cm, fi->cur_no, dr);
+                if (!d) {
+                    IterFree (dr.iter);
+                    return -1;
+                }
             }
             /*endif*/
             sub_type = IterPeekNextType (d->iter, info);
@@ -1180,7 +1253,13 @@ static XimFrameType FrameInstPeekNextType (FrameInst f
             if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL)
             {
                 dr.fi = FrameInstInit (fi->template[fi->cur_no + 1].data);
+                if (!dr.fi)
+                    return -1;
                 d = ChainMgrSetData (&fi->cm, fi->cur_no, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+                    return -1;
+                }
             }
             /*endif*/
             sub_type = FrameInstPeekNextType (d->fi, info);
@@ -1202,6 +1281,11 @@ static Bool FrameInstIsIterLoopEnd (FrameInst fi)
 {
     Bool ret = False;
 
+    if (!fi) {
+        fprintf (stderr, "(XIM-IMdkit) WARNING: fi != NULL in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return True;
+    }
     if (fi->template[fi->cur_no].type == ITER)
     {
         ExtraData d = ChainMgrGetExtraData (&fi->cm, fi->cur_no);
@@ -1313,6 +1397,11 @@ static FmStatus FrameInstSetSize (FrameInst fi, int nu
     XimFrameType type;
     register int i;
 
+    if (!fi) {
+        fprintf (stderr, "(XIM-IMdkit) WARNING: fi != NULL in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return FmNoMoreData;
+    }
     i = 0;
     while ((type = fi->template[i].type) != EOL)
     {
@@ -1323,6 +1412,8 @@ static FmStatus FrameInstSetSize (FrameInst fi, int nu
             {
                 dr.num = -1;
                 d = ChainMgrSetData (&fi->cm, i, dr);
+                if (!d)
+                    return FmNoMoreData;
             }
             /*endif*/
             if (d->num == NO_VALUE)
@@ -1336,7 +1427,13 @@ static FmStatus FrameInstSetSize (FrameInst fi, int nu
             if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL)
             {
                 dr.iter = IterInit (&fi->template[i + 1], NO_VALUE);
+                if (!dr.iter)
+                    return FmNoMoreData;
                 d = ChainMgrSetData (&fi->cm, i, dr);
+                if (!d) {
+                    IterFree (dr.iter);
+                    return FmNoMoreData;
+                }
             }
             /*endif*/
             if (IterSetSize (d->iter, num) == FmSuccess)
@@ -1348,7 +1445,13 @@ static FmStatus FrameInstSetSize (FrameInst fi, int nu
             if ((d = ChainMgrGetExtraData(&fi->cm, i)) == NULL)
             {
                 dr.fi = FrameInstInit(fi->template[i + 1].data);
-                d = ChainMgrSetData(&fi->cm, i, dr);
+                if (!dr.fi)
+                    return FmNoMoreData;
+                d = ChainMgrSetData (&fi->cm, i, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+                    return FmNoMoreData;
+                }
             }
             /*endif*/
             if (FrameInstSetSize(d->fi, num) == FmSuccess)
@@ -1374,6 +1477,11 @@ static int FrameInstGetSize (FrameInst fi)
     ExtraDataRec dr;
     int ret_size;
 
+    if (!fi) {
+        fprintf (stderr, "(XIM-IMdkit) WARNING: fi != NULL in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return NO_VALID_FIELD;
+    }
     i = fi->cur_no;
     while ((type = fi->template[i].type) != EOL)
     {
@@ -1389,7 +1497,13 @@ static int FrameInstGetSize (FrameInst fi)
             if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL)
             {
                 dr.iter = IterInit (&fi->template[i + 1], NO_VALUE);
+                if (!dr.iter)
+                    return NO_VALID_FIELD;
                 d = ChainMgrSetData (&fi->cm, i, dr);
+                if (!d) {
+                    IterFree (dr.iter);
+                    return NO_VALID_FIELD;
+                }
             }
             /*endif*/
             ret_size = IterGetSize(d->iter);
@@ -1402,7 +1516,13 @@ static int FrameInstGetSize (FrameInst fi)
             if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL)
             {
                 dr.fi = FrameInstInit (fi->template[i + 1].data);
+                if (!dr.fi)
+                    return NO_VALID_FIELD;
                 d = ChainMgrSetData (&fi->cm, i, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+                    return NO_VALID_FIELD;
+                }
             }
             /*endif*/
             ret_size = FrameInstGetSize (d->fi);
@@ -1428,6 +1548,11 @@ static FmStatus FrameInstSetIterCount (FrameInst fi, i
     register int i;
     XimFrameType type;
 
+    if (!fi) {
+        fprintf (stderr, "(XIM-IMdkit) WARNING: fi != NULL in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return FmNoMoreData;
+    }
     i = 0;
     while ((type = fi->template[i].type) != EOL)
     {
@@ -1437,7 +1562,12 @@ static FmStatus FrameInstSetIterCount (FrameInst fi, i
             if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL)
             {
                 dr.iter = IterInit (&fi->template[i + 1], num);
-                (void)ChainMgrSetData (&fi->cm, i, dr);
+                if (!dr.iter)
+                    return FmNoMoreData;
+                if (!ChainMgrSetData (&fi->cm, i, dr)) {
+                    IterFree (dr.iter);
+                    return FmNoMoreData;
+                }
                 return FmSuccess;
             }
             /*endif*/
@@ -1450,7 +1580,13 @@ static FmStatus FrameInstSetIterCount (FrameInst fi, i
             if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL)
             {
                 dr.fi = FrameInstInit (fi->template[i + 1].data);
+                if (!dr.fi)
+                    return FmNoMoreData;
                 d = ChainMgrSetData (&fi->cm, i, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+                    return FmNoMoreData;
+                }
             }
             /*endif*/
             if (FrameInstSetIterCount (d->fi, num) == FmSuccess)
@@ -1472,14 +1608,26 @@ static FmStatus FrameInstSetIterCount (FrameInst fi, i
 static int FrameInstGetTotalSize (FrameInst fi)
 {
     register int size;
+    register int s;
     register int i;
 
     size = 0;
     i = 0;
 
+    if (!fi) {
+        fprintf (stderr, "(XIM-IMdkit) WARNING: fi != NULL in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return 0;
+    }
     while (fi->template[i].type != EOL)
     {
-        size += _FrameInstGetItemSize (fi, i);
+        s = _FrameInstGetItemSize (fi, i);
+        if (s == NO_VALUE) {
+            size = NO_VALUE;
+            break;
+        } else {
+            size += s;
+        }
         assert (i >= 0);
         i = _FrameInstIncrement (fi->template, i);
     }
@@ -1526,8 +1674,8 @@ static Iter IterInit (XimFrame frame, int count)
 
     it = (Iter) Xmalloc (sizeof (IterRec));
     if (!it) {
-        fprintf (stderr, "(XIM-IMdkit) WARNING: malloc failed in %s:%d.\n",
-                 __FILE__, __LINE__);
+        fprintf (stderr, "(XIM-IMdkit) WARNING: malloc failed in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
         return NULL;
     }
     it->template = frame;
@@ -1600,7 +1748,7 @@ static void IterFree (Iter it)
             ExtraDataRec dr;
     
             ChainIterInit (&ci, &it->cm);
-            while (ChainIterGetNext (&ci, &count, &dr))
+            while (ChainIterGetNext (&ci, &count, &dr) && dr.fi)
                 FrameInstFree (dr.fi);
             /*endwhile*/
             ChainIterFree (&ci);
@@ -1638,8 +1786,12 @@ static Bool IterIsLoopEnd (Iter it, Bool *myself)
             }
             else
             {
-                if (FrameInstIsEnd (d->fi))
-                {
+                if (!d->fi) {
+                    fprintf (stderr, "(XIM-IMdkit) WARNING: d->fi != NULL " \
+                                     "in %s:%s.\n",
+                             __FILE__, XIM_STRFUNC);
+                    ret = True;
+                } else if (FrameInstIsEnd (d->fi)) {
                     it->cur_no++;
                     if (!it->allow_expansion  &&  it->cur_no == it->max_count)
                     {
@@ -1677,9 +1829,9 @@ static XimFrameType IterGetNextType (Iter it, XimFrame
     XimFrameType type;
 
     if (!it || !it->template) {
-        fprintf (stderr, "(XIM-IMdkit) WARNING: malloc failed in %s:%d.\n",
-                 __FILE__, __LINE__);
-	return (XimFrameType) NULL;
+        fprintf (stderr, "(XIM-IMdkit) WARNING: malloc failed in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+	return (XimFrameType)NULL;
     }
 
     type = it->template->type;
@@ -1732,7 +1884,13 @@ static XimFrameType IterGetNextType (Iter it, XimFrame
             if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL)
             {
                 dr.iter = IterInit (it->template + 1, NO_VALUE);
+                if (!dr.iter)
+	            return (XimFrameType)NULL;
                 d = ChainMgrSetData (&it->cm, it->cur_no, dr);
+                if (!d) {
+                    IterFree (dr.iter);
+	            return (XimFrameType)NULL;
+                }
             }
             /*endif*/
 
@@ -1755,7 +1913,13 @@ static XimFrameType IterGetNextType (Iter it, XimFrame
             if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL)
             {
                 dr.fi = FrameInstInit (it->template[1].data);
+                if (!dr.fi)
+	            return (XimFrameType)NULL;
                 d = ChainMgrSetData (&it->cm, it->cur_no, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+	            return (XimFrameType)NULL;
+                }
             }
             /*endif*/
 
@@ -1781,9 +1945,9 @@ static XimFrameType IterPeekNextType (Iter it, XimFram
     XimFrameType type;
 
     if (!it->template) {
-        fprintf (stderr, "(XIM-IMdkit) WARNING: dereference pointer %s:%d.\n",
-                 __FILE__, __LINE__);
-        return (XimFrameType) NULL;
+        fprintf (stderr, "(XIM-IMdkit) WARNING: dereference pointer %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
+        return (XimFrameType)NULL;
     }
 
     type = it->template->type;
@@ -1823,7 +1987,13 @@ static XimFrameType IterPeekNextType (Iter it, XimFram
             if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL)
             {
                 dr.iter = IterInit (it->template + 1, NO_VALUE);
+                if (!dr.iter)
+                    return (XimFrameType)NULL;
                 d = ChainMgrSetData (&it->cm, it->cur_no, dr);
+                if (!d) {
+                    IterFree (dr.iter);
+                    return (XimFrameType)NULL;
+                }
             }
             /*endif*/
 
@@ -1843,7 +2013,13 @@ static XimFrameType IterPeekNextType (Iter it, XimFram
             if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL)
             {
                 dr.fi = FrameInstInit (it->template[1].data);
+                if (!dr.fi)
+                    return (XimFrameType)NULL;
                 d = ChainMgrSetData (&it->cm, it->cur_no, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+                    return (XimFrameType)NULL;
+                }
             }
             /*endif*/
 
@@ -1885,10 +2061,9 @@ static FmStatus IterSetSize (Iter it, int num)
                 {
                     dr.num = NO_VALUE;
                     d = ChainMgrSetData (&it->cm, i, dr);
+                    if (!d)
+                        return FmNoMoreData;
                 }
-                if (!d) {
-                    return FmNoMoreData;
-                }
                 /*endif*/
                 if (d->num == NO_VALUE)
                 {
@@ -1903,7 +2078,8 @@ static FmStatus IterSetSize (Iter it, int num)
                 ExtraDataRec dr;
                 
                 dr.num = num;
-                ChainMgrSetData (&it->cm, it->max_count, dr);
+                if (!ChainMgrSetData (&it->cm, it->max_count, dr))
+                    return FmNoMoreData;
                 it->max_count++;
     
                 return FmSuccess;
@@ -1922,7 +2098,13 @@ static FmStatus IterSetSize (Iter it, int num)
                 if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL)
                 {
                     dr.iter = IterInit (it->template + 1, NO_VALUE);
+                    if (!dr.iter)
+                        return FmNoMoreData;
                     d = ChainMgrSetData (&it->cm, i, dr);
+                    if (!d) {
+                        IterFree (dr.iter);
+                        return FmNoMoreData;
+                    }
                 }
                 /*endif*/
                 if (IterSetSize (d->iter, num) == FmSuccess)
@@ -1935,7 +2117,12 @@ static FmStatus IterSetSize (Iter it, int num)
                 ExtraDataRec dr;
 
                 dr.iter = IterInit (it->template + 1, NO_VALUE);
-                ChainMgrSetData (&it->cm, it->max_count, dr);
+                if (!dr.iter)
+                    return FmNoMoreData;
+                if (!ChainMgrSetData (&it->cm, it->max_count, dr)) {
+                    IterFree (dr.iter);
+                    return FmNoMoreData;
+                }
                 it->max_count++;
 
                 if (IterSetSize(dr.iter, num) == FmSuccess)
@@ -1956,7 +2143,13 @@ static FmStatus IterSetSize (Iter it, int num)
                 if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL)
                 {
                     dr.fi = FrameInstInit (it->template[1].data);
+                    if (!dr.fi)
+                        return FmNoMoreData;
                     d = ChainMgrSetData (&it->cm, i, dr);
+                    if (!d) {
+                        FrameInstFree (dr.fi);
+                        return FmNoMoreData;
+                    }
                 }
                 /*endif*/
                 if (FrameInstSetSize (d->fi, num) == FmSuccess)
@@ -1969,7 +2162,12 @@ static FmStatus IterSetSize (Iter it, int num)
                 ExtraDataRec dr;
 
                 dr.fi = FrameInstInit (it->template[1].data);
-                ChainMgrSetData (&it->cm, it->max_count, dr);
+                if (!dr.fi)
+                    return FmNoMoreData;
+                if (!ChainMgrSetData (&it->cm, it->max_count, dr)) {
+                    FrameInstFree (dr.fi);
+                    return FmNoMoreData;
+                }
                 it->max_count++;
 
                 if (FrameInstSetSize (dr.fi, num) == FmSuccess)
@@ -2013,7 +2211,13 @@ static int IterGetSize (Iter it)
             if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL)
             {
                 dr.iter = IterInit (it->template + 1, NO_VALUE);
+                if (!dr.iter)
+                    return NO_VALID_FIELD;
                 d = ChainMgrSetData (&it->cm, i, dr);
+                if (!d) {
+                    IterFree (dr.iter);
+                    return NO_VALID_FIELD;
+                }
             }
             /*endif*/
             ret_size = IterGetSize (d->iter);
@@ -2032,7 +2236,13 @@ static int IterGetSize (Iter it)
             if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL)
             {
                 dr.fi = FrameInstInit (it->template[1].data);
+                if (!dr.fi)
+                    return NO_VALID_FIELD;
                 d = ChainMgrSetData (&it->cm, i, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+                    return NO_VALID_FIELD;
+                }
             }
             /*endif*/
             ret_size = FrameInstGetSize (d->fi);
@@ -2077,7 +2287,12 @@ static FmStatus IterSetIterCount (Iter it, int num)
             if ((d = ChainMgrGetExtraData(&it->cm, i)) == NULL)
             {
                 dr.iter = IterInit(it->template + 1, num);
-                (void)ChainMgrSetData(&it->cm, i, dr);
+                if (!dr.iter)
+                    return FmNoMoreData;
+                if (!ChainMgrSetData(&it->cm, i, dr)) {
+                    IterFree (dr.iter);
+                    return FmNoMoreData;
+                }
                 return FmSuccess;
             }
             /*endif*/
@@ -2091,7 +2306,12 @@ static FmStatus IterSetIterCount (Iter it, int num)
             ExtraDataRec dr;
 
             dr.iter = IterInit (it->template + 1, num);
-            ChainMgrSetData (&it->cm, it->max_count, dr);
+            if (!dr.iter)
+                return FmNoMoreData;
+            if (!ChainMgrSetData (&it->cm, it->max_count, dr)) {
+                IterFree (dr.iter);
+                return FmNoMoreData;
+            }
             it->max_count++;
 
             return FmSuccess;
@@ -2108,7 +2328,13 @@ static FmStatus IterSetIterCount (Iter it, int num)
             if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL)
             {
                 dr.fi = FrameInstInit (it->template[1].data);
+                if (!dr.fi)
+                    return FmNoMoreData;
                 d = ChainMgrSetData (&it->cm, i, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+                    return FmNoMoreData;
+                }
             }
             /*endif*/
             if (FrameInstSetIterCount (d->fi, num) == FmSuccess)
@@ -2121,7 +2347,12 @@ static FmStatus IterSetIterCount (Iter it, int num)
             ExtraDataRec dr;
             
             dr.fi = FrameInstInit (it->template[1].data);
-            ChainMgrSetData (&it->cm, it->max_count, dr);
+            if (!dr.fi)
+                return FmNoMoreData;
+            if (!ChainMgrSetData (&it->cm, it->max_count, dr)) {
+                FrameInstFree (dr.fi);
+                return FmNoMoreData;
+            }
             it->max_count++;
 
             if (FrameInstSetIterCount (dr.fi, num) == FmSuccess)
@@ -2215,7 +2446,13 @@ static int IterGetTotalSize (Iter it)
             if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL)
             {
                 dr.fi = FrameInstInit (it->template[1].data);
+                if (!dr.fi)
+                    return NO_VALUE;
                 d = ChainMgrSetData (&it->cm, i, dr);
+                if (!d) {
+                    FrameInstFree (dr.fi);
+                    return NO_VALUE;
+                }
             }
             /*endif*/
             if ((num = FrameInstGetTotalSize (d->fi)) == NO_VALUE)
@@ -2278,8 +2515,8 @@ static ExtraData ChainMgrSetData (ChainMgr cm,
 {
     Chain cur = (Chain) Xmalloc (sizeof (ChainRec));
     if (!cur) {
-        fprintf (stderr, "(XIM-IMdkit) WARNING: malloc failed in %s:%d.\n",
-                 __FILE__, __LINE__);
+        fprintf (stderr, "(XIM-IMdkit) WARNING: malloc failed in %s:%s.\n",
+                 __FILE__, XIM_STRFUNC);
         return NULL;
     }
 
@@ -2445,6 +2682,7 @@ static int _FrameInstGetItemSize (FrameInst fi, int cu
             register int unit;
             register int number;
             register int size;
+            register int s;
             register int i;
 
             unit = _UNIT ((long) fi->template[cur_no].data);
@@ -2456,11 +2694,19 @@ static int _FrameInstGetItemSize (FrameInst fi, int cu
             {
                 assert (i >= 0);
                 i = _FrameInstDecrement (fi->template, i);
-                size += _FrameInstGetItemSize (fi, i);
+                s = _FrameInstGetItemSize (fi, i);
+                if (s == NO_VALUE) {
+                    size = NO_VALUE;
+                    number = 0;
+                    break;
+                } else {
+                    size += s;
+                }
                 number--;
             }
             /*endwhile*/
-            size = (unit - (size%unit))%unit;
+            if (size != NO_VALUE)
+                size = (unit - (size%unit))%unit;
             return size;
         }
 
