Hi Erik,<div id="yMail_cursorElementTracker_1612026031594"><br></div><div id="yMail_cursorElementTracker_1612026031755"><br></div><div id="yMail_cursorElementTracker_1612026031963">let's add devel to the thread.</div><div id="yMail_cursorElementTracker_1612026041791"><br></div><div id="yMail_cursorElementTracker_1612026041947">Best Regards,</div><div id="yMail_cursorElementTracker_1612026046278">Strahil Nikolov<br><br><div id="ymail_android_signature"><a id="ymail_android_signature_link" href="https://go.onelink.me/107872968?pid=InProduct&amp;c=Global_Internal_YGrowth_AndroidEmailSig__AndroidUsers&amp;af_wl=ym&amp;af_sub1=Internal&amp;af_sub2=Global_YGrowth&amp;af_sub3=EmailSignature">Sent from Yahoo Mail on Android</a></div> <br> <blockquote style="margin: 0 0 20px 0;"> <div style="font-family:Roboto, sans-serif; color:#6D00F6;"> <div>On Sat, Jan 30, 2021 at 14:40, Erik Jacobson</div><div>&lt;erik.jacobson@hpe.com&gt; wrote:</div> </div> <div style="padding: 10px 0 0 20px; margin: 10px 0 0 0; border-left: 1px solid #6D00F6;"> Hello team -<br><br>First, I wish to state that I know we are supposed to move to Ganesha.<br>We had a lot of trouble with Ganesha in the past with our workload and<br>we still owe trying the very latest version and working with the<br>community. Some of our use cases are complicated and require very large<br>clusters to test. Therefore, switching has remained elusive.<br>We still rely on Gluster NFS.<br><br>Gluster is now used as part of the solution in some of the largest<br>supercomputers in the world.<br><br>We encountered a problem with Gluster NFS handling of the exports file<br>in relation to how it computes access rights.<br><br>We have patched our build of Gluster with this fix. I'm not sure what<br>the final fix would be like, but I'm hoping what I paste below will<br>enable us to get a final fix in to the community.<br><br>This analysis and patch was developed by Dick Riegner when I asked for<br>his help on this problem. There were several others involved.<br><br>What follows is his analysis. I will then paste the patch we're using<br>now. We would be happy to test a new version of the fix if you like (so we<br>can remove our patch when we upgrade). What follows are Dick's words.<br><br><br>ANALYSIS<br>==============================================================================<br>Here is my Gluster debug output from its nfs.log file.&nbsp; The working case is<br>from a compute node client using the IP address 10.31.128.16, and the<br>failing case is from a client using the IP address 10.31.133.16.<br><br><br>Working case<br>------------<br>RJR01: gf_is_ip_in_net() Entered network is 10.31.128.0/18, ip_str is 10.31.128.16<br>RJR20: gf_is_ip_in_net() subnet is 18, net_str is 10.31.128.0, net_ip is 10.31.128.0<br>RJR40: gf_is_ip_in_net() Host byte order subnet_mask is 0003ffff, ip_buf is 10801f0a, net_ip_buf is 00801f0a<br>RJR42: gf_is_ip_in_net() Network byte order subnet_mask is ffff0300, ip_buf is 0a1f8010, net_ip_buf is 0a1f8000<br>RJR44: gf_is_ip_in_net() Network byte order shifted 14 host bits, ip_buf is 0000287e, net_ip_buf is 0000287e<br>RJR46: gf_is_ip_in_net() My result is 1<br>RJR99: gf_is_ip_in_net() Exiting result is 1<br><br><br>Failing Case<br>------------<br>RJR01: gf_is_ip_in_net() Entered network is 10.31.128.0/18, ip_str is 10.31.133.16<br>RJR20: gf_is_ip_in_net() subnet is 18, net_str is 10.31.128.0, net_ip is 10.31.128.0<br>RJR40: gf_is_ip_in_net() Host byte order subnet_mask is 0003ffff, ip_buf is 10851f0a, net_ip_buf is 00801f0a<br>RJR42: gf_is_ip_in_net() Network byte order subnet_mask is ffff0300, ip_buf is 0a1f8510, net_ip_buf is 0a1f8000<br>RJR44: gf_is_ip_in_net() Network byte order shifted 14 host bits, ip_buf is 0000287e, net_ip_buf is 0000287e<br>RJR46: gf_is_ip_in_net() My result is 1<br>RJR99: gf_is_ip_in_net() Exiting result is 0<br><br><br>Gluster function gf_is_ip_in_net() verifies a client's authorization to mount<br>an export by comparing the subnet address of the client with an allowed<br>subnet address.&nbsp; The comparison is made by masking the client IP<br>address and the allowed subnet address and permitting access when the<br>resulting subnets are equal.<br><br>The mask is an all-ones bit-string the length of the subnet.&nbsp; In this case,<br>the subnet is 18 bits and the subnet mask of 0x3ffff is in Little Endian<br>ordering used by the Intel x86_64 processor.<br><br><br>1)&nbsp; Analysis of the working case from client IP address 10.31.128.16<br><br>These addresses are in Little Endian order on an Intel x86_64 processor.<br><br>Client IP&nbsp; &nbsp; &nbsp; Subnet<br>Address&nbsp; &nbsp; &nbsp; &nbsp; Mask&nbsp; &nbsp; &nbsp; &nbsp;  Subnet<br>0x10801f0a&nbsp; &amp;&nbsp; 0x3ffff&nbsp; =&gt;&nbsp; 0x01f0a<br><br>Allowed<br>Subnet&nbsp; &nbsp; &nbsp; &nbsp;  Subnet<br>Address&nbsp; &nbsp; &nbsp; &nbsp; Mask&nbsp; &nbsp; &nbsp; &nbsp;  Subnet<br>0x00801f0a&nbsp; &amp;&nbsp; 0x3ffff&nbsp; =&gt;&nbsp; 0x01f0a<br><br>The resulting subnets are equal so Gluster allows the client to mount its<br>exports.<br><br><br>2)&nbsp; Analysis of the failing case from client IP address 10.31.133.16<br><br>These addresses are in Little Endian order on an Intel x86_64 processor.<br><br>Client IP&nbsp; &nbsp; &nbsp; Subnet<br>Address&nbsp; &nbsp; &nbsp; &nbsp; Mask&nbsp; &nbsp; &nbsp; &nbsp;  Subnet<br>0x10851f0a&nbsp; &amp;&nbsp; 0x3ffff&nbsp; =&gt;&nbsp; 0x11f0a<br><br>Allowed<br>Subnet&nbsp; &nbsp; &nbsp; &nbsp;  Subnet<br>Address&nbsp; &nbsp; &nbsp; &nbsp; Mask&nbsp; &nbsp; &nbsp; &nbsp;  Subnet<br>0x00801f0a&nbsp; &amp;&nbsp; 0x3ffff&nbsp; =&gt;&nbsp; 0x01f0a<br><br>The resulting subnets are not equal so Gluster does not allow the client to<br>mount its exports.<br><br>The comparison is incorrectly including the two lower-order bits from part<br>of the host portion of the client IP address (0x85) as part of the subnet.<br>The subnet comparison fails and the client is incorrectly denied access to<br>the Gluster exports.<br><br><br><br><br>PROPOSED FIX DESCRIPTION<br>==============================================================================<br>The fix for the incorrect access denied errors is to convert the client and<br>allowed subnet IP addresses from Host Byte Order (Little Endian)<br>format to Network Byte Order (Big Endian) format and then isolate their<br>subnets.&nbsp; This will ensure that the subnet and host parts of their IP<br>addresses do not overlap.&nbsp; Once their subnets are properly isolated,<br>the subnets can be properly compared.<br><br>The conversion from Host Byte Order to Network Byte Order is done by<br>calling the htonl() function.<br><br>A subnet mask is no longer used, but the subnet bit length is used to<br>isolate the subnet address.&nbsp; Once the IP addresses are converted to<br>Network Byte Order, they are shifted right to eliminate the host portion<br>of the address.&nbsp; The amount to shift is calculated by:<br><br>host_shift = 32 - subnet_bit_length<br><br>In this case, subnet_bit_length is 18 so host_shift is 14.<br><br>This leaves just the subnet values after the shift.&nbsp; If the subnets are<br>equal, the client is authorized to mount an export.<br><br><br>1)&nbsp; Fix for working case from client IP address 10.31.128.16<br><br>Client IP&nbsp; &nbsp; &nbsp;  Shift<br>Address&nbsp; &nbsp; &nbsp; &nbsp;  Right&nbsp; &nbsp; &nbsp; Subnet<br>0x0a1f8010&nbsp; &gt;&gt;&nbsp; 14&nbsp; &nbsp;  =&gt;&nbsp; 0x0000287e<br><br>Allowed<br>Subnet&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Shift<br>Address&nbsp; &nbsp; &nbsp; &nbsp;  Right&nbsp; &nbsp; &nbsp; Subnet<br>0x0a1f8000&nbsp; &gt;&gt;&nbsp; 14&nbsp; &nbsp;  =&gt;&nbsp; 0x0000287e<br><br>The resulting subnets are equal so Gluster allows the client to mount<br>its exports.<br><br><br>2)&nbsp; Fix for failing case from client IP address 10.31.133.16<br><br>Client IP&nbsp; &nbsp; &nbsp;  Shift<br>Address&nbsp; &nbsp; &nbsp; &nbsp;  Right&nbsp; &nbsp; &nbsp; Subnet<br>0x0a1f8510&nbsp; &gt;&gt;&nbsp; 14&nbsp; &nbsp;  =&gt;&nbsp; 0x0000287e<br><br>Allowed<br>Subnet&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Shift<br>Address&nbsp; &nbsp; &nbsp; &nbsp;  Right&nbsp; &nbsp; &nbsp; Subnet<br>0x0a1f8000&nbsp; &gt;&gt;&nbsp; 14&nbsp; &nbsp;  =&gt;&nbsp; 0x0000287e<br><br>The resulting subnets are equal so Gluster allows the client to mount<br>its exports.<br><br>I updated Gluster function gf_is_ip_in_net() to fix the mount access<br>denied errors seen by some compute node clients with large host<br>addresses.&nbsp; I also removed my debug code.<br><br><br><br>diff -ruNp -x '*~' glusterfs-7.2.orig/libglusterfs/src/common-utils.c glusterfs-7.2.new/libglusterfs/src/common-utils.c<br>--- glusterfs-7.2.orig/libglusterfs/src/common-utils.c&nbsp;&nbsp;&nbsp; 2020-01-15 11:43:53.748893825 -0600<br>+++ glusterfs-7.2.new/libglusterfs/src/common-utils.c&nbsp;&nbsp;&nbsp; 2021-01-27 12:24:01.659533006 -0600<br>@@ -2099,7 +2099,9 @@ gf_is_ip_in_net(const char *network, con<br> {<br>&nbsp; &nbsp;  unsigned long ip_buf = 0;<br>&nbsp; &nbsp;  unsigned long net_ip_buf = 0;<br>-&nbsp; &nbsp; unsigned long subnet_mask = 0;<br>+/* HPE */<br>+&nbsp; &nbsp; int host_shift = 0;<br>+/* HPE */<br>&nbsp; &nbsp;  int ret = -EINVAL;<br>&nbsp; &nbsp;  char *slash = NULL;<br>&nbsp; &nbsp;  char *net_ip = NULL;<br>@@ -2142,10 +2144,13 @@ gf_is_ip_in_net(const char *network, con<br>&nbsp; &nbsp; &nbsp; &nbsp;  goto out;<br>&nbsp; &nbsp;  }<br> <br>-&nbsp; &nbsp; /* Converts /x into a mask */<br>-&nbsp; &nbsp; subnet_mask = (1 &lt;&lt; atoi(subnet)) - 1;<br>-<br>-&nbsp; &nbsp; result = ((ip_buf &amp; subnet_mask) == (net_ip_buf &amp; subnet_mask));<br>+/* HPE */<br>+&nbsp; &nbsp; /* Calculate host portion bit shift to isolate subnet */<br>+&nbsp; &nbsp; host_shift = 32 - atoi(subnet);<br>+<br>+&nbsp; &nbsp; /* Compare subnets in Network Byte Order (Big Endian) */<br>+&nbsp; &nbsp; result = ((htonl(ip_buf) &gt;&gt; host_shift) == (htonl(net_ip_buf) &gt;&gt; host_shift));<br>+/* HPE */<br> out:<br>&nbsp; &nbsp;  return result;<br> }<br>________<br><br><br><br>Community Meeting Calendar:<br><br>Schedule -<br>Every 2nd and 4th Tuesday at 14:30 IST / 09:00 UTC<br>Bridge: <a href="https://meet.google.com/cpu-eiue-hvk" target="_blank">https://meet.google.com/cpu-eiue-hvk</a><br>Gluster-users mailing list<br><a ymailto="mailto:Gluster-users@gluster.org" href="mailto:Gluster-users@gluster.org">Gluster-users@gluster.org</a><br><a href="https://lists.gluster.org/mailman/listinfo/gluster-users" target="_blank">https://lists.gluster.org/mailman/listinfo/gluster-users</a><br> </div> </blockquote></div>