aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJessica Wagantall <jwagantall@cyngn.com>2016-04-05 12:00:18 -0700
committerJessica Wagantall <jwagantall@cyngn.com>2016-04-05 12:00:18 -0700
commitb77fab1265180e54ce5cb28969d93ec860c05322 (patch)
tree8a0f413d1f3614fb173b219c5eed891a250cbae6
parentf6c4d2c1197020d4fc32e48a9893ed6697b700a7 (diff)
parente61b304a4291a5f3bf2de0ae4c38a7d97172b8be (diff)
downloadandroid_external_dhcpcd-stable/cm-13.0-ZNH2K.tar.gz
android_external_dhcpcd-stable/cm-13.0-ZNH2K.tar.bz2
android_external_dhcpcd-stable/cm-13.0-ZNH2K.zip
Merge tag 'android-6.0.1_r24' into HEADstable/cm-13.0-ZNH2KBstable/cm-13.0-ZNH2K
Ticket: CYNGNOS-2213 Android 6.0.1 release 24
-rw-r--r--dhcp.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/dhcp.c b/dhcp.c
index bdd984f..b3f7cb1 100644
--- a/dhcp.c
+++ b/dhcp.c
@@ -271,21 +271,34 @@ valid_length(uint8_t option, int dl, int *type)
if (type)
*type = opt->type;
-
+ /* The size of RFC3442 and RFC5969 options is checked at a later
+ * stage in the code */
if (opt->type == 0 ||
opt->type & (STRING | RFC3442 | RFC5969))
return 0;
-
+ /* The code does not use SINT16 / SINT32 together with ARRAY.
+ * It is however far easier to reason about the code if all
+ * possible array elements are included, and also does not code
+ * any additional CPU resources. sizeof(uintXX_t) ==
+ * sizeof(intXX_t) can be assumed. */
sz = 0;
- if (opt->type & (UINT32 | IPV4))
+ if (opt->type & (UINT32 | SINT32 | IPV4))
sz = sizeof(uint32_t);
- if (opt->type & UINT16)
+ else if (opt->type & (UINT16 | SINT16))
sz = sizeof(uint16_t);
- if (opt->type & UINT8)
+ else if (opt->type & UINT8)
sz = sizeof(uint8_t);
- if (opt->type & (IPV4 | ARRAY))
- return dl % sz;
- return (dl == sz ? 0 : -1);
+ if (opt->type & ARRAY) {
+ /* The result of modulo zero is undefined. There are no
+ * options defined in this file that do not match one of
+ * the if-clauses above, so the following is not really
+ * necessary. However, to avoid confusion and unexpected
+ * behavior if the defined options are ever extended,
+ * returning false here seems sensible. */
+ if (!sz) return -1;
+ return (dl % sz == 0) ? 0 : -1;
+ }
+ return (sz == dl) ? 0 : -1;
}
/* unknown option, so let it pass */