3
3
* is for IP V4 CIDR notation, but prepared for V6: just
4
4
* add the necessary bits where the comments indicate.
5
5
*
6
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.26 2000/11/10 20:13:25 tgl Exp $
6
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.27 2000/11/25 21:30:54 tgl Exp $
7
7
*
8
8
* Jon Postel RIP 16 Oct 1998
9
9
*/
@@ -418,7 +418,13 @@ network_broadcast(PG_FUNCTION_ARGS)
418
418
/* It's an IP V4 address: */
419
419
unsigned long mask = 0xffffffff ;
420
420
421
- mask >>= ip_bits (ip );
421
+ /* Shifting by 32 or more bits does not yield portable results,
422
+ * so don't try it.
423
+ */
424
+ if (ip_bits (ip ) < 32 )
425
+ mask >>= ip_bits (ip );
426
+ else
427
+ mask = 0 ;
422
428
423
429
ip_v4addr (dst ) = htonl (ntohl (ip_v4addr (ip )) | mask );
424
430
}
@@ -451,7 +457,13 @@ network_network(PG_FUNCTION_ARGS)
451
457
/* It's an IP V4 address: */
452
458
unsigned long mask = 0xffffffff ;
453
459
454
- mask <<= (32 - ip_bits (ip ));
460
+ /* Shifting by 32 or more bits does not yield portable results,
461
+ * so don't try it.
462
+ */
463
+ if (ip_bits (ip ) > 0 )
464
+ mask <<= (32 - ip_bits (ip ));
465
+ else
466
+ mask = 0 ;
455
467
456
468
ip_v4addr (dst ) = htonl (ntohl (ip_v4addr (ip )) & mask );
457
469
}
@@ -484,7 +496,13 @@ network_netmask(PG_FUNCTION_ARGS)
484
496
/* It's an IP V4 address: */
485
497
unsigned long mask = 0xffffffff ;
486
498
487
- mask <<= (32 - ip_bits (ip ));
499
+ /* Shifting by 32 or more bits does not yield portable results,
500
+ * so don't try it.
501
+ */
502
+ if (ip_bits (ip ) > 0 )
503
+ mask <<= (32 - ip_bits (ip ));
504
+ else
505
+ mask = 0 ;
488
506
489
507
ip_v4addr (dst ) = htonl (mask );
490
508
@@ -512,7 +530,13 @@ v4bitncmp(unsigned long a1, unsigned long a2, int bits)
512
530
{
513
531
unsigned long mask ;
514
532
515
- mask = (0xFFFFFFFFL << (32 - bits )) & 0xFFFFFFFFL ;
533
+ /* Shifting by 32 or more bits does not yield portable results,
534
+ * so don't try it.
535
+ */
536
+ if (bits > 0 )
537
+ mask = (0xFFFFFFFFL << (32 - bits )) & 0xFFFFFFFFL ;
538
+ else
539
+ mask = 0 ;
516
540
a1 = ntohl (a1 );
517
541
a2 = ntohl (a2 );
518
542
if ((a1 & mask ) < (a2 & mask ))
@@ -530,7 +554,13 @@ v4addressOK(unsigned long a1, int bits)
530
554
{
531
555
unsigned long mask ;
532
556
533
- mask = (0xFFFFFFFFL << (32 - bits )) & 0xFFFFFFFFL ;
557
+ /* Shifting by 32 or more bits does not yield portable results,
558
+ * so don't try it.
559
+ */
560
+ if (bits > 0 )
561
+ mask = (0xFFFFFFFFL << (32 - bits )) & 0xFFFFFFFFL ;
562
+ else
563
+ mask = 0 ;
534
564
a1 = ntohl (a1 );
535
565
if ((a1 & mask ) == a1 )
536
566
return true;
0 commit comments