(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
analyzer/
null-deref-pr108400-SoftEtherVPN-WebUi.c
       1  /* Reduced from SoftEtherVPN's src/Cedar/WebUI.c.   */
       2  
       3  #define NULL ((void *)0)
       4  typedef int (COMPARE)(void *p1, void *p2);
       5  typedef unsigned int UINT;
       6  typedef unsigned long int UINT64;
       7  typedef struct LIST LIST;
       8  typedef struct STRMAP_ENTRY STRMAP_ENTRY;
       9  typedef struct WEBUI
      10  {
      11  	/* [...snip...] */
      12  	LIST *Contexts;
      13  } WEBUI;
      14  
      15  typedef struct WU_CONTEXT
      16  {
      17  	/* [...snip...] */
      18  	UINT64 ExpireDate;
      19  } WU_CONTEXT;
      20  
      21  struct LIST
      22  {
      23  	/* [...snip...] */
      24  	UINT num_item, num_reserved;
      25  	void **p;
      26  	/* [...snip...] */
      27  };
      28  
      29  #define	LIST_DATA(o, i)		(((o) != NULL) ? ((o)->p[(i)]) : NULL)
      30  #define	LIST_NUM(o)			(((o) != NULL) ? (o)->num_item : 0)
      31  
      32  
      33  struct STRMAP_ENTRY
      34  {
      35  	char *Name;
      36  	void *Value;
      37  };
      38  
      39  void Free(void *addr);
      40  void Add(LIST *o, void *p);
      41  _Bool Delete(LIST *o, void *p);
      42  void LockList(LIST *o);
      43  void UnlockList(LIST *o);
      44  void ReleaseList(LIST *o);
      45  LIST *NewList(COMPARE *cmp);
      46  UINT64 Tick64();
      47  void WuFreeContext(WU_CONTEXT *context);
      48  
      49  void WuExpireSessionKey(WEBUI *wu)
      50  {
      51  	LIST *Expired = NewList(NULL);
      52  	UINT i;
      53  
      54  	LockList(wu->Contexts);
      55  
      56  	for(i=0; i<LIST_NUM(wu->Contexts); i++)
      57  	{
      58  		STRMAP_ENTRY *entry = (STRMAP_ENTRY*)LIST_DATA(wu->Contexts, i);
      59  		WU_CONTEXT *context = (WU_CONTEXT*)entry->Value; /* { dg-bogus "dereference of NULL 'entry'" "PR analyzer/108400" { xfail *-*-* } } */
      60  		if(context->ExpireDate < Tick64())
      61  		{
      62  			Add(Expired, entry);
      63  		}
      64  	}
      65  
      66  	for(i=0; i<LIST_NUM(Expired); i++)
      67  	{
      68  		STRMAP_ENTRY *entry = LIST_DATA(Expired, i);
      69  		Delete(wu->Contexts, entry);
      70  		Free(entry->Name);
      71  		WuFreeContext(entry->Value);
      72  		Free(entry);
      73  	}
      74  	ReleaseList(Expired);
      75  
      76  	UnlockList(wu->Contexts);
      77  }