Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Ip4Dxe/Ip4Option.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (22 months ago)
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Ip4Dxe/Ip4Option.c
r85718 r99404 8 8 9 9 #include "Ip4Impl.h" 10 11 10 12 11 /** … … 25 24 BOOLEAN 26 25 Ip4OptionIsValid ( 27 IN UINT8 28 IN UINT32 29 IN BOOLEAN 26 IN UINT8 *Option, 27 IN UINT32 OptionLen, 28 IN BOOLEAN Rcvd 30 29 ) 31 30 { 32 UINT32 33 UINT32 34 UINT32 31 UINT32 Cur; 32 UINT32 Len; 33 UINT32 Point; 35 34 36 Cur 35 Cur = 0; 37 36 38 37 while (Cur < OptionLen) { 39 38 switch (Option[Cur]) { 40 case IP4_OPTION_NOP:41 Cur++;42 break;39 case IP4_OPTION_NOP: 40 Cur++; 41 break; 43 42 44 case IP4_OPTION_EOP:45 Cur = OptionLen;46 break;43 case IP4_OPTION_EOP: 44 Cur = OptionLen; 45 break; 47 46 48 case IP4_OPTION_LSRR:49 case IP4_OPTION_SSRR:50 case IP4_OPTION_RR:51 Len = Option[Cur + 1];52 Point = Option[Cur + 2];47 case IP4_OPTION_LSRR: 48 case IP4_OPTION_SSRR: 49 case IP4_OPTION_RR: 50 Len = Option[Cur + 1]; 51 Point = Option[Cur + 2]; 53 52 54 //55 // SRR/RR options are formatted as |Type|Len|Point|Ip1|Ip2|...56 //57 if ((OptionLen - Cur < Len) || (Len < 3) || ((Len - 3) % 4 != 0)) {58 return FALSE;59 }53 // 54 // SRR/RR options are formatted as |Type|Len|Point|Ip1|Ip2|... 55 // 56 if ((OptionLen - Cur < Len) || (Len < 3) || ((Len - 3) % 4 != 0)) { 57 return FALSE; 58 } 60 59 61 if ((Point > Len + 1) || (Point % 4 != 0)) {62 return FALSE;63 }60 if ((Point > Len + 1) || (Point % 4 != 0)) { 61 return FALSE; 62 } 64 63 65 // 66 // The Point must point pass the last entry if the packet is received 67 // by us. It must point to 4 if the packet is to be sent by us for 68 // source route option. 69 // 70 if ((Option[Cur] != IP4_OPTION_RR) && 71 ((Rcvd && (Point != Len + 1)) || (!Rcvd && (Point != 4)))) { 64 // 65 // The Point must point pass the last entry if the packet is received 66 // by us. It must point to 4 if the packet is to be sent by us for 67 // source route option. 68 // 69 if ((Option[Cur] != IP4_OPTION_RR) && 70 ((Rcvd && (Point != Len + 1)) || (!Rcvd && (Point != 4)))) 71 { 72 return FALSE; 73 } 72 74 73 return FALSE;74 }75 Cur += Len; 76 break; 75 77 76 Cur += Len;77 break;78 default: 79 Len = Option[Cur + 1]; 78 80 79 default: 80 Len = Option[Cur + 1]; 81 if ((OptionLen - Cur < Len) || (Len < 2)) { 82 return FALSE; 83 } 81 84 82 if ((OptionLen - Cur < Len) || (Len < 2)) { 83 return FALSE; 84 } 85 86 Cur = Cur + Len; 87 break; 85 Cur = Cur + Len; 86 break; 88 87 } 89 90 88 } 91 89 92 90 return TRUE; 93 91 } 94 95 92 96 93 /** … … 113 110 EFI_STATUS 114 111 Ip4CopyOption ( 115 IN UINT8 116 IN UINT32 117 IN BOOLEAN 118 IN OUT UINT8 *Buf, OPTIONAL119 IN OUT UINT32 112 IN UINT8 *Option, 113 IN UINT32 OptionLen, 114 IN BOOLEAN FirstFragment, 115 IN OUT UINT8 *Buf OPTIONAL, 116 IN OUT UINT32 *BufLen 120 117 ) 121 118 { 122 UINT8 123 UINT32 124 UINT32 125 UINT8 126 UINT32 119 UINT8 OptBuf[40]; 120 UINT32 Cur; 121 UINT32 Next; 122 UINT8 Type; 123 UINT32 Len; 127 124 128 125 ASSERT ((BufLen != NULL) && (OptionLen <= 40)); 129 126 130 Cur 131 Next 127 Cur = 0; 128 Next = 0; 132 129 133 130 while (Cur < OptionLen) { 134 Type 135 Len 131 Type = Option[Cur]; 132 Len = Option[Cur + 1]; 136 133 137 134 if (Type == IP4_OPTION_NOP) { … … 143 140 Next++; 144 141 Cur++; 145 146 142 } else if (Type == IP4_OPTION_EOP) { 147 143 // … … 149 145 // 150 146 break; 151 152 147 } else { 153 148 // 154 149 // don't copy options that is only valid for the first fragment 155 150 // 156 if (FirstFragment || ( Type & IP4_OPTION_COPY_MASK) != 0) {151 if (FirstFragment || ((Type & IP4_OPTION_COPY_MASK) != 0)) { 157 152 CopyMem (OptBuf + Next, Option + Cur, Len); 158 153 Next += Len;
Note:
See TracChangeset
for help on using the changeset viewer.