(toppers-users 4721) TINET 1.7のNULLポインタアクセスについて

H.Hata hgarb @ lowl.eek.jp
2018年 1月 17日 (水) 01:44:26 JST


阿部先生

お世話になっております。畑 尚志と申します。
TINETの設定で質問があります。

質問について:
 ASP用 TINET 1.7でechos4のサンプルをデフォルト設定でコンパイルすると
NULLポインタアクセスが検出されます。
該当箇所を調べたところ tinet/netinet/in4_subr.cのin_rtnewentry関数
で発生しているようです。

tinet/netinet/in4_subr.c

129 : T_IN4_RTENTRY *
130 : in_rtnewentry (uint8_t flags, uint32_t tmo)
131 : {
132 :   SYSTIM  now;
133 :   T_IN4_RTENTRY   *rt, *frt = NULL;
         .
         . (省略)
         .
150 :/* 空きがなければ、有効時間がもっとも短いエントリを空きにする。*/
151 :   T_IN4_RTENTRY	*srt = NULL;
152 :   int_t		diff, sdiff = INT_MAX;
153 :
154 :   syscall(wai_sem(SEM_IN4_ROUTING_TBL));
155 :   for (ix = NUM_IN4_STATIC_ROUTE_ENTRY; ix < NUM_IN4_ROUTE_ENTRY; ix ++) {
156 :       rt = &routing4_tbl[ix];
157 :       diff = (int_t)(rt->expire - now);
158 :       if (diff <= 0) {	/* rt->expire <= now */
159 :                       /* 既に、有効時間が過ぎている。*/
160 :                       frt = rt;
161 :                       break;
162 :                      }
163 :       else if (diff < sdiff) {
164 :            srt = rt;
165 :            sdiff = diff;
166 :       }
167 :   }
168 :   if (frt == NULL)
169 :       frt = srt;
170 :   frt->flags = 0;
171 :   syscall(sig_sem(SEM_IN4_ROUTING_TBL));
172 :   }
173 :
174 : frt->flags  = (uint8_t)(flags | IN_RTF_DEFINED);
175 : frt->expire = now + tmo / SYSTIM_HZ;
176 : return frt;

 echos4の初期設定でコンパイルした場合155行目のfor文の条件が常に成立しない
ため最適化で削除され、170行目のfrt->flagsがNULLポインタアクセスになるよう
です。
 NUM_IN4_STATIC_ROUTE_ENTRY、NUM_IN4_ROUTE_ENTRYに関する設定に問題があり
そうなのですが必要な設定等あるでしょうか?


質問の背景:
  rx-elf-gcc 7.2.0+newlibの環境でTINET1.7をコンパイルするとkill、_exit等の
OS依存の関数がリンクされエラー終了します。
 調査のため実行ファイルを逆アセンブルすると、NULLポインタアクセスのあとに
ソースコードに無いabortが挿入されている事がわかりました。どうも最近のgccは
NULLポインタアクセスを検出するとabortを挿入するようです。
 OS依存の関数がリンクされるとnewlib_stubが必要になるためabortの除去を行い
たいです。

08002247 <__tinet_in_rtnewentry>:
   .
   .
   .
08002279 <.LM18>:
 8002279: 74 0e ff ff ff 7f  cmp #0x7fffffff, r14
 800227f: 21 2d              bne.b 80022ac <.LM29>

08002281 <.LM19>:
 8002281: 66 07              mov.l #0, r7
 8002283: 84 77              mov.b r7, 16[r7]  ; NULL ポインタアクセス
 8002285: 05 92 dd ff        bsr.a 8000017 <_abort> ; abort挿入

以上、よろしくお願いします。
-- 
H.Hata <hgarb @ lowl.eek.jp>