0001-ifconfig-Sporadically-appearing-regression.patch 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. From 3de647c8548f30f882c6ad5088df9acdc8cda300 Mon Sep 17 00:00:00 2001
  2. From: Mats Erik Andersson <gnu@gisladisker.se>
  3. Date: Fri, 17 Jul 2015 23:02:37 +0200
  4. Subject: [PATCH 01/60] ifconfig: Sporadically appearing regression.
  5. Device flags are sometimes calculated before their
  6. query using SIOCGIFFLAGS. First observed on GNU/Hurd.
  7. ---
  8. ChangeLog | 9 +++++++++
  9. ifconfig/printif.c | 44 ++++++++++++++++++++++++++++++--------------
  10. 2 files changed, 39 insertions(+), 14 deletions(-)
  11. diff --git a/ChangeLog b/ChangeLog
  12. index ea184b09..7f799daa 100644
  13. --- a/ChangeLog
  14. +++ b/ChangeLog
  15. @@ -1,3 +1,12 @@
  16. +2015-07-17 Mats Erik Andersson <gnu@gisladisker.se>
  17. +
  18. + ifconfig: Sporadically appearing regression.
  19. + Device flags are sometimes calculated before their
  20. + query using SIOCGIFFLAGS. First observed on GNU/Hurd.
  21. +
  22. + * ifconfig/printif.c (fh_brdaddr_query, fh_dstaddr_query):
  23. + Execute ioctl(SIOCGIFFLAGS) before calculating UFLAGS.
  24. +
  25. 2015-05-27 Alfred M. Szmidt <ams@gnu.org>
  26. * Makefile.am (ACLOCAL_AMFLAGS): New variable.
  27. diff --git a/ifconfig/printif.c b/ifconfig/printif.c
  28. index 615a630a..a269a508 100644
  29. --- a/ifconfig/printif.c
  30. +++ b/ifconfig/printif.c
  31. @@ -719,24 +719,32 @@ fh_brdaddr_query (format_data_t form, int argc, char *argv[])
  32. # ifdef SIOCGIFFLAGS
  33. int f;
  34. int rev;
  35. - unsigned int uflags = (unsigned short) form->ifr->ifr_flags;
  36. + unsigned int uflags;
  37. -# ifdef ifr_flagshigh
  38. + f = if_nameztoflag ("BROADCAST", &rev);
  39. +
  40. + if (f == 0 || (ioctl (form->sfd, SIOCGIFFLAGS, form->ifr) < 0))
  41. + {
  42. + select_arg (form, argc, argv, 1);
  43. + return;
  44. + }
  45. +
  46. + uflags = (unsigned short) form->ifr->ifr_flags;
  47. +# ifdef ifr_flagshigh
  48. uflags |= (unsigned short) form->ifr->ifr_flagshigh << 16;
  49. -# endif /* ifr_flagshigh */
  50. +# endif /* ifr_flagshigh */
  51. - if (0 == (f = if_nameztoflag ("BROADCAST", &rev))
  52. - || (ioctl (form->sfd, SIOCGIFFLAGS, form->ifr) < 0)
  53. - || ((f & uflags) == 0))
  54. + if ((f & uflags) == 0)
  55. {
  56. select_arg (form, argc, argv, 1);
  57. return;
  58. }
  59. -# endif
  60. +# endif /* SIOCGIFFLAGS */
  61. +
  62. if (ioctl (form->sfd, SIOCGIFBRDADDR, form->ifr) >= 0)
  63. select_arg (form, argc, argv, 0);
  64. else
  65. -#endif
  66. +#endif /* SIOCGIFBRDADDR */
  67. select_arg (form, argc, argv, 1);
  68. }
  69. @@ -763,24 +771,32 @@ fh_dstaddr_query (format_data_t form, int argc, char *argv[])
  70. # ifdef SIOCGIFFLAGS
  71. int f;
  72. int rev;
  73. - unsigned int uflags = (unsigned short) form->ifr->ifr_flags;
  74. + unsigned int uflags;
  75. +
  76. + f = if_nameztoflag ("POINTOPOINT", &rev);
  77. + if (f == 0 || (ioctl (form->sfd, SIOCGIFFLAGS, form->ifr) < 0))
  78. + {
  79. + select_arg (form, argc, argv, 1);
  80. + return;
  81. + }
  82. +
  83. + uflags = (unsigned short) form->ifr->ifr_flags;
  84. # ifdef ifr_flagshigh
  85. uflags |= (unsigned short) form->ifr->ifr_flagshigh << 16;
  86. # endif /* ifr_flagshigh */
  87. - if (0 == (f = if_nameztoflag ("POINTOPOINT", &rev))
  88. - || (ioctl (form->sfd, SIOCGIFFLAGS, form->ifr) < 0)
  89. - || ((f & uflags) == 0))
  90. + if ((f & uflags) == 0)
  91. {
  92. select_arg (form, argc, argv, 1);
  93. return;
  94. }
  95. -# endif
  96. +# endif /* SIOCGIFFLAGS */
  97. +
  98. if (ioctl (form->sfd, SIOCGIFDSTADDR, form->ifr) >= 0)
  99. select_arg (form, argc, argv, 0);
  100. else
  101. -#endif
  102. +#endif /* SIOCGIFDSTADDR */
  103. select_arg (form, argc, argv, 1);
  104. }
  105. --
  106. 2.26.0.292.g33ef6b2f38