[gnu.gdb.bug] null pointer dereferences in gdb-3.2

eirik@labs.labs.tek.com (Eirik Fuller) (07/28/89)

The enclosed diffs provide a workaround for gdb segmentation faults.
If there is supposed to be a guarantee that TYPE_FIELD_NAME etc are
non-nil, this guarantee sometimes fails; if appropriate, I can
probably send examples of how to make this happen.  If there is no
such guarantee, this might be the right fix.  In any case, I doubt
these patches break anything.

*** ../gdb-3.2/valops.c	Wed Jul  5 12:46:58 1989
--- valops.c	Mon Jul 17 14:56:56 1989
***************
*** 816,822
  	{
  	  for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--)
  	    {
! 	      if (!strcmp (TYPE_FIELD_NAME (t, i), name))
  		{
  		  found = 1;
  		  break;

--- 816,823 -----
  	{
  	  for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--)
  	    {
! 	      char *tfn = TYPE_FIELD_NAME (t, i);
! 	      if (tfn && !strcmp (tfn, name))
  		{
  		  found = 1;
  		  break;
***************
*** 846,852
  	{
  	  for (i = TYPE_NFN_FIELDS (t) - 1; i >= 0; --i)
  	    {
! 	      if (! strcmp (TYPE_FN_FIELDLIST_NAME (t, i), name))
  		{
  		  error ("use `info method' command to print value of method \"%s\"", name);
  		}

--- 847,854 -----
  	{
  	  for (i = TYPE_NFN_FIELDS (t) - 1; i >= 0; --i)
  	    {
! 	      char *tfn = TYPE_FN_FIELDLIST_NAME (t, i);
! 	      if (tfn && ! strcmp (tfn, name))
  		{
  		  error ("use `info method' command to print value of method \"%s\"", name);
  		}
***************
*** 886,892
  	{
  	  struct fn_field *f = TYPE_FN_FIELDLIST1 (t, i);
  
! 	  if (!strcmp (TYPE_FN_FIELDLIST_NAME (t, i), name))
  	    {
  	      int j;
  	      struct fn_field *f = TYPE_FN_FIELDLIST1 (t, i);

--- 888,895 -----
  	{
  	  struct fn_field *f = TYPE_FN_FIELDLIST1 (t, i);
  
! 	  char *tfn = TYPE_FN_FIELDLIST_NAME (t, i);
! 	  if (tfn && !strcmp (tfn, name))
  	    {
  	      int j;
  	      struct fn_field *f = TYPE_FN_FIELDLIST1 (t, i);
***************
*** 925,931
  	{
  	  for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--)
  	    {
! 	      if (!strcmp (TYPE_FIELD_NAME (t, i), name))
  		{
  		  found = 1;
  		  break;

--- 928,935 -----
  	{
  	  for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--)
  	    {
! 	      char *tfn = TYPE_FIELD_NAME (t, i);
! 	      if (tfn && !strcmp (tfn, name))
  		{
  		  found = 1;
  		  break;
***************
*** 1013,1019
      {
        for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--)
  	{
! 	  if (!strcmp (TYPE_FIELD_NAME (t, i), name))
  	    {
  	      return 1;
  	    }

--- 1017,1024 -----
      {
        for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--)
  	{
! 	  char *tfn = TYPE_FIELD_NAME (t, i);
! 	  if (tfn && !strcmp (tfn, name))
  	    {
  	      return 1;
  	    }
***************
*** 1038,1044
      {
        for (i = TYPE_NFN_FIELDS (t) - 1; i >= 0; --i)
  	{
! 	  if (!strcmp (TYPE_FN_FIELDLIST_NAME (t, i), name))
  	    return 1;
  	}
  

--- 1043,1050 -----
      {
        for (i = TYPE_NFN_FIELDS (t) - 1; i >= 0; --i)
  	{
! 	  char *tfn = TYPE_FN_FIELDLIST_NAME (t, i);
! 	  if (tfn && !strcmp (tfn, name))
  	    return 1;
  	}
  
***************
*** 1078,1084
      {
        for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--)
  	{
! 	  if (!strcmp (TYPE_FIELD_NAME (t, i), name))
  	    {
  	      if (TYPE_FIELD_PACKED (t, i))
  		error ("pointers to bitfield members not allowed");

--- 1084,1091 -----
      {
        for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--)
  	{
! 	  char *tfn = TYPE_FIELD_NAME (t, i);
! 	  if (tfn && !strcmp (tfn, name))
  	    {
  	      if (TYPE_FIELD_PACKED (t, i))
  		error ("pointers to bitfield members not allowed");
***************
*** 1115,1121
      {
        for (i = TYPE_NFN_FIELDS (t) - 1; i >= 0; --i)
  	{
! 	  if (!strcmp (TYPE_FN_FIELDLIST_NAME (t, i), name))
  	    {
  	      int j = TYPE_FN_FIELDLIST_LENGTH (t, i);
  	      struct fn_field *f = TYPE_FN_FIELDLIST1 (t, i);

--- 1122,1129 -----
      {
        for (i = TYPE_NFN_FIELDS (t) - 1; i >= 0; --i)
  	{
! 	  char *tfn = TYPE_FN_FIELDLIST_NAME (t, i);
! 	  if (tfn && !strcmp (tfn, name))
  	    {
  	      int j = TYPE_FN_FIELDLIST_LENGTH (t, i);
  	      struct fn_field *f = TYPE_FN_FIELDLIST1 (t, i);